-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Description
as always, I apologize if this falls into one of the categories of "that's expected, because what if you did this?" and/or "this is a known mypy limitation / issue number", this one does not have a great workaround since I'd have to "type:ignore" the class def itself, or have to add redundant attributes everywhere, and I will likely just re-organize the code to not have this particular issue.
mypy --version
mypy 0.950+dev.0fecec8c72605ec7bae343b28d545c477c726e81 (compiled: no)
Here's the demo - ImplementsWOMixin and ImplementsWMixin are basically the same class except one of them has an extra entry in its __bases__. mypy then decides that a local attribute that returns str instead of Optional[str] is no longer compatible with the base class:
from typing import Optional
class Base:
description: Optional[str]
class MixinWDesc:
description: str
class SubClass(MixinWDesc, Base):
description: str
class SomeOtherMixin:
pass
# succeeds
class ImplementsWOMixin(SubClass):
pass
# fails
class ImplementsWMixin(SomeOtherMixin, SubClass):
passoutput - it complains about MixinWDesc, but the line number is that of the ImplementsWMixin class itself, meaning every class that subclasses MixinWDesc and uses other mixins would need workarounds or type:ignores.
$ mypy test3.py
test3.py:26: error: Definition of "description" in base class "MixinWDesc" is incompatible with definition in base class "Base" [misc]
Found 1 error in 1 file (checked 1 source file)