blob: 1e87e441dea28f10a1e9854ac5e68455cf4ff9cf [file] [log] [blame] [edit]
[case testAssignmentOnClass]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
A.x = 2
[case testAssignmentOnInstance]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
A().x = 2
[out]
main:4: error: Cannot assign to class variable "x" via instance
[case testAssignmentOnSubclassInstance]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B(A):
pass
B().x = 2
[out]
main:6: error: Cannot assign to class variable "x" via instance
[case testOverrideOnSelf]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
def __init__(self) -> None:
self.x = 0
[out]
main:5: error: Cannot assign to class variable "x" via instance
[case testOverrideOnSelfInSubclass]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
class B(A):
def __init__(self) -> None:
self.x = 0
[out]
main:6: error: Cannot assign to class variable "x" via instance
[case testReadingFromInstance]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
A().x
reveal_type(A().x)
[out]
main:5: note: Revealed type is "builtins.int"
[case testReadingFromSelf]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
def __init__(self) -> None:
reveal_type(self.x)
[out]
main:5: note: Revealed type is "builtins.int"
[case testTypecheckSimple]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
y = A.x # type: int
[case testTypecheckWithUserType]
from typing import ClassVar
class A:
pass
class B:
x = A() # type: ClassVar[A]
[case testTypeCheckOnAssignment]
from typing import ClassVar
class A:
pass
class B:
pass
class C:
x = None # type: ClassVar[A]
C.x = B()
[out]
main:8: error: Incompatible types in assignment (expression has type "B", variable has type "A")
[case testTypeCheckWithOverridden]
from typing import ClassVar
class A:
pass
class B(A):
pass
class C:
x = A() # type: ClassVar[A]
C.x = B()
[case testRevealType]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
reveal_type(A.x)
[out]
main:4: note: Revealed type is "builtins.int"
[case testInfer]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
y = A.x
reveal_type(y)
[out]
main:5: note: Revealed type is "builtins.int"
[case testAssignmentOnUnion]
from typing import ClassVar, Union
class A:
x = None # type: int
class B:
x = None # type: ClassVar[int]
c = A() # type: Union[A, B]
c.x = 1
[out]
main:7: error: Cannot assign to class variable "x" via instance
[case testAssignmentOnInstanceFromType]
from typing import ClassVar, Type
class A:
x = None # type: ClassVar[int]
def f(a: Type[A]) -> None:
a().x = 0
[out]
main:5: error: Cannot assign to class variable "x" via instance
[case testAssignmentOnInstanceFromSubclassType]
from typing import ClassVar, Type
class A:
x = None # type: ClassVar[int]
class B(A):
pass
def f(b: Type[B]) -> None:
b().x = 0
[out]
main:7: error: Cannot assign to class variable "x" via instance
[case testClassVarWithList]
from typing import ClassVar, List
class A:
x = None # type: ClassVar[List[int]]
A.x = ['a']
A().x.append(1)
A().x.append('')
[builtins fixtures/list.pyi]
[out]
main:4: error: List item 0 has incompatible type "str"; expected "int"
main:6: error: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
[case testClassVarWithUnion]
from typing import ClassVar, Union
class A:
x = None # type: ClassVar[Union[int, str]]
class B:
pass
A.x = 0
A.x = 'a'
A.x = B()
reveal_type(A().x)
[out]
main:8: error: Incompatible types in assignment (expression has type "B", variable has type "Union[int, str]")
main:9: note: Revealed type is "Union[builtins.int, builtins.str]"
[case testOverrideWithNarrowedUnion]
from typing import ClassVar, Union
class A: pass
class B: pass
class C: pass
class D:
x = None # type: ClassVar[Union[A, B, C]]
class E(D):
x = None # type: ClassVar[Union[A, B]]
[case testOverrideWithExtendedUnion]
from typing import ClassVar, Union
class A: pass
class B: pass
class C: pass
class D:
x = None # type: ClassVar[Union[A, B]]
class E(D):
x = None # type: ClassVar[Union[A, B, C]]
[out]
main:8: error: Incompatible types in assignment (expression has type "Union[A, B, C]", base class "D" defined the type as "Union[A, B]")
[case testAssignmentToCallableRet]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
def f() -> A:
return A()
f().x = 0
[out]
main:6: error: Cannot assign to class variable "x" via instance
[case testOverrideWithIncomatibleType]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
class B(A):
x = None # type: ClassVar[str]
[out]
main:5: error: Incompatible types in assignment (expression has type "str", base class "A" defined the type as "int")
[case testOverrideWithNormalAttribute]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B(A):
x = 2 # type: int
[out]
main:5: error: Cannot override class variable (previously declared on base class "A") with instance variable
[case testOverrideWithAttributeWithClassVar]
from typing import ClassVar
class A:
x = 1 # type: int
class B(A):
x = 2 # type: ClassVar[int]
[out]
main:5: error: Cannot override instance variable (previously declared on base class "A") with class variable
[case testOverrideClassVarManyBases]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B:
x = 2 # type: int
class C(A, B):
x = 3 # type: ClassVar[int]
[out]
main:7: error: Cannot override instance variable (previously declared on base class "B") with class variable
[case testOverrideClassVarWithClassVar]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B(A):
x = 2 # type: ClassVar[int]
[case testOverrideClassVarWithImplicitClassVar]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B(A):
x = 2
[case testOverrideClassVarWithImplicitThenExplicit]
from typing import ClassVar
class A:
x = 1 # type: ClassVar[int]
class B(A):
x = 2
class C(B):
x = 3 # type: ClassVar[int]
[case testOverrideOnABCSubclass]
from abc import ABCMeta
from typing import ClassVar
class A(metaclass=ABCMeta):
x = None # type: ClassVar[int]
class B(A):
x = 0 # type: ClassVar[int]
[case testAcrossModules]
import m
reveal_type(m.A().x)
m.A().x = 0
[file m.py]
from typing import ClassVar
class A:
x = None # type: ClassVar[int]
[out]
main:2: note: Revealed type is "builtins.int"
main:3: error: Cannot assign to class variable "x" via instance
[case testClassVarWithGeneric]
from typing import ClassVar, Generic, TypeVar
T = TypeVar('T')
class A(Generic[T]):
x: ClassVar[T] # E: ClassVar cannot contain type variables
@classmethod
def foo(cls) -> T:
return cls.x # OK
A.x # E: Access to generic class variables is ambiguous
A.x = 1 # E: Access to generic class variables is ambiguous
A[int].x # E: Access to generic class variables is ambiguous
class Bad(A[int]):
pass
Bad.x # E: Access to generic class variables is ambiguous
class Good(A[int]):
x = 42
reveal_type(Good.x) # N: Revealed type is "builtins.int"
[builtins fixtures/classmethod.pyi]
[case testClassVarWithNestedGeneric]
from typing import ClassVar, Generic, Tuple, TypeVar, Union, Type
T = TypeVar('T')
U = TypeVar('U')
class A(Generic[T, U]):
x: ClassVar[Union[T, Tuple[U, Type[U]]]] # E: ClassVar cannot contain type variables
@classmethod
def foo(cls) -> Union[T, Tuple[U, Type[U]]]:
return cls.x # OK
A.x # E: Access to generic class variables is ambiguous
A.x = 1 # E: Access to generic class variables is ambiguous
A[int, str].x # E: Access to generic class variables is ambiguous
class Bad(A[int, str]):
pass
Bad.x # E: Access to generic class variables is ambiguous
class Good(A[int, str]):
x = 42
reveal_type(Good.x) # N: Revealed type is "builtins.int"
[builtins fixtures/classmethod.pyi]
[case testSuggestClassVarOnTooFewArgumentsMethod]
from typing import Callable
class C:
foo: Callable[[C], int]
c:C
c.foo() # E: Too few arguments \
# N: "foo" is considered instance variable, to make it class variable use ClassVar[...]