-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Bug Report
Consider (https://mypy-play.net/?mypy=latest&python=3.12&gist=8afb9e0642a24aad8c26f3d22045ce18)
from typing import ClassVar
class Base:
x : ClassVar[tuple[str, ...]] = ()
class Concrete(Base):
x = ("foo",)
class Derived(Concrete):
x = ("foo", "bar")
reveal_type(Base.x) # -> tuple[str, ...]
reveal_type(Concrete.x) # -> tuple[str]
reveal_type(Derived.x) # -> errorSo I have a base class with a class attribute of type tuple[str, ...], I expect that deriving from this base class and assigning a concrete value should be fine.
However, mypy narrows the type of Concrete.x to tuple[str], and then if I try and derive from Concrete, tuple[str, str] is incompatible with tuple[str], so I can't assign a two-tuple to the class attribute in Derived.
Now, if the type of x really were tuple[str], this would be fine. But I think I've explicitly said "it's a tuple of any length", and both ("foo",) and ("foo", "bar") satisfy is-a tuple[str, ...].
Expected Behavior
I expect mypy to use the type annotation I've provided on the base class, and maintain that the type of x is always tuple[str, ...].
Output
main.py:10: error: Incompatible types in assignment (expression has type "tuple[str, str]", base class "Concrete" defined the type as "tuple[str]") [assignment]
main.py:13: note: Revealed type is "builtins.tuple[builtins.str, ...]"
main.py:14: note: Revealed type is "tuple[builtins.str]"
main.py:15: error: Cannot determine type of "x" [has-type]
main.py:15: note: Revealed type is "Any"
Found 2 errors in 1 file (checked 1 source file)