| [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] |