| -- Test cases for warning generation. |
| |
| -- Redundant casts |
| -- --------------- |
| |
| [case testRedundantCast] |
| # flags: --warn-redundant-casts |
| from typing import cast |
| a = 1 |
| b = cast(str, a) |
| c = cast(int, a) |
| [out] |
| main:5: error: Redundant cast to "int" |
| |
| [case testRedundantCastWithIsinstance] |
| # flags: --warn-redundant-casts |
| from typing import cast, Union |
| x = 1 # type: Union[int, str] |
| if isinstance(x, str): |
| cast(str, x) |
| [builtins fixtures/isinstance.pyi] |
| [out] |
| main:5: error: Redundant cast to "str" |
| |
| [case testCastToSuperclassNotRedundant] |
| # flags: --warn-redundant-casts |
| from typing import cast, TypeVar, List |
| T = TypeVar('T') |
| def add(xs: List[T], ys: List[T]) -> List[T]: pass |
| class A: pass |
| class B(A): pass |
| a = A() |
| b = B() |
| # Without the cast, the following line would fail to type check. |
| c = add([cast(A, b)], [a]) |
| [builtins fixtures/list.pyi] |
| |
| [case testCastToAnyTypeNotRedundant] |
| # flags: --warn-redundant-casts |
| from typing import cast, Any |
| a: Any |
| b = cast(Any, a) |
| [builtins fixtures/list.pyi] |
| |
| -- Unused 'type: ignore' comments |
| -- ------------------------------ |
| |
| [case testUnusedTypeIgnore] |
| # flags: --warn-unused-ignores |
| a = 1 |
| if int(): |
| a = 'a' # type: ignore |
| if int(): |
| a = 2 # type: ignore # E: Unused "type: ignore" comment |
| if int(): |
| a = 'b' # E: Incompatible types in assignment (expression has type "str", variable has type "int") |
| |
| [case testUnusedTypeIgnoreImport] |
| # flags: --warn-unused-ignores |
| import banana # type: ignore |
| import m # type: ignore |
| from m import * # type: ignore |
| [file m.py] |
| pass |
| [out] |
| main:3: error: Unused "type: ignore" comment |
| main:4: error: Unused "type: ignore" comment |
| |
| |
| -- No return |
| -- --------- |
| |
| [case testNoReturn] |
| # flags: --warn-no-return |
| def f() -> int: |
| pass |
| |
| def g() -> int: |
| if bool(): |
| return 1 |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: error: Missing return statement |
| |
| [case testNoReturnWhile] |
| # flags: --warn-no-return |
| def h() -> int: |
| while True: |
| if bool(): |
| return 1 |
| |
| def i() -> int: |
| while 1: |
| if bool(): |
| return 1 |
| if bool(): |
| break |
| |
| def j() -> int: |
| while 1: |
| if bool(): |
| return 1 |
| if bool(): |
| continue |
| [builtins fixtures/list.pyi] |
| [out] |
| main:7: error: Missing return statement |
| |
| [case testNoReturnExcept] |
| # flags: --warn-no-return |
| def f() -> int: |
| try: |
| return 1 |
| except: |
| pass |
| def g() -> int: |
| try: |
| pass |
| except: |
| return 1 |
| else: |
| return 1 |
| def h() -> int: |
| try: |
| pass |
| except: |
| pass |
| else: |
| pass |
| finally: |
| return 1 |
| [builtins fixtures/exception.pyi] |
| [out] |
| main:2: error: Missing return statement |
| |
| [case testNoReturnEmptyBodyWithDocstring] |
| def f() -> int: |
| """Return the number of peppers.""" |
| # This might be an @abstractmethod, for example |
| pass |
| [out] |
| |
| |
| -- Returning Any |
| -- ------------- |
| |
| [case testReturnAnyFromTypedFunction] |
| # flags: --warn-return-any |
| from typing import Any |
| def g() -> Any: pass |
| def f() -> int: return g() |
| [out] |
| main:4: error: Returning Any from function declared to return "int" |
| |
| [case testReturnAnyForNotImplementedInBinaryMagicMethods] |
| # flags: --warn-return-any |
| class A: |
| def __eq__(self, other: object) -> bool: return NotImplemented |
| [builtins fixtures/notimplemented.pyi] |
| [out] |
| |
| [case testReturnAnyForNotImplementedInNormalMethods] |
| # flags: --warn-return-any |
| class A: |
| def some(self) -> bool: return NotImplemented |
| [builtins fixtures/notimplemented.pyi] |
| [out] |
| main:3: error: Returning Any from function declared to return "bool" |
| |
| [case testReturnAnyFromTypedFunctionWithSpecificFormatting] |
| # flags: --warn-return-any |
| from typing import Any, Tuple |
| typ = Tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int, |
| int, int, int, int, int, int, int, int, int, int, int, int, int] |
| def g() -> Any: pass |
| def f() -> typ: return g() |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:11: error: Returning Any from function declared to return "Tuple[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int]" |
| |
| [case testReturnAnySilencedFromTypedFunction] |
| # flags: --warn-return-any |
| from typing import Any |
| def g() -> Any: pass |
| def f() -> int: |
| result = g() # type: int |
| return result |
| [out] |
| |
| [case testReturnAnyFromUntypedFunction] |
| # flags: --warn-return-any |
| from typing import Any |
| def g() -> Any: pass |
| def f(): return g() |
| [out] |
| |
| [case testReturnAnyFromAnyTypedFunction] |
| # flags: --warn-return-any |
| from typing import Any |
| def g() -> Any: pass |
| def f() -> Any: return g() |
| [out] |
| |
| [case testOKReturnAnyIfProperSubtype] |
| # flags: --warn-return-any --strict-optional |
| from typing import Any, Optional |
| |
| class Test(object): |
| |
| def __init__(self) -> None: |
| self.attr = "foo" # type: Any |
| |
| def foo(self, do_it: bool) -> Optional[Any]: |
| if do_it: |
| return self.attr # Should not warn here |
| else: |
| return None |
| [builtins fixtures/list.pyi] |
| [out] |
| |
| [case testReturnAnyDeferred] |
| # flags: --warn-return-any |
| def foo(a1: A) -> int: |
| if a1._x: |
| return 1 |
| n = 1 |
| return n |
| |
| class A: |
| def __init__(self, x: int) -> None: |
| self._x = x |