| [case testDecoratedClassLine] |
| def d(c): ... |
| @d |
| |
| class C: ... |
| class C: ... # E: Name "C" already defined on line 4 |
| |
| [case testDecoratedFunctionLine] |
| # flags: --disallow-untyped-defs |
| def d(f): ... # type: ignore |
| @d |
| |
| def f(): ... # E: Function is missing a return type annotation \ |
| # N: Use "-> None" if function does not return a value |
| |
| [case testIgnoreDecoratedFunction1] |
| # flags: --disallow-untyped-defs --warn-unused-ignores |
| def d(f): ... # type: ignore |
| @d |
| # type: ignore |
| def f(): ... # type: ignore # E: Unused "type: ignore" comment |
| |
| [case testIgnoreDecoratedFunction2] |
| # flags: --disallow-untyped-defs |
| def d(f): ... # type: ignore |
| @d |
| |
| def f(): ... # type: ignore |
| |
| [case testIgnoreScopeIssue1032] |
| def f(a: int): ... |
| f( |
| 1, |
| 2, |
| ) # type: ignore |
| |
| [case testIgnoreScopeNested1] |
| def g(x: str) -> str: ... |
| def f(a: int) -> int: ... |
| f( |
| f( |
| g( |
| "IGNORE" |
| ) # type: ignore |
| ) |
| ) |
| |
| [case testIgnoreScopeNested2] |
| [ |
| "IGNORE" # type: ignore |
| & |
| "IGNORE", |
| ] |
| [builtins fixtures/list.pyi] |
| |
| [case testIgnoreScopeNested3] |
| { |
| "IGNORE" |
| | # type: ignore |
| "IGNORE", |
| } |
| [builtins fixtures/set.pyi] |
| |
| [case testIgnoreScopeNested4] |
| { |
| None: "IGNORE" |
| ^ |
| "IGNORE", # type: ignore |
| } |
| [builtins fixtures/dict.pyi] |
| |
| [case testIgnoreScopeNestedNonOverlapping] |
| def f(x: int): ... |
| def g(x: int): ... |
| ( |
| f("ERROR"), # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| g("IGNORE"), # type: ignore |
| f("ERROR"), # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| ) |
| [builtins fixtures/tuple.pyi] |
| |
| [case testIgnoreScopeNestedOverlapping] |
| def f(x: int): ... |
| def g(x: int): ... |
| ( |
| f("ERROR"), g( # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| "IGNORE" # type: ignore |
| ), f("ERROR"), # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| ) |
| [builtins fixtures/tuple.pyi] |
| |
| [case testIgnoreScopeUnused1] |
| # flags: --warn-unused-ignores |
| ( # type: ignore # E: Unused "type: ignore" comment |
| "IGNORE" # type: ignore # E: Unused "type: ignore" comment |
| + # type: ignore # E: Unused "type: ignore" comment |
| 0 # type: ignore |
| ) # type: ignore # E: Unused "type: ignore" comment |
| [builtins fixtures/primitives.pyi] |
| |
| [case testIgnoreScopeUnused2] |
| # flags: --warn-unused-ignores |
| ( # type: ignore # E: Unused "type: ignore" comment |
| "IGNORE" |
| - # type: ignore |
| 0 # type: ignore # E: Unused "type: ignore" comment |
| ) # type: ignore # E: Unused "type: ignore" comment |
| |
| [case testIgnoreScopeUnused3] |
| # flags: --warn-unused-ignores |
| ( # type: ignore # E: Unused "type: ignore" comment |
| "IGNORE" |
| / |
| 0 # type: ignore |
| ) # type: ignore # E: Unused "type: ignore" comment |
| |
| [case testPEP570ArgTypesMissing] |
| # flags: --python-version 3.8 --disallow-untyped-defs |
| def f(arg, /) -> None: ... # E: Function is missing a type annotation for one or more arguments |
| |
| [case testPEP570ArgTypesBadDefault] |
| # flags: --python-version 3.8 |
| def f(arg: int = "ERROR", /) -> None: ... # E: Incompatible default for argument "arg" (default has type "str", argument has type "int") |
| |
| [case testPEP570ArgTypesDefault] |
| # flags: --python-version 3.8 |
| def f(arg: int = 0, /) -> None: |
| reveal_type(arg) # N: Revealed type is "builtins.int" |
| |
| [case testPEP570ArgTypesRequired] |
| # flags: --python-version 3.8 |
| def f(arg: int, /) -> None: |
| reveal_type(arg) # N: Revealed type is "builtins.int" |
| |
| [case testPEP570Required] |
| # flags: --python-version 3.8 |
| def f(arg: int, /) -> None: ... # N: "f" defined here |
| f(1) |
| f("ERROR") # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| f(arg=1) # E: Unexpected keyword argument "arg" for "f" |
| f(arg="ERROR") # E: Unexpected keyword argument "arg" for "f" |
| |
| [case testPEP570Default] |
| # flags: --python-version 3.8 |
| def f(arg: int = 0, /) -> None: ... # N: "f" defined here |
| f() |
| f(1) |
| f("ERROR") # E: Argument 1 to "f" has incompatible type "str"; expected "int" |
| f(arg=1) # E: Unexpected keyword argument "arg" for "f" |
| f(arg="ERROR") # E: Unexpected keyword argument "arg" for "f" |
| |
| [case testPEP570Calls] |
| # flags: --python-version 3.8 --no-strict-optional |
| from typing import Any, Dict |
| def f(p, /, p_or_kw, *, kw) -> None: ... # N: "f" defined here |
| d = None # type: Dict[Any, Any] |
| f(0, 0, 0) # E: Too many positional arguments for "f" |
| f(0, 0, kw=0) |
| f(0, p_or_kw=0, kw=0) |
| f(p=0, p_or_kw=0, kw=0) # E: Unexpected keyword argument "p" for "f" |
| f(0, **d) |
| f(**d) # E: Missing positional argument "p_or_kw" in call to "f" |
| [builtins fixtures/dict.pyi] |
| |
| [case testPEP570Signatures1] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: float, /, p_or_kw: int, *, kw: str) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.float" |
| reveal_type(p_or_kw) # N: Revealed type is "builtins.int" |
| reveal_type(kw) # N: Revealed type is "builtins.str" |
| |
| [case testPEP570Signatures2] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: float = 0.0, /, p_or_kw: int = 0, *, kw: str) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.float" |
| reveal_type(p_or_kw) # N: Revealed type is "builtins.int" |
| reveal_type(kw) # N: Revealed type is "builtins.str" |
| |
| [case testPEP570Signatures3] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: float = 0.0, /, *, kw: int) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.float" |
| reveal_type(kw) # N: Revealed type is "builtins.int" |
| |
| [case testPEP570Signatures4] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: int = 0, /) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.int" |
| |
| [case testPEP570Signatures5] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: float, /, p_or_kw: int) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.float" |
| reveal_type(p_or_kw) # N: Revealed type is "builtins.int" |
| |
| [case testPEP570Signatures6] |
| # flags: --python-version 3.8 |
| def f(p1: bytes, p2: float, /) -> None: |
| reveal_type(p1) # N: Revealed type is "builtins.bytes" |
| reveal_type(p2) # N: Revealed type is "builtins.float" |
| |
| [case testPEP570Unannotated] |
| # flags: --python-version 3.8 |
| def f(arg, /): ... # N: "f" defined here |
| g = lambda arg, /: arg |
| def h(arg=0, /): ... # N: "h" defined here |
| i = lambda arg=0, /: arg |
| |
| f(1) |
| g(1) |
| h() |
| h(1) |
| i() |
| i(1) |
| f(arg=0) # E: Unexpected keyword argument "arg" for "f" |
| g(arg=0) # E: Unexpected keyword argument "arg" |
| h(arg=0) # E: Unexpected keyword argument "arg" for "h" |
| i(arg=0) # E: Unexpected keyword argument "arg" |
| |
| [case testWalrus] |
| # flags: --python-version 3.8 |
| from typing import NamedTuple, Optional, List |
| from typing_extensions import Final |
| |
| if a := 2: |
| reveal_type(a) # N: Revealed type is "builtins.int" |
| |
| while b := "x": |
| reveal_type(b) # N: Revealed type is "builtins.str" |
| |
| l = [y2 := 1, y2 + 2, y2 + 3] |
| reveal_type(y2) # N: Revealed type is "builtins.int" |
| reveal_type(l) # N: Revealed type is "builtins.list[builtins.int]" |
| |
| filtered_data = [y3 for x in l if (y3 := a) is not None] |
| reveal_type(filtered_data) # N: Revealed type is "builtins.list[builtins.int]" |
| reveal_type(y3) # N: Revealed type is "builtins.int" |
| |
| d = {'a': (a2 := 1), 'b': a2 + 1, 'c': a2 + 2} |
| reveal_type(d) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(a2) # N: Revealed type is "builtins.int" |
| |
| d2 = {(prefix := 'key_') + 'a': (start_val := 1), prefix + 'b': start_val + 1, prefix + 'c': start_val + 2} |
| reveal_type(d2) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(prefix) # N: Revealed type is "builtins.str" |
| reveal_type(start_val) # N: Revealed type is "builtins.int" |
| |
| filtered_dict = {k: new_v for k, v in [('a', 1), ('b', 2), ('c', 3)] if (new_v := v + 1) == 2} |
| reveal_type(filtered_dict) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(new_v) # N: Revealed type is "builtins.int" |
| |
| def f(x: int = (c := 4)) -> int: |
| if a := 2: |
| reveal_type(a) # N: Revealed type is "builtins.int" |
| |
| while b := "x": |
| reveal_type(b) # N: Revealed type is "builtins.str" |
| |
| x = (y := 1) + (z := 2) |
| reveal_type(x) # N: Revealed type is "builtins.int" |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| reveal_type(z) # N: Revealed type is "builtins.int" |
| |
| l = [y2 := 1, y2 + 2, y2 + 3] |
| reveal_type(y2) # N: Revealed type is "builtins.int" |
| reveal_type(l) # N: Revealed type is "builtins.list[builtins.int]" |
| |
| filtered_data = [y3 for x in l if (y3 := a) is not None] |
| reveal_type(filtered_data) # N: Revealed type is "builtins.list[builtins.int]" |
| reveal_type(y3) # N: Revealed type is "builtins.int" |
| |
| d = {'a': (a2 := 1), 'b': a2 + 1, 'c': a2 + 2} |
| reveal_type(d) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(a2) # N: Revealed type is "builtins.int" |
| |
| d2 = {(prefix := 'key_') + 'a': (start_val := 1), prefix + 'b': start_val + 1, prefix + 'c': start_val + 2} |
| reveal_type(d2) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(prefix) # N: Revealed type is "builtins.str" |
| reveal_type(start_val) # N: Revealed type is "builtins.int" |
| |
| filtered_dict = {k: new_v for k, v in [('a', 1), ('b', 2), ('c', 3)] if (new_v := v + 1) == 2} |
| reveal_type(filtered_dict) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" |
| reveal_type(new_v) # N: Revealed type is "builtins.int" |
| |
| # https://www.python.org/dev/peps/pep-0572/#exceptional-cases |
| (y4 := 3) |
| reveal_type(y4) # N: Revealed type is "builtins.int" |
| |
| y5 = (y6 := 3) |
| reveal_type(y5) # N: Revealed type is "builtins.int" |
| reveal_type(y6) # N: Revealed type is "builtins.int" |
| |
| f(x=(y7 := 3)) |
| reveal_type(y7) # N: Revealed type is "builtins.int" |
| |
| reveal_type((lambda: (y8 := 3) and y8)()) # N: Revealed type is "builtins.int" |
| y8 # E: Name "y8" is not defined |
| |
| y7 = 1.0 # E: Incompatible types in assignment (expression has type "float", variable has type "int") |
| if y7 := "x": # E: Incompatible types in assignment (expression has type "str", variable has type "int") |
| pass |
| |
| # Just make sure we don't crash on this sort of thing. |
| if NT := NamedTuple("NT", [("x", int)]): # E: "int" not callable |
| z2: NT # E: Variable "NT" is not valid as a type \ |
| # N: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases |
| |
| if Alias := int: # E: Function "Alias" could always be true in boolean context \ |
| # E: Function "int" could always be true in boolean context |
| z3: Alias # E: Variable "Alias" is not valid as a type \ |
| # N: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases |
| |
| if (reveal_type(y9 := 3) and # N: Revealed type is "Literal[3]?" |
| reveal_type(y9)): # N: Revealed type is "builtins.int" |
| reveal_type(y9) # N: Revealed type is "builtins.int" |
| |
| return (y10 := 3) + y10 |
| |
| reveal_type(c) # N: Revealed type is "builtins.int" |
| |
| def check_final() -> None: |
| x: Final = 3 |
| |
| if x := 4: # E: Cannot assign to final name "x" |
| pass |
| |
| def check_binder(x: Optional[int], y: Optional[int], z: Optional[int], a: Optional[int], |
| b: Optional[int]) -> None: |
| reveal_type(x) # N: Revealed type is "Union[builtins.int, None]" |
| |
| (x := 1) |
| reveal_type(x) # N: Revealed type is "builtins.int" |
| |
| if x or (y := 1): |
| reveal_type(y) # N: Revealed type is "Union[builtins.int, None]" |
| |
| if x and (y := 1): |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| if (a := 1) and x: |
| reveal_type(a) # N: Revealed type is "builtins.int" |
| |
| if (b := 1) or x: |
| reveal_type(b) # N: Revealed type is "builtins.int" |
| |
| if z := 1: |
| reveal_type(z) # N: Revealed type is "builtins.int" |
| |
| def check_partial() -> None: |
| x = None |
| if bool() and (x := 2): |
| pass |
| |
| reveal_type(x) # N: Revealed type is "Union[builtins.int, None]" |
| |
| def check_narrow(x: Optional[int], s: List[int]) -> None: |
| if (y := x): |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| if (y := x) is not None: |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| if (y := x) == 10: |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| if (y := x) in s: |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| if isinstance((y := x), int): |
| reveal_type(y) # N: Revealed type is "builtins.int" |
| |
| class AssignmentExpressionsClass: |
| x = (y := 1) + (z := 2) |
| reveal_type(z) # N: Revealed type is "builtins.int" |
| |
| l = [x2 := 1, 2, 3] |
| reveal_type(x2) # N: Revealed type is "builtins.int" |
| |
| def __init__(self) -> None: |
| reveal_type(self.z) # N: Revealed type is "builtins.int" |
| |
| l = [z2 := 1, z2 + 2, z2 + 3] |
| reveal_type(z2) # N: Revealed type is "builtins.int" |
| reveal_type(l) # N: Revealed type is "builtins.list[builtins.int]" |
| |
| filtered_data = [z3 for x in l if (z3 := 1) is not None] |
| reveal_type(filtered_data) # N: Revealed type is "builtins.list[builtins.int]" |
| reveal_type(z3) # N: Revealed type is "builtins.int" |
| |
| # Assignment expressions from inside the class should not escape the class scope. |
| reveal_type(x2) # E: Name "x2" is not defined # N: Revealed type is "Any" |
| reveal_type(z2) # E: Name "z2" is not defined # N: Revealed type is "Any" |
| |
| [builtins fixtures/isinstancelist.pyi] |
| |
| [case testWalrusConditionalTypeBinder] |
| # flags: --python-version 3.8 |
| from typing import Tuple, Union |
| from typing_extensions import Literal |
| |
| class Good: |
| @property |
| def is_good(self) -> Literal[True]: ... |
| |
| class Bad: |
| @property |
| def is_good(self) -> Literal[False]: ... |
| |
| def get_thing() -> Union[Good, Bad]: ... |
| |
| if (thing := get_thing()).is_good: |
| reveal_type(thing) # N: Revealed type is "__main__.Good" |
| else: |
| reveal_type(thing) # N: Revealed type is "__main__.Bad" |
| |
| def get_things() -> Union[Tuple[Good], Tuple[Bad]]: ... |
| |
| if (things := get_things())[0].is_good: |
| reveal_type(things) # N: Revealed type is "Tuple[__main__.Good]" |
| else: |
| reveal_type(things) # N: Revealed type is "Tuple[__main__.Bad]" |
| [builtins fixtures/list.pyi] |
| |
| [case testWalrusConditionalTypeCheck] |
| # flags: --python-version 3.8 |
| from typing import Optional |
| |
| maybe_str: Optional[str] |
| |
| if (is_str := maybe_str is not None): |
| reveal_type(is_str) # N: Revealed type is "Literal[True]" |
| reveal_type(maybe_str) # N: Revealed type is "builtins.str" |
| else: |
| reveal_type(is_str) # N: Revealed type is "Literal[False]" |
| reveal_type(maybe_str) # N: Revealed type is "None" |
| |
| reveal_type(maybe_str) # N: Revealed type is "Union[builtins.str, None]" |
| [builtins fixtures/bool.pyi] |
| |
| [case testWalrusConditionalTypeCheck2] |
| # flags: --python-version 3.8 |
| from typing import Optional |
| |
| maybe_str: Optional[str] |
| |
| if (x := maybe_str) is not None: |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| reveal_type(maybe_str) # N: Revealed type is "Union[builtins.str, None]" |
| else: |
| reveal_type(x) # N: Revealed type is "None" |
| reveal_type(maybe_str) # N: Revealed type is "Union[builtins.str, None]" |
| |
| reveal_type(maybe_str) # N: Revealed type is "Union[builtins.str, None]" |
| [builtins fixtures/bool.pyi] |
| |
| [case testWalrusPartialTypes] |
| # flags: --python-version 3.8 |
| from typing import List |
| |
| def check_partial_list() -> None: |
| if (x := []): # E: Need type annotation for "x" (hint: "x: List[<type>] = ...") |
| pass |
| |
| y: List[str] |
| if (y := []): |
| pass |
| |
| if (z := []): |
| z.append(3) |
| reveal_type(z) # N: Revealed type is "builtins.list[builtins.int]" |
| [builtins fixtures/list.pyi] |
| |
| [case testWalrusAssignmentAndConditionScopeForLiteral] |
| # flags: --warn-unreachable --python-version 3.8 |
| |
| if (x := 0): |
| reveal_type(x) # E: Statement is unreachable |
| else: |
| reveal_type(x) # N: Revealed type is "builtins.int" |
| |
| reveal_type(x) # N: Revealed type is "builtins.int" |
| |
| [case testWalrusAssignmentAndConditionScopeForProperty] |
| # flags: --warn-unreachable --python-version 3.8 |
| |
| from typing_extensions import Literal |
| |
| class PropertyWrapper: |
| @property |
| def f(self) -> str: ... |
| @property |
| def always_false(self) -> Literal[False]: ... |
| |
| wrapper = PropertyWrapper() |
| |
| if x := wrapper.f: |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| else: |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| |
| if y := wrapper.always_false: |
| reveal_type(y) # E: Statement is unreachable |
| else: |
| reveal_type(y) # N: Revealed type is "Literal[False]" |
| |
| reveal_type(y) # N: Revealed type is "Literal[False]" |
| [builtins fixtures/property.pyi] |
| |
| [case testWalrusAssignmentAndConditionScopeForFunction] |
| # flags: --warn-unreachable --python-version 3.8 |
| |
| from typing_extensions import Literal |
| |
| def f() -> str: ... |
| |
| if x := f(): |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| else: |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| |
| reveal_type(x) # N: Revealed type is "builtins.str" |
| |
| def always_false() -> Literal[False]: ... |
| |
| if y := always_false(): |
| reveal_type(y) # E: Statement is unreachable |
| else: |
| reveal_type(y) # N: Revealed type is "Literal[False]" |
| |
| reveal_type(y) # N: Revealed type is "Literal[False]" |
| |
| def always_false_with_parameter(x: int) -> Literal[False]: ... |
| |
| if z := always_false_with_parameter(5): |
| reveal_type(z) # E: Statement is unreachable |
| else: |
| reveal_type(z) # N: Revealed type is "Literal[False]" |
| |
| reveal_type(z) # N: Revealed type is "Literal[False]" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testWalrusExpr] |
| # flags: --python-version 3.8 |
| def func() -> None: |
| foo = Foo() |
| if x := foo.x: |
| pass |
| |
| class Foo: |
| def __init__(self) -> None: |
| self.x = 123 |
| |
| [case testWalrusTypeGuard] |
| # flags: --python-version 3.8 |
| from typing_extensions import TypeGuard |
| def is_float(a: object) -> TypeGuard[float]: pass |
| def main(a: object) -> None: |
| if is_float(x := a): |
| reveal_type(x) # N: Revealed type is "builtins.float" |
| reveal_type(a) # N: Revealed type is "builtins.object" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testWalrusRedefined] |
| # flags: --python-version 3.8 |
| def foo() -> None: |
| x = 0 |
| [x := x + y for y in [1, 2, 3]] |
| [builtins fixtures/dict.pyi] |
| |
| [case testWalrusUsedBeforeDef] |
| # flags: --python-version 3.8 |
| class C: |
| def f(self, c: 'C') -> None: pass |
| |
| (x := C()).f(y) # E: Cannot determine type of "y" # E: Name "y" is used before definition |
| (y := C()).f(y) |
| |
| [case testOverloadWithPositionalOnlySelf] |
| # flags: --python-version 3.8 |
| from typing import overload, Optional |
| |
| class Foo: |
| @overload |
| def f(self, a: str, /) -> None: ... |
| |
| @overload |
| def f(self, *, b: bool = False) -> None: ... |
| |
| def f(self, a: Optional[str] = None, /, *, b: bool = False) -> None: # E: Overloaded function implementation does not accept all possible arguments of signature 2 |
| ... |
| |
| class Bar: |
| @overload |
| def f(self, a: str, /) -> None: ... |
| |
| @overload # Notice `/` in sig below: |
| def f(self, /, *, b: bool = False) -> None: ... |
| |
| def f(self, a: Optional[str] = None, /, *, b: bool = False) -> None: |
| ... |
| [builtins fixtures/bool.pyi] |
| |
| [case testOverloadPositionalOnlyErrorMessage] |
| # flags: --python-version 3.8 |
| from typing import overload |
| |
| @overload |
| def foo(a: int, /): ... |
| @overload |
| def foo(a: str): ... |
| def foo(a): ... |
| |
| foo(a=1) |
| [out] |
| main:10: error: No overload variant of "foo" matches argument type "int" |
| main:10: note: Possible overload variants: |
| main:10: note: def foo(int, /) -> Any |
| main:10: note: def foo(a: str) -> Any |
| |
| [case testOverloadPositionalOnlyErrorMessageAllTypes] |
| # flags: --python-version 3.8 |
| from typing import overload |
| |
| @overload |
| def foo(a: int, /, b: int, *, c: int): ... |
| @overload |
| def foo(a: str, b: int, *, c: int): ... |
| def foo(a, b, *, c): ... |
| |
| foo(a=1) |
| [out] |
| main:10: error: No overload variant of "foo" matches argument type "int" |
| main:10: note: Possible overload variants: |
| main:10: note: def foo(int, /, b: int, *, c: int) -> Any |
| main:10: note: def foo(a: str, b: int, *, c: int) -> Any |
| |
| [case testOverloadPositionalOnlyErrorMessageMultiplePosArgs] |
| # flags: --python-version 3.8 |
| from typing import overload |
| |
| @overload |
| def foo(a: int, b: int, c: int, /, d: str): ... |
| @overload |
| def foo(a: str, b: int, c: int, d: str): ... |
| def foo(a, b, c, d): ... |
| |
| foo(a=1) |
| [out] |
| main:10: error: No overload variant of "foo" matches argument type "int" |
| main:10: note: Possible overload variants: |
| main:10: note: def foo(int, int, int, /, d: str) -> Any |
| main:10: note: def foo(a: str, b: int, c: int, d: str) -> Any |
| |
| [case testOverloadPositionalOnlyErrorMessageMethod] |
| # flags: --python-version 3.8 |
| from typing import overload |
| |
| class Some: |
| @overload |
| def foo(self, __a: int): ... |
| @overload |
| def foo(self, a: float, /): ... |
| @overload |
| def foo(self, a: str): ... |
| def foo(self, a): ... |
| |
| Some().foo(a=1) |
| [out] |
| main:13: error: No overload variant of "foo" of "Some" matches argument type "int" |
| main:13: note: Possible overload variants: |
| main:13: note: def foo(self, int, /) -> Any |
| main:13: note: def foo(self, float, /) -> Any |
| main:13: note: def foo(self, a: str) -> Any |
| |
| [case testOverloadPositionalOnlyErrorMessageClassMethod] |
| # flags: --python-version 3.8 |
| from typing import overload |
| |
| class Some: |
| @overload |
| @classmethod |
| def foo(cls, __a: int): ... |
| @overload |
| @classmethod |
| def foo(cls, a: float, /): ... |
| @overload |
| @classmethod |
| def foo(cls, a: str): ... |
| @classmethod |
| def foo(cls, a): ... |
| |
| Some.foo(a=1) |
| [builtins fixtures/classmethod.pyi] |
| [out] |
| main:17: error: No overload variant of "foo" of "Some" matches argument type "int" |
| main:17: note: Possible overload variants: |
| main:17: note: def foo(cls, int, /) -> Any |
| main:17: note: def foo(cls, float, /) -> Any |
| main:17: note: def foo(cls, a: str) -> Any |
| |
| [case testUnpackWithDuplicateNamePositionalOnly] |
| # flags: --python-version 3.8 |
| from typing_extensions import Unpack, TypedDict |
| |
| class Person(TypedDict): |
| name: str |
| age: int |
| def foo(name: str, /, **kwargs: Unpack[Person]) -> None: # Allowed |
| ... |
| [builtins fixtures/dict.pyi] |
| |
| [case testPossiblyUndefinedWithAssignmentExpr] |
| # flags: --python-version 3.8 --enable-error-code possibly-undefined |
| def f1() -> None: |
| d = {0: 1} |
| if int(): |
| x = 1 |
| |
| if (x := d[x]) is None: # E: Name "x" may be undefined |
| y = x |
| z = x |
| [builtins fixtures/dict.pyi] |
| |
| [case testNarrowOnSelfInGeneric] |
| from typing import Generic, TypeVar, Optional |
| |
| T = TypeVar("T", int, str) |
| |
| class C(Generic[T]): |
| x: Optional[T] |
| def meth(self) -> Optional[T]: |
| if (y := self.x) is not None: |
| reveal_type(y) |
| return None |
| [out] |
| main:9: note: Revealed type is "builtins.int" |
| main:9: note: Revealed type is "builtins.str" |
| |
| [case testTypeGuardWithPositionalOnlyArg] |
| # flags: --python-version 3.8 |
| from typing_extensions import TypeGuard |
| |
| def typeguard(x: object, /) -> TypeGuard[int]: |
| ... |
| |
| n: object |
| if typeguard(n): |
| reveal_type(n) |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:9: note: Revealed type is "builtins.int" |
| |
| [case testTypeGuardKeywordFollowingWalrus] |
| # flags: --python-version 3.8 |
| from typing import cast |
| from typing_extensions import TypeGuard |
| |
| def typeguard(x: object) -> TypeGuard[int]: |
| ... |
| |
| if typeguard(x=(n := cast(object, "hi"))): |
| reveal_type(n) |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:9: note: Revealed type is "builtins.int" |
| |
| [case testNoCrashOnAssignmentExprClass] |
| class C: |
| [(j := i) for i in [1, 2, 3]] # E: Assignment expression within a comprehension cannot be used in a class body |
| [builtins fixtures/list.pyi] |
| |
| [case testNarrowedVariableInNestedModifiedInWalrus] |
| from typing import Optional |
| |
| def walrus_with_nested_error(x: Optional[str]) -> None: |
| if x is None: |
| x = "a" |
| def nested() -> str: |
| return x # E: Incompatible return value type (got "Optional[str]", expected "str") |
| if x := None: |
| pass |
| nested() |
| |
| def walrus_with_nested_ok(x: Optional[str]) -> None: |
| if x is None: |
| x = "a" |
| def nested() -> str: |
| return x |
| if y := x: |
| pass |
| nested() |
| |
| [case testIgnoreWholeModule] |
| # flags: --warn-unused-ignores |
| # type: ignore |
| IGNORE # type: ignore |
| |
| [case testUnusedIgnoreVersionCheck] |
| # flags: --warn-unused-ignores |
| import sys |
| |
| if sys.version_info < (3, 6): |
| 42 # type: ignore |
| else: |
| 42 # type: ignore # E: Unused "type: ignore" comment |
| [builtins fixtures/ops.pyi] |
| |
| [case testDictExpressionErrorLocations] |
| # flags: --pretty |
| from typing import Dict |
| |
| other: Dict[str, str] |
| dct: Dict[str, int] = {"a": "b", **other} |
| [builtins fixtures/dict.pyi] |
| [out] |
| main:5: error: Dict entry 0 has incompatible type "str": "str"; expected "str": "int" |
| dct: Dict[str, int] = {"a": "b", **other} |
| ^~~~~~~~ |
| main:5: error: Unpacked dict entry 1 has incompatible type "Dict[str, str]"; expected "SupportsKeysAndGetItem[str, int]" |
| dct: Dict[str, int] = {"a": "b", **other} |
| ^~~~~ |