blob: a4e391f1372901f8e49400c95d0aa4a4d089f787 [file] [log] [blame] [edit]
[case testNewNamedTupleNoUnderscoreFields]
from typing import NamedTuple
class X(NamedTuple):
x: int
_y: int # E: NamedTuple field name cannot start with an underscore: _y
_z: int # E: NamedTuple field name cannot start with an underscore: _z
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleAccessingAttributes]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
x: X
x.x
x.y
x.z # E: "X" has no attribute "z"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleAttributesAreReadOnly]
from typing import NamedTuple
class X(NamedTuple):
x: int
x: X
x.x = 5 # E: Property "x" defined in "X" is read-only
x.y = 5 # E: "X" has no attribute "y"
class A(X): pass
a: A
a.x = 5 # E: Property "x" defined in "X" is read-only
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleCreateWithPositionalArguments]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
x = X(1, '2')
x.x
x.z # E: "X" has no attribute "z"
x = X(1) # E: Missing positional argument "y" in call to "X"
x = X(1, '2', 3) # E: Too many arguments for "X"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleShouldBeSingleBase]
from typing import NamedTuple
class A: ...
class X(NamedTuple, A): # E: NamedTuple should be a single base
pass
[builtins fixtures/tuple.pyi]
[case testCreateNewNamedTupleWithKeywordArguments]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
x = X(x=1, y='x')
x = X(1, y='x')
x = X(x=1, z=1) # E: Unexpected keyword argument "z" for "X"
x = X(y='x') # E: Missing positional argument "x" in call to "X"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleCreateAndUseAsTuple]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
x = X(1, 'x')
a, b = x
a, b, c = x # E: Need more than 2 values to unpack (3 expected)
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleWithItemTypes]
from typing import NamedTuple
class N(NamedTuple):
a: int
b: str
n = N(1, 'x')
s: str = n.a # E: Incompatible types in assignment (expression has type "int", \
variable has type "str")
i: int = n.b # E: Incompatible types in assignment (expression has type "str", \
variable has type "int")
x, y = n
if int():
x = y # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleConstructorArgumentTypes]
from typing import NamedTuple
class N(NamedTuple):
a: int
b: str
n = N('x', 'x') # E: Argument 1 to "N" has incompatible type "str"; expected "int"
n = N(1, b=2) # E: Argument "b" to "N" has incompatible type "int"; expected "str"
N(1, 'x')
N(b='x', a=1)
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleAsBaseClass]
from typing import NamedTuple
class N(NamedTuple):
a: int
b: str
class X(N):
pass
x = X(1, 2) # E: Argument 2 to "X" has incompatible type "int"; expected "str"
s = ''
i = 0
if int():
s = x.a # E: Incompatible types in assignment (expression has type "int", variable has type "str")
if int():
i, s = x
if int():
s, s = x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleSelfTypeWithNamedTupleAsBase]
from typing import NamedTuple
class A(NamedTuple):
a: int
b: str
class B(A):
def f(self, x: int) -> None:
self.f(self.a)
self.f(self.b) # E: Argument 1 to "f" of "B" has incompatible type "str"; expected "int"
i = 0
s = ''
if int():
i, s = self
i, i = self # E: Incompatible types in assignment (expression has type "str", \
variable has type "int")
[builtins fixtures/tuple.pyi]
[out]
[case testNewNamedTupleTypeReferenceToClassDerivedFrom]
from typing import NamedTuple
class A(NamedTuple):
a: int
b: str
class B(A):
def f(self, x: 'B') -> None:
i = 0
s = ''
if int():
self = x
i, s = x
i, s = x.a, x.b
i, s = x.a, x.a # E: Incompatible types in assignment (expression has type "int", \
variable has type "str")
i, i = self # E: Incompatible types in assignment (expression has type "str", \
variable has type "int")
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleSubtyping]
from typing import NamedTuple, Tuple
class A(NamedTuple):
a: int
b: str
class B(A): pass
a = A(1, '')
b = B(1, '')
t: Tuple[int, str]
if int():
b = a # E: Incompatible types in assignment (expression has type "A", variable has type "B")
if int():
a = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "A")
if int():
b = t # E: Incompatible types in assignment (expression has type "Tuple[int, str]", variable has type "B")
if int():
t = a
if int():
t = (1, '')
if int():
t = b
if int():
a = b
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleSimpleTypeInference]
from typing import NamedTuple, Tuple
class A(NamedTuple):
a: int
l = [A(1), A(2)]
a = A(1)
a = l[0]
(i,) = l[0]
i, i = l[0] # E: Need more than 1 value to unpack (2 expected)
l = [A(1)]
a = (1,) # E: Incompatible types in assignment (expression has type "Tuple[int]", \
variable has type "A")
[builtins fixtures/list.pyi]
[case testNewNamedTupleMissingClassAttribute]
from typing import NamedTuple
class MyNamedTuple(NamedTuple):
a: int
b: str
MyNamedTuple.x # E: "Type[MyNamedTuple]" has no attribute "x"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleEmptyItems]
from typing import NamedTuple
class A(NamedTuple):
...
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleForwardRef]
from typing import NamedTuple
class A(NamedTuple):
b: 'B'
class B: ...
a = A(B())
a = A(1) # E: Argument 1 to "A" has incompatible type "int"; expected "B"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleProperty36]
from typing import NamedTuple
class A(NamedTuple):
a: int
class B(A):
@property
def b(self) -> int:
return self.a
class C(B): pass
B(1).b
C(2).b
[builtins fixtures/property.pyi]
[case testNewNamedTupleAsDict]
from typing import NamedTuple, Any
class X(NamedTuple):
x: Any
y: Any
x: X
reveal_type(x._asdict()) # N: Revealed type is "builtins.dict[builtins.str, Any]"
[builtins fixtures/dict.pyi]
[case testNewNamedTupleReplaceTyped]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
x: X
reveal_type(x._replace()) # N: Revealed type is "Tuple[builtins.int, builtins.str, fallback=__main__.X]"
x._replace(x=5)
x._replace(y=5) # E: Argument "y" to "_replace" of "X" has incompatible type "int"; expected "str"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleFields]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
reveal_type(X._fields) # N: Revealed type is "Tuple[builtins.str, builtins.str]"
reveal_type(X._field_types) # N: Revealed type is "builtins.dict[builtins.str, Any]"
reveal_type(X._field_defaults) # N: Revealed type is "builtins.dict[builtins.str, Any]"
# In typeshed's stub for builtins.pyi, __annotations__ is `dict[str, Any]`,
# but it's inferred as `Mapping[str, object]` here due to the fixture we're using
reveal_type(X.__annotations__) # N: Revealed type is "typing.Mapping[builtins.str, builtins.object]"
[builtins fixtures/dict.pyi]
[case testNewNamedTupleUnit]
from typing import NamedTuple
class X(NamedTuple):
pass
x: X = X()
x._replace()
x._fields[0] # E: Tuple index out of range
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleJoinNamedTuple]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
class Y(NamedTuple):
x: int
y: str
reveal_type([X(3, 'b'), Y(1, 'a')]) # N: Revealed type is "builtins.list[Tuple[builtins.int, builtins.str]]"
[builtins fixtures/list.pyi]
[case testNewNamedTupleJoinTuple]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: str
reveal_type([(3, 'b'), X(1, 'a')]) # N: Revealed type is "builtins.list[Tuple[builtins.int, builtins.str]]"
reveal_type([X(1, 'a'), (3, 'b')]) # N: Revealed type is "builtins.list[Tuple[builtins.int, builtins.str]]"
[builtins fixtures/list.pyi]
[case testNewNamedTupleWithTooManyArguments]
from typing import NamedTuple
class X(NamedTuple):
x: int
y = z = 2 # E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]"
def f(self): pass
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleWithInvalidItems2]
import typing
class X(typing.NamedTuple):
x: int
y = 1 # E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]"
x.x: int # E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]"
z: str = 'z'
aa: int # E: Non-default NamedTuple fields cannot follow default fields
[builtins fixtures/list.pyi]
[case testNewNamedTupleWithoutTypesSpecified]
from typing import NamedTuple
class X(NamedTuple):
x: int
y = 2 # E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleWithNestedClass]
from typing import NamedTuple
class A(NamedTuple):
x: int
class B:
x: str
a: A
reveal_type(A.B) # N: Revealed type is "def () -> __main__.A.B"
b: A.B
reveal_type(b.x) # N: Revealed type is "builtins.str"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleWithNestedNamedTuple]
from typing import NamedTuple
class A(NamedTuple):
x: int
class B(NamedTuple):
x: str
y: int = 1
def method(self) -> int: ...
# Correct:
A(1)
A.B('a')
A.B('a', 2)
b: A.B
reveal_type(b.x) # N: Revealed type is "builtins.str"
reveal_type(b.y) # N: Revealed type is "builtins.int"
reveal_type(b.method()) # N: Revealed type is "builtins.int"
# Incorrect:
A.B() # E: Missing positional argument "x" in call to "B"
A.B(1, 'a') # E: Argument 1 to "B" has incompatible type "int"; expected "str" \
# E: Argument 2 to "B" has incompatible type "str"; expected "int"
[builtins fixtures/tuple.pyi]
[case testTypeUsingTypeCNamedTuple]
from typing import NamedTuple, Type
class N(NamedTuple):
x: int
y: str
def f(a: Type[N]):
a() # E: Missing positional arguments "x", "y" in call to "N"
[builtins fixtures/list.pyi]
[case testNewNamedTupleWithDefaults]
from typing import List, NamedTuple, Optional
class X(NamedTuple):
x: int
y: int = 2
reveal_type(X(1)) # N: Revealed type is "Tuple[builtins.int, builtins.int, fallback=__main__.X]"
reveal_type(X(1, 2)) # N: Revealed type is "Tuple[builtins.int, builtins.int, fallback=__main__.X]"
X(1, 'a') # E: Argument 2 to "X" has incompatible type "str"; expected "int"
X(1, z=3) # E: Unexpected keyword argument "z" for "X"
class HasNone(NamedTuple):
x: int
y: Optional[int] = None
reveal_type(HasNone(1)) # N: Revealed type is "Tuple[builtins.int, Union[builtins.int, None], fallback=__main__.HasNone]"
class Parameterized(NamedTuple):
x: int
y: List[int] = [1] + [2]
z: List[int] = []
reveal_type(Parameterized(1)) # N: Revealed type is "Tuple[builtins.int, builtins.list[builtins.int], builtins.list[builtins.int], fallback=__main__.Parameterized]"
Parameterized(1, ['not an int']) # E: List item 0 has incompatible type "str"; expected "int"
class Default:
pass
class UserDefined(NamedTuple):
x: Default = Default()
reveal_type(UserDefined()) # N: Revealed type is "Tuple[__main__.Default, fallback=__main__.UserDefined]"
reveal_type(UserDefined(Default())) # N: Revealed type is "Tuple[__main__.Default, fallback=__main__.UserDefined]"
UserDefined(1) # E: Argument 1 to "UserDefined" has incompatible type "int"; expected "Default"
[builtins fixtures/list.pyi]
[case testNewNamedTupleWithDefaultsStrictOptional]
from typing import List, NamedTuple, Optional
class HasNone(NamedTuple):
x: int
y: Optional[int] = None
reveal_type(HasNone(1)) # N: Revealed type is "Tuple[builtins.int, Union[builtins.int, None], fallback=__main__.HasNone]"
HasNone(None) # E: Argument 1 to "HasNone" has incompatible type "None"; expected "int"
HasNone(1, y=None)
HasNone(1, y=2)
class CannotBeNone(NamedTuple):
x: int
y: int = None # E: Incompatible types in assignment (expression has type "None", variable has type "int")
[builtins fixtures/list.pyi]
[case testNewNamedTupleWrongType]
from typing import NamedTuple
class X(NamedTuple):
x: int
y: int = 'not an int' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleErrorInDefault]
from typing import NamedTuple
class X(NamedTuple):
x: int = 1 + '1' # E: Unsupported left operand type for + ("int")
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleInheritance]
from typing import NamedTuple
class X(NamedTuple):
x: str
y: int = 3
class Y(X):
def method(self) -> str:
self.y
return self.x
reveal_type(Y('a')) # N: Revealed type is "Tuple[builtins.str, builtins.int, fallback=__main__.Y]"
Y(y=1, x='1').method()
class CallsBaseInit(X):
def __init__(self, x: str) -> None:
super().__init__(x) # E: Too many arguments for "__init__" of "object"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleWithMethods]
from typing import NamedTuple
class XMeth(NamedTuple):
x: int
def double(self) -> int:
return self.x
async def asyncdouble(self) -> int:
return self.x
class XRepr(NamedTuple):
x: int
y: int = 1
def __str__(self) -> str:
return 'string'
def __sub__(self, other: XRepr) -> int:
return 0
reveal_type(XMeth(1).double()) # N: Revealed type is "builtins.int"
_ = reveal_type(XMeth(1).asyncdouble()) # N: Revealed type is "typing.Coroutine[Any, Any, builtins.int]"
reveal_type(XMeth(42).x) # N: Revealed type is "builtins.int"
reveal_type(XRepr(42).__str__()) # N: Revealed type is "builtins.str"
reveal_type(XRepr(1, 2).__sub__(XRepr(3))) # N: Revealed type is "builtins.int"
[typing fixtures/typing-async.pyi]
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleOverloading]
from typing import NamedTuple, overload
class Overloader(NamedTuple):
x: int
@overload
def method(self, y: str) -> str: pass
@overload
def method(self, y: int) -> int: pass
def method(self, y):
return y
reveal_type(Overloader(1).method('string')) # N: Revealed type is "builtins.str"
reveal_type(Overloader(1).method(1)) # N: Revealed type is "builtins.int"
Overloader(1).method(('tuple',)) # E: No overload variant of "method" of "Overloader" matches argument type "Tuple[str]" \
# N: Possible overload variants: \
# N: def method(self, y: str) -> str \
# N: def method(self, y: int) -> int
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleMethodInheritance]
from typing import NamedTuple, TypeVar
T = TypeVar('T')
class Base(NamedTuple):
x: int
def copy(self: T) -> T:
reveal_type(self) # N: Revealed type is "T`-1"
return self
def good_override(self) -> int:
reveal_type(self) # N: Revealed type is "Tuple[builtins.int, fallback=__main__.Base]"
reveal_type(self[0]) # N: Revealed type is "builtins.int"
self[0] = 3 # E: Unsupported target for indexed assignment ("Base")
reveal_type(self.x) # N: Revealed type is "builtins.int"
self.x = 3 # E: Property "x" defined in "Base" is read-only
self[1] # E: Tuple index out of range
reveal_type(self[T]) # N: Revealed type is "builtins.int" \
# E: No overload variant of "__getitem__" of "tuple" matches argument type "object" \
# N: Possible overload variants: \
# N: def __getitem__(self, int, /) -> int \
# N: def __getitem__(self, slice, /) -> Tuple[int, ...]
return self.x
def bad_override(self) -> int:
return self.x
class Child(Base):
def new_method(self) -> int:
reveal_type(self) # N: Revealed type is "Tuple[builtins.int, fallback=__main__.Child]"
reveal_type(self[0]) # N: Revealed type is "builtins.int"
self[0] = 3 # E: Unsupported target for indexed assignment ("Child")
reveal_type(self.x) # N: Revealed type is "builtins.int"
self.x = 3 # E: Property "x" defined in "Base" is read-only
self[1] # E: Tuple index out of range
return self.x
def good_override(self) -> int:
return 0
def bad_override(self) -> str: # E: Return type "str" of "bad_override" incompatible with return type "int" in supertype "Base"
return 'incompatible'
def takes_base(base: Base) -> int:
return base.x
reveal_type(Base(1).copy()) # N: Revealed type is "Tuple[builtins.int, fallback=__main__.Base]"
reveal_type(Child(1).copy()) # N: Revealed type is "Tuple[builtins.int, fallback=__main__.Child]"
reveal_type(Base(1).good_override()) # N: Revealed type is "builtins.int"
reveal_type(Child(1).good_override()) # N: Revealed type is "builtins.int"
reveal_type(Base(1).bad_override()) # N: Revealed type is "builtins.int"
reveal_type(takes_base(Base(1))) # N: Revealed type is "builtins.int"
reveal_type(takes_base(Child(1))) # N: Revealed type is "builtins.int"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleIllegalNames]
from typing import Callable, NamedTuple
class XMethBad(NamedTuple):
x: int
def _fields(self): # E: Cannot overwrite NamedTuple attribute "_fields"
return 'no chance for this'
class MagicalFields(NamedTuple):
x: int
def __slots__(self) -> None: pass # E: Cannot overwrite NamedTuple attribute "__slots__"
def __new__(cls) -> MagicalFields: pass # E: Cannot overwrite NamedTuple attribute "__new__"
def _source(self) -> int: pass # E: Cannot overwrite NamedTuple attribute "_source"
__annotations__ = {'x': float} # E: NamedTuple field name cannot start with an underscore: __annotations__ \
# E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]" \
# E: Cannot overwrite NamedTuple attribute "__annotations__"
class AnnotationsAsAMethod(NamedTuple):
x: int
# This fails at runtime because typing.py assumes that __annotations__ is a dictionary.
def __annotations__(self) -> float: # E: Cannot overwrite NamedTuple attribute "__annotations__"
return 1.0
class ReuseNames(NamedTuple):
x: int
def x(self) -> str: # E: Name "x" already defined on line 22
return ''
def y(self) -> int:
return 0
y: str # E: Name "y" already defined on line 26
class ReuseCallableNamed(NamedTuple):
z: Callable[[ReuseNames], int]
def z(self) -> int: # E: Name "z" already defined on line 31
return 0
[builtins fixtures/dict.pyi]
[case testNewNamedTupleDocString]
from typing import NamedTuple
class Documented(NamedTuple):
"""This is a docstring."""
x: int
reveal_type(Documented.__doc__) # N: Revealed type is "builtins.str"
reveal_type(Documented(1).x) # N: Revealed type is "builtins.int"
class BadDoc(NamedTuple):
x: int
def __doc__(self) -> str:
return ''
reveal_type(BadDoc(1).__doc__()) # N: Revealed type is "builtins.str"
[builtins fixtures/tuple.pyi]
[case testNewNamedTupleClassMethod]
from typing import NamedTuple
class HasClassMethod(NamedTuple):
x: str
@classmethod
def new(cls, f: str) -> 'HasClassMethod':
reveal_type(cls) # N: Revealed type is "Type[Tuple[builtins.str, fallback=__main__.HasClassMethod]]"
reveal_type(HasClassMethod) # N: Revealed type is "def (x: builtins.str) -> Tuple[builtins.str, fallback=__main__.HasClassMethod]"
return cls(x=f)
[builtins fixtures/classmethod.pyi]
[case testNewNamedTupleStaticMethod]
from typing import NamedTuple
class HasStaticMethod(NamedTuple):
x: str
@staticmethod
def new(f: str) -> 'HasStaticMethod':
return HasStaticMethod(x=f)
[builtins fixtures/classmethod.pyi]
[case testNewNamedTupleProperty]
from typing import NamedTuple
class HasStaticMethod(NamedTuple):
x: str
@property
def size(self) -> int:
reveal_type(self) # N: Revealed type is "Tuple[builtins.str, fallback=__main__.HasStaticMethod]"
return 4
[builtins fixtures/property.pyi]
[case testTypingExtensionsNamedTuple]
from typing_extensions import NamedTuple
class Point(NamedTuple):
x: int
y: int
bad_point = Point('foo') # E: Missing positional argument "y" in call to "Point" \
# E: Argument 1 to "Point" has incompatible type "str"; expected "int"
point = Point(1, 2)
x, y = point
x = point.x
reveal_type(x) # N: Revealed type is "builtins.int"
reveal_type(y) # N: Revealed type is "builtins.int"
point.y = 6 # E: Property "y" defined in "Point" is read-only
[builtins fixtures/tuple.pyi]