You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fromdataclassesimportdataclass@dataclassclassFoo:
a: object@dataclassclassBar(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)
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:
fromdataclassesimportdataclass@dataclass(frozen=True)classFoo:
a: object@dataclass(frozen=True)classBar(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).
This error seems to only occur when running mypy with Python 3.13. Checking the same code with Python 3.12 produces no error for me (both locally and on the playground).
edit: this only occurring in Python 3.13 seems expected. The dataclass plugin only adds a __replace__ method to dataclass definitions when checking 3.13+:
…ne number (#18122)
Refs #18115
When a parameter type in a method override is incompatible with the
parameter type in the supertype definition, mypy emits an error using
the `Argument` node as the context.
However, sometimes the the `Argument` node doesn't have a line number
set, causing the error message to have no associated line number. This
happens with the `__replace__` methods created in the dataclass plugin,
which have line numbers set on the `FuncDef` nodes, but no line numbers
set on the individual argument nodes.
This PR fixes the missing line number in the error by falling-back to
the FuncDef line number when a line number isn't set on the `Argument`
node.
(As an alternative fix, we could add line numbers to the `Argument`
nodes in the dataclass plugin, but that looks like a more complicated
change since multiple methods would be affected).
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 mypythe 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:
(you could argue that the error is technically still correct because the generated
__replace__
method takes the constructor arguments in a contravariant position, butdataclasses.replace
is completely untyped anyway, so this additional safety has no benefit).related issue on pyright: microsoft/pyright#9351
The text was updated successfully, but these errors were encountered: