-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cannot determine consistent method resolution order (MRO) when inheriting from both MutableSequence
and list
#11427
Comments
I think mypy is doing the correct thing here based on the type information provided in typeshed. Pyright also emits the same error in this case. The problem appears to be due to a "lie" in the definition of the You may need to simply ignore the error in this case by using a |
I am afraid What happens is that once mypy have problems to detect the MRO any subsequent usage of objects from the Going for a Just as an example, by doing: class Array(Item, MutableSequence, list): # type: ignore
... The errors would still be: $ mypy example.py
example.py: note: In member "__init__" of class "Array":
example.py:12: error: Argument 1 to "__init__" of "Item" has incompatible type "Array"; expected "Item"
[arg-type]
Item.__init__(self, comment)
^
example.py:13: error: No overload variant of "__init__" of "list" matches argument types "Array",
"List[Any]" [call-overload]
list.__init__(self, values)
^
example.py:13: note: Possible overload variant:
example.py:13: note: def [_T] __init__(self, self: List[_T], iterable: Iterable[_T]) -> None
example.py:13: note: <1 more non-matching overload not shown>
Found 2 errors in 1 file (checked 1 source file) |
Ah yeah, that's a problem. Maybe the best fix is for mypy to build an MRO even if it's not consistent rather than forgetting the entire class hierarchy. This is what pyright does in this circumstance, and it appears to work fine, at least in this case. Other than the initial error (reporting the MRO consistency issue), subsequent uses of the class work fine. |
As reported in python/mypy#11427, a "white lie" in typeshed messes completely the type inference for classes inheriting from ``(MutableMapping, dict)`` and ``(MutableSequence, list)``. This is a workaround that results in useful type inference.
As reported in python/mypy#11427, a "white lie" in typeshed messes completely the type inference for classes inheriting from ``(MutableMapping, dict)`` and ``(MutableSequence, list)``. This is a workaround that results in useful type inference.
Bug Report
There are some scenarios where inheriting from
MutableSequence
and built-inlist
(in this exact order) is important. This is the case foratoml
andtomlkit
.However this results in a typecheck error with
mypy
:Cannot determine consistent method resolution order (MRO)
Please notice no runtime error is found.
To Reproduce
Consider the following simplified example (extracted from
atoml/tomlkit
):example.py
Expected Behavior
I would expect the MRO detected by mypy is exactly the same one given in runtime, i.e.:
Actual Behavior
During runtime the MRO is well defined and works as expected:
But
mypy
fails to detect it and get completely lost when checking theArray
class.Your Environment
None
mypy.ini
(and other config files):mypy.ini
Please notice that while this particular choice of inheritance is debatable, it is fundamental for the way
atoml
/tomlkit
work. We needMutableSequence
as a mixin to implement the custom logic, but we also want the objects to be considered lists, so the users can use the API transparently as if they were dealing with built-in objects (this is an important aspect of the design).The text was updated successfully, but these errors were encountered: