KEMBAR78
regression in 1.12.0: un-suppressable error with no line number when subtyping dataclass when field has incompatible subtype · Issue #18115 · python/mypy · GitHub
Skip to content

regression in 1.12.0: un-suppressable error with no line number when subtyping dataclass when field has incompatible subtype #18115

@DetachHead

Description

@DetachHead
from dataclasses import dataclass


@dataclass
class Foo:
    a: object


@dataclass
class Bar(Foo):
    a: int
main.py: error: Argument 1 of "__replace__" is incompatible with supertype "Foo"; supertype defines the argument type as "object"  [override]
main.py: note: This violates the Liskov substitution principle
main.py: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
Found 1 error in 1 file (checked 1 source file)

playground

this error has no line number and therefore cannot be ignored. this is a big problem because not being able to type:ignore the error is preventing us from updating mypy

the error also occurs when the dataclass is frozen, in which case the error is a false positive here because the type of the field should be considered covariant:

from dataclasses import dataclass


@dataclass(frozen=True)
class Foo:
    a: object


@dataclass(frozen=True)
class Bar(Foo):
    a: int

(you could argue that the error is technically still correct because the generated __replace__ method takes the constructor arguments in a contravariant position, but dataclasses.replace is completely untyped anyway, so this additional safety has no benefit).

related issue on pyright: microsoft/pyright#9351

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions