| [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" |
| ) |
| |
| [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" |
| ) |
| |
| [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 |
| |
| [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: --disallow-untyped-defs |
| def f(arg, /) -> None: ... # E: Function is missing a type annotation for one or more arguments |
| |
| [case testPEP570ArgTypesBadDefault] |
| def f(arg: int = "ERROR", /) -> None: ... # E: Incompatible default for argument "arg" (default has type "str", argument has type "int") |
| |
| [case testPEP570ArgTypesDefault] |
| def f(arg: int = 0, /) -> None: |
| reveal_type(arg) # N: Revealed type is 'builtins.int' |
| |
| [case testPEP570ArgTypesRequired] |
| def f(arg: int, /) -> None: |
| reveal_type(arg) # N: Revealed type is 'builtins.int' |
| |
| [case testPEP570Required] |
| 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] |
| 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] |
| def f(p, /, p_or_kw, *, kw) -> None: ... # N: "f" defined here |
| 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" |
| |
| [case testPEP570Signatures1] |
| 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] |
| 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] |
| 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] |
| 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] |
| 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] |
| 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 testWalrus] |
| # flags: --strict-optional |
| from typing import NamedTuple, Optional |
| 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' |
| |
| 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' |
| |
| # 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 |
| |
| if Alias := int: |
| z3: Alias # E: Variable "Alias" is not valid as a type |
| |
| return (y9 := 3) + y9 |
| |
| 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): |
| # TODO should just be int |
| # This is because in check_boolean_op in checkexpr.py we accept the right conditional |
| # within a binder frame context, so the types assigned in it are lost later. Perhaps |
| # we need to make find_isinstance_check() walrus-aware. |
| reveal_type(y) # N: Revealed type is 'Union[builtins.int, None]' |
| |
| 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_partial_list() -> None: |
| if (x := []): |
| x.append(3) |
| |
| reveal_type(x) # N: Revealed type is 'builtins.list[builtins.int]' |
| |
| [builtins fixtures/f_string.pyi] |