| [case testUnannotatedFunction] |
| # flags: --disallow-untyped-defs |
| def f(x): pass |
| [out] |
| main:2: error: Function is missing a type annotation |
| |
| [case testUnannotatedArgument] |
| # flags: --disallow-untyped-defs |
| def f(x) -> int: pass |
| [out] |
| main:2: error: Function is missing a type annotation for one or more arguments |
| |
| [case testNoArgumentFunction] |
| # flags: --disallow-untyped-defs |
| def f() -> int: pass |
| [out] |
| |
| [case testUnannotatedReturn] |
| # flags: --disallow-untyped-defs |
| def f(x: int): pass |
| [out] |
| main:2: error: Function is missing a return type annotation |
| |
| [case testUnannotatedReturnWithFastParser] |
| # flags: --disallow-untyped-defs |
| def f(x: int): pass |
| [out] |
| main:2: error: Function is missing a return type annotation |
| |
| [case testLambda] |
| # flags: --disallow-untyped-defs |
| lambda x: x |
| [out] |
| |
| [case testUntypedDef] |
| # flags: --disallow-untyped-defs |
| def f(): |
| 1 + "str" |
| [out] |
| main:2: error: Function is missing a return type annotation |
| main:2: note: Use "-> None" if function does not return a value |
| |
| [case testUnannotatedReturnWithOnlySelfArgument] |
| # flags: --disallow-untyped-defs |
| def f(self): pass |
| [out] |
| main:2: error: Function is missing a return type annotation |
| main:2: note: Use "-> None" if function does not return a value |
| |
| [case testUnannotatedReturnWithNontrivialReturn] |
| # flags: --disallow-untyped-defs |
| def f(): return 1 |
| [out] |
| main:2: error: Function is missing a return type annotation |
| |
| [case testUntypedAsyncDef] |
| # flags: --disallow-untyped-defs |
| async def f(): # E: Function is missing a return type annotation \ |
| # N: Use "-> None" if function does not return a value |
| pass |
| [builtins fixtures/async_await.pyi] |
| [typing fixtures/typing-medium.pyi] |
| |
| [case testAsyncUnannotatedArgument] |
| # flags: --disallow-untyped-defs |
| async def f(x) -> None: # E: Function is missing a type annotation for one or more arguments |
| pass |
| [builtins fixtures/async_await.pyi] |
| [typing fixtures/typing-async.pyi] |
| |
| [case testAsyncUnannotatedReturn] |
| # flags: --disallow-untyped-defs |
| from typing import Any |
| async def f(x: int): # E: Function is missing a return type annotation |
| pass |
| # Make sure explicit Any is allowed. |
| async def g(x: int) -> Any: |
| pass |
| [builtins fixtures/async_await.pyi] |
| [typing fixtures/typing-async.pyi] |
| |
| [case testDisallowUntypedDefsUntypedDecorator] |
| # flags: --disallow-untyped-decorators |
| def d(p): |
| return p |
| |
| @d # E: Untyped decorator makes function "f" untyped |
| def f(i: int) -> int: |
| return i |
| |
| [case testDisallowUntypedDecoratorsUnresolvedDecorator] |
| # flags: --disallow-untyped-decorators --ignore-missing-imports |
| from nonexistent import d |
| |
| @d # E: Untyped decorator makes function "f" untyped |
| def f(i: int) -> int: |
| return i |
| |
| [case testDisallowUntypedDecoratorUntypedDef] |
| # flags: --disallow-untyped-decorators |
| |
| def d(p): |
| return p |
| |
| @d # no error |
| def f(): pass |
| |
| [case testDisallowUntypedDecoratorsPartialFunction] |
| # flags: --disallow-untyped-decorators |
| |
| def d(p): |
| return p |
| |
| @d # E: Untyped decorator makes function "f" untyped |
| def f(x) -> None: pass |
| |
| @d # E: Untyped decorator makes function "g" untyped |
| def g(x, y: int): pass |
| |
| @d # E: Untyped decorator makes function "h" untyped |
| def h(x: int): pass |
| |
| [case testDisallowUntypedDecoratorsImpreciseDecorator] |
| # flags: --disallow-untyped-decorators |
| from typing import Any |
| |
| def d(p) -> Any: |
| return p |
| |
| @d # no error |
| def f() -> None: pass |
| |
| [case testDisallowUntypedDecoratorsMultipleDecorators] |
| # flags: --disallow-untyped-decorators |
| from typing import Any |
| |
| def d1(p): |
| return p |
| def d2(p): |
| return p |
| def d3(p) -> Any: |
| return p |
| |
| @d1 # E: Untyped decorator makes function "f" untyped |
| @d2 # E: Untyped decorator makes function "f" untyped |
| @d3 # no error |
| @d1 # E: Untyped decorator makes function "f" untyped |
| def f() -> None: pass |
| |
| [case testDisallowUntypedDecoratorsCallableInstance] |
| # flags: --disallow-untyped-decorators |
| from typing import Callable |
| |
| class TypedDecorator: |
| def __call__(self, c: Callable) -> Callable: |
| return function |
| |
| class UntypedDecorator: |
| def __call__(self, c): |
| return function |
| |
| @TypedDecorator() |
| def f() -> None: pass |
| |
| @UntypedDecorator() # E: Untyped decorator makes function "g" untyped |
| def g() -> None: pass |
| |
| @TypedDecorator() |
| @UntypedDecorator() # E: Untyped decorator makes function "h" untyped |
| def h() -> None: pass |
| |
| @UntypedDecorator() # E: Untyped decorator makes function "i" untyped |
| @TypedDecorator() |
| def i() -> None: pass |
| |
| reveal_type(f) # N: Revealed type is 'def (*Any, **Any) -> Any' |
| reveal_type(g) # N: Revealed type is 'Any' |
| reveal_type(h) # N: Revealed type is 'def (*Any, **Any) -> Any' |
| reveal_type(i) # N: Revealed type is 'Any' |
| |
| [case testDisallowUntypedDecoratorsNonCallableInstance] |
| # flags: --disallow-untyped-decorators |
| class Decorator: |
| pass |
| |
| @Decorator() # E: "Decorator" not callable |
| def f() -> None: pass |
| |
| [case testSubclassingAny] |
| # flags: --disallow-subclassing-any |
| from typing import Any |
| FakeClass = None # type: Any |
| class Foo(FakeClass): pass # E: Class cannot subclass 'FakeClass' (has type 'Any') |
| [out] |
| |
| [case testSubclassingAnyMultipleBaseClasses] |
| # flags: --disallow-subclassing-any |
| from typing import Any |
| FakeClass = None # type: Any |
| class ActualClass: pass |
| class Foo(ActualClass, FakeClass): pass # E: Class cannot subclass 'FakeClass' (has type 'Any') |
| [out] |
| |
| [case testSubclassingAnySilentImports] |
| # flags: --disallow-subclassing-any --follow-imports=skip |
| # cmd: mypy -m main |
| |
| [file main.py] |
| from ignored_module import BaseClass |
| class Foo(BaseClass): pass |
| |
| [file ignored_module.py] |
| class BaseClass: pass |
| |
| [out] |
| tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any') |
| |
| [case testSubclassingAnySilentImports2] |
| # flags: --disallow-subclassing-any --follow-imports=skip |
| # cmd: mypy -m main |
| |
| [file main.py] |
| import ignored_module |
| class Foo(ignored_module.BaseClass): pass |
| |
| [file ignored_module.py] |
| class BaseClass: pass |
| |
| [out] |
| tmp/main.py:2: error: Class cannot subclass 'BaseClass' (has type 'Any') |
| |
| [case testWarnNoReturnIgnoresTrivialFunctions] |
| # flags: --warn-no-return |
| def f() -> int: |
| pass |
| def g() -> int: |
| ... |
| def h() -> int: |
| """with docstring""" |
| pass |
| def i() -> int: |
| """with docstring""" |
| ... |
| def j() -> int: |
| u"""with unicode docstring""" |
| pass |
| def k() -> int: |
| """docstring only""" |
| |
| [case testWarnNoReturnWorksWithAlwaysTrue] |
| # flags: --warn-no-return |
| PY3 = True |
| def f() -> int: |
| if PY3: |
| return 0 |
| else: |
| return 0 |
| [builtins fixtures/bool.pyi] |
| |
| [case testWarnNoReturnWorksWithAlwaysFalse] |
| # flags: --warn-no-return |
| PY2 = False |
| def f() -> int: |
| if PY2: |
| return 0 |
| else: |
| return 0 |
| [builtins fixtures/bool.pyi] |
| |
| [case testWarnNoReturnWorksWithMypyTrue] |
| # flags: --warn-no-return |
| MYPY = False |
| def f() -> int: |
| if MYPY: |
| return 0 |
| else: |
| return 0 |
| [builtins fixtures/bool.pyi] |
| |
| [case testNoReturnDisallowsReturn] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| def f() -> NoReturn: |
| if bool(): |
| return 5 # E: Return statement in function which does not return |
| else: |
| return # E: Return statement in function which does not return |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnWithoutImplicitReturn] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| def no_return() -> NoReturn: pass |
| def f() -> NoReturn: |
| no_return() |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnDisallowsImplicitReturn] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| def f() -> NoReturn: # E: Implicit return in function which does not return |
| non_trivial_function = 1 |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnNoWarnNoReturn] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| def no_return() -> NoReturn: pass |
| def f() -> int: |
| if bool(): |
| return 0 |
| else: |
| no_return() |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnInExpr] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| def no_return() -> NoReturn: pass |
| def f() -> int: |
| return 0 |
| reveal_type(f() or no_return()) # N: Revealed type is 'builtins.int' |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnVariable] |
| # flags: --warn-no-return |
| from mypy_extensions import NoReturn |
| |
| x = 0 # type: NoReturn # E: Incompatible types in assignment (expression has type "int", variable has type "NoReturn") |
| [builtins fixtures/dict.pyi] |
| |
| [case testNoReturnImportFromTyping] |
| from typing import NoReturn |
| |
| def h() -> NoReturn: |
| if bool(): |
| return 5 # E: Return statement in function which does not return |
| else: |
| return # E: Return statement in function which does not return |
| |
| def no_return() -> NoReturn: pass |
| def f() -> NoReturn: |
| no_return() |
| |
| x: NoReturn = 0 # E: Incompatible types in assignment (expression has type "int", variable has type "NoReturn") |
| [builtins fixtures/dict.pyi] |
| |
| [case testShowErrorContextFunction] |
| # flags: --show-error-context |
| def f() -> None: |
| 0 + "" |
| [out] |
| main: note: In function "f": |
| main:3: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testShowErrorContextClass] |
| # flags: --show-error-context |
| class A: |
| 0 + "" |
| [out] |
| main: note: In class "A": |
| main:3: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testShowErrorContextMember] |
| # flags: --show-error-context |
| class A: |
| def f(self, x: int) -> None: |
| self.f("") |
| [out] |
| main: note: In member "f" of class "A": |
| main:4: error: Argument 1 to "f" of "A" has incompatible type "str"; expected "int" |
| |
| [case testShowErrorContextModule] |
| # flags: --show-error-context |
| import m |
| [file m.py] |
| 0 + "" |
| [out] |
| main:2: note: In module imported here: |
| tmp/m.py:1: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testShowErrorContextTopLevel] |
| # flags: --show-error-context |
| def f() -> None: |
| 0 + "" |
| 0 + "" |
| [out] |
| main: note: In function "f": |
| main:3: error: Unsupported operand types for + ("int" and "str") |
| main: note: At top level: |
| main:4: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testShowErrorContextFromHere] |
| # flags: --show-error-context |
| import a |
| [file a.py] |
| import b |
| [file b.py] |
| 0 + "" |
| [out] |
| tmp/a.py:1: note: In module imported here, |
| main:2: note: ... from here: |
| tmp/b.py:1: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testFollowImportsNormal] |
| # flags: --follow-imports=normal |
| from mod import x |
| x + "" |
| [file mod.py] |
| 1 + "" |
| x = 0 |
| [out] |
| tmp/mod.py:1: error: Unsupported operand types for + ("int" and "str") |
| main:3: error: Unsupported operand types for + ("int" and "str") |
| |
| [case testFollowImportsSilent] |
| # flags: --follow-imports=silent |
| from mod import x |
| x + "" # E: Unsupported operand types for + ("int" and "str") |
| [file mod.py] |
| 1 + "" |
| x = 0 |
| |
| [case testFollowImportsSilentTypeIgnore] |
| # flags: --warn-unused-ignores --follow-imports=silent |
| import mod |
| [file mod.py] |
| x = 3 # type: ignore |
| |
| [case testFollowImportsSkip] |
| # flags: --follow-imports=skip |
| from mod import x |
| x + "" |
| [file mod.py] |
| this deliberate syntax error will not be reported |
| [out] |
| |
| [case testFollowImportsError] |
| # flags: --follow-imports=error |
| from mod import x |
| x + "" |
| [file mod.py] |
| deliberate syntax error |
| [out] |
| main:2: error: Import of 'mod' ignored |
| main:2: note: (Using --follow-imports=error, module not passed on command line) |
| |
| [case testIgnoreMissingImportsFalse] |
| from mod import x |
| [out] |
| main:1: error: Cannot find implementation or library stub for module named "mod" |
| main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports |
| |
| [case testIgnoreMissingImportsTrue] |
| # flags: --ignore-missing-imports |
| from mod import x |
| [out] |
| |
| [case testPerFileIncompleteDefsBasic] |
| # flags: --config-file tmp/mypy.ini |
| import standard, incomplete |
| |
| [file standard.py] |
| def incomplete(x) -> int: |
| return 0 |
| [file incomplete.py] |
| def incomplete(x) -> int: # E: Function is missing a type annotation for one or more arguments |
| return 0 |
| [file mypy.ini] |
| \[mypy] |
| disallow_incomplete_defs = False |
| \[mypy-incomplete] |
| disallow_incomplete_defs = True |
| |
| |
| [case testPerFileStrictOptionalBasic] |
| # flags: --config-file tmp/mypy.ini |
| import standard, optional |
| |
| [file standard.py] |
| x = 0 |
| if int(): |
| x = None |
| [file optional.py] |
| x = 0 |
| if int(): |
| x = None # E: Incompatible types in assignment (expression has type "None", variable has type "int") |
| |
| [file mypy.ini] |
| \[mypy] |
| strict_optional = False |
| \[mypy-optional] |
| strict_optional = True |
| |
| |
| [case testPerFileStrictOptionalBasicImportStandard] |
| # flags: --config-file tmp/mypy.ini |
| import standard, optional |
| |
| [file standard.py] |
| from typing import Optional |
| def f(x: int) -> None: pass |
| an_int = 0 # type: int |
| optional_int = None # type: Optional[int] |
| f(an_int) # ints can be used as ints |
| f(optional_int) # optional ints can be used as ints in this file |
| |
| [file optional.py] |
| import standard |
| def f(x: int) -> None: pass |
| standard.an_int = None # E: Incompatible types in assignment (expression has type "None", variable has type "int") |
| standard.optional_int = None # OK -- explicitly declared as optional |
| f(standard.an_int) # ints can be used as ints |
| f(standard.optional_int) # E: Argument 1 to "f" has incompatible type "None"; expected "int" |
| |
| [file mypy.ini] |
| \[mypy] |
| strict_optional = False |
| \[mypy-optional] |
| strict_optional = True |
| |
| |
| [case testPerFileStrictOptionalBasicImportOptional] |
| # flags: --config-file tmp/mypy.ini |
| import standard, optional |
| |
| [file standard.py] |
| import optional |
| def f(x: int) -> None: pass |
| f(optional.x) # OK -- in non-strict Optional context |
| f(optional.y) # OK -- in non-strict Optional context |
| |
| [file optional.py] |
| from typing import Optional |
| def f(x: int) -> None: pass |
| x = 0 # type: Optional[int] |
| y = None # type: None |
| |
| [file mypy.ini] |
| \[mypy] |
| strict_optional = False |
| \[mypy-optional] |
| strict_optional = True |
| |
| [case testPerFileStrictOptionalListItemImportOptional] |
| # flags: --config-file tmp/mypy.ini |
| import standard, optional |
| |
| [file standard.py] |
| import optional |
| from typing import List |
| def f(x: List[int]) -> None: pass |
| f(optional.x) # OK -- in non-strict Optional context |
| f(optional.y) # OK -- in non-strict Optional context |
| |
| [file optional.py] |
| from typing import Optional, List |
| def f(x: List[int]) -> None: pass |
| x = [] # type: List[Optional[int]] |
| y = [] # type: List[int] |
| |
| [file mypy.ini] |
| \[mypy] |
| strict_optional = False |
| \[mypy-optional] |
| strict_optional = True |
| [builtins fixtures/list.pyi] |
| |
| [case testPerFileStrictOptionalComplicatedList] |
| from typing import Union, Optional, List |
| |
| def f() -> None: |
| x = [] # type: Union[List[Optional[str]], str] |
| [builtins fixtures/list.pyi] |
| |
| [case testPerFileStrictOptionalNoneArguments] |
| # flags: --config-file tmp/mypy.ini |
| import standard, optional |
| |
| [file standard.py] |
| def f(x: int = None) -> None: pass |
| |
| [file optional.py] |
| import standard |
| def f(x: int = None) -> None: pass |
| standard.f(None) |
| |
| [file mypy.ini] |
| \[mypy] |
| strict_optional = False |
| \[mypy-optional] |
| strict_optional = True |
| |
| [case testDisallowImplicitTypesIgnoreMissingTypes] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import MyType |
| |
| def f(x: MyType) -> None: # E: Argument 1 to "f" becomes "Any" due to an unfollowed import |
| pass |
| |
| [case testDisallowImplicitTypes] |
| # flags: --disallow-any-unimported |
| from missing import MyType |
| |
| def f(x: MyType) -> None: |
| pass |
| [out] |
| main:2: error: Cannot find implementation or library stub for module named "missing" |
| main:2: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports |
| main:4: error: Argument 1 to "f" becomes "Any" due to an unfollowed import |
| |
| [case testDisallowImplicitAnyVariableDefinition] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| |
| t: Unchecked = 12 # E: Type of variable becomes "Any" due to an unfollowed import |
| |
| [case testDisallowImplicitAnyGeneric] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| from typing import List |
| |
| def foo(l: List[Unchecked]) -> List[Unchecked]: |
| t = [] # type: List[Unchecked] |
| return l |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: error: Return type becomes "List[Any]" due to an unfollowed import |
| main:5: error: Argument 1 to "foo" becomes "List[Any]" due to an unfollowed import |
| main:6: error: Type of variable becomes "List[Any]" due to an unfollowed import |
| |
| [case testDisallowImplicitAnyInherit] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| from typing import List |
| |
| class C(Unchecked): # E: Base type Unchecked becomes "Any" due to an unfollowed import |
| pass |
| |
| class A(List[Unchecked]): # E: Base type becomes "List[Any]" due to an unfollowed import |
| pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowImplicitAnyAlias] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| from typing import List |
| |
| X = List[Unchecked] |
| |
| def f(x: X) -> None: # E: Argument 1 to "f" becomes "List[Any]" due to an unfollowed import |
| pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowImplicitAnyCast] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| from typing import List, cast |
| |
| |
| foo = [1, 2, 3] |
| cast(List[Unchecked], foo) # E: Target type of cast becomes "List[Any]" due to an unfollowed import |
| cast(Unchecked, foo) # E: Target type of cast becomes "Any" due to an unfollowed import |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowImplicitAnyNamedTuple] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from typing import List, NamedTuple |
| from missing import Unchecked |
| |
| Point = NamedTuple('Point', [('x', List[Unchecked]), |
| ('y', Unchecked)]) |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: error: NamedTuple type becomes "Tuple[List[Any], Any]" due to an unfollowed import |
| |
| [case testDisallowImplicitAnyTypeVarConstraints] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from typing import List, NamedTuple, TypeVar, Any |
| from missing import Unchecked |
| |
| T = TypeVar('T', Unchecked, List[Unchecked], str) |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: error: Constraint 1 becomes "Any" due to an unfollowed import |
| main:5: error: Constraint 2 becomes "List[Any]" due to an unfollowed import |
| |
| [case testDisallowImplicitAnyNewType] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from typing import NewType, List |
| from missing import Unchecked |
| |
| Baz = NewType('Baz', Unchecked) # E: Argument 2 to NewType(...) must be subclassable (got "Any") |
| Bar = NewType('Bar', List[Unchecked]) # E: Argument 2 to NewType(...) becomes "List[Any]" due to an unfollowed import |
| |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowImplicitAnyCallableAndTuple] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from typing import Callable, Tuple |
| from missing import Unchecked |
| |
| def foo(f: Callable[[], Unchecked]) -> Tuple[Unchecked]: |
| return f() |
| [builtins fixtures/list.pyi] |
| [out] |
| main:5: error: Return type becomes "Tuple[Any]" due to an unfollowed import |
| main:5: error: Argument 1 to "foo" becomes "Callable[[], Any]" due to an unfollowed import |
| |
| [case testDisallowImplicitAnySubclassingExplicitAny] |
| # flags: --ignore-missing-imports --disallow-any-unimported --disallow-subclassing-any |
| from typing import Any |
| |
| class C(Any): # E: Class cannot subclass 'Any' (has type 'Any') |
| pass |
| |
| [case testDisallowImplicitAnyVarDeclaration] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from missing import Unchecked |
| |
| foo: Unchecked = "" |
| foo = "" |
| x, y = 1, 2 # type: Unchecked, Unchecked |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:4: error: Type of variable becomes "Any" due to an unfollowed import |
| main:6: error: A type on this line becomes "Any" due to an unfollowed import |
| |
| [case testDisallowUnimportedAnyTypedDictSimple] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| from mypy_extensions import TypedDict |
| from x import Unchecked |
| |
| M = TypedDict('M', {'x': str, 'y': Unchecked}) # E: Type of a TypedDict key becomes "Any" due to an unfollowed import |
| |
| def f(m: M) -> M: pass # no error |
| [builtins fixtures/dict.pyi] |
| |
| [case testDisallowUnimportedAnyTypedDictGeneric] |
| # flags: --ignore-missing-imports --disallow-any-unimported |
| |
| from mypy_extensions import TypedDict |
| from typing import List |
| from x import Unchecked |
| |
| M = TypedDict('M', {'x': str, 'y': List[Unchecked]}) # E: Type of a TypedDict key becomes "List[Any]" due to an unfollowed import |
| |
| def f(m: M) -> M: pass # no error |
| [builtins fixtures/dict.pyi] |
| |
| [case testDisallowAnyDecoratedUnannotatedDecorator] |
| # flags: --disallow-any-decorated |
| from typing import Any |
| |
| def d(f): |
| return f |
| |
| @d |
| def f(x: Any) -> Any: # E: Function is untyped after decorator transformation |
| pass |
| @d |
| def h(x): # E: Function is untyped after decorator transformation |
| pass |
| [builtins fixtures/list.pyi] |
| [case testDisallowAnyDecoratedErrorIsReportedOnlyOnce] |
| # flags: --disallow-any-decorated |
| |
| def d(f): |
| return f |
| |
| def d2(f): |
| return f |
| |
| @d |
| @d2 |
| @d |
| def f(x: int) -> None: pass # E: Function is untyped after decorator transformation |
| [case testDisallowAnyDecoratedReturnAny] |
| # flags: --disallow-any-decorated |
| from typing import Any |
| |
| def d(f) -> Any: |
| return f |
| |
| @d |
| def f() -> None: pass # E: Function is untyped after decorator transformation |
| [builtins fixtures/list.pyi] |
| [case testDisallowAnyDecoratedReturnCallable] |
| # flags: --disallow-any-decorated |
| from typing import Any, Callable |
| |
| def d(f) -> Callable[..., None]: |
| return f |
| |
| @d |
| def g(i: int, s: str) -> None: pass # E: Type of decorated function contains type "Any" ("Callable[..., None]") |
| |
| [builtins fixtures/list.pyi] |
| [case testDisallowAnyDecoratedNonexistentDecorator] |
| # flags: --disallow-any-decorated --ignore-missing-imports |
| from nonexistent import d |
| |
| @d |
| def f() -> None: pass # E: Function is untyped after decorator transformation |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyDecoratedPartlyTypedCallable] |
| # flags: --disallow-any-decorated --ignore-missing-imports |
| from typing import Callable, Any, List |
| |
| def d(f) -> Callable[[int, Any], Any]: pass |
| def d2(f) -> Callable[[int], List[Any]]: pass |
| def d3(f) -> Callable[[Any], List[str]]: pass |
| |
| @d |
| def f(i: int, s: str) -> None: # E: Type of decorated function contains type "Any" ("Callable[[int, Any], Any]") |
| pass |
| @d2 |
| def g(i: int) -> None: # E: Type of decorated function contains type "Any" ("Callable[[int], List[Any]]") |
| pass |
| @d3 |
| def h(i: int) -> None: # E: Type of decorated function contains type "Any" ("Callable[[Any], List[str]]") |
| pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyDecoratedReturnsCallableNoParams] |
| # flags: --disallow-any-decorated |
| from typing import Callable |
| |
| def d(p) -> Callable[[], int]: |
| return p |
| |
| @d |
| def f(i): |
| return i |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyDecoratedDecoratorReturnsNonCallable] |
| # flags: --disallow-any-decorated |
| def d(p) -> int: |
| return p(0) |
| |
| @d |
| def f(i): |
| return i |
| |
| [case testDisallowAnyDecoratedUntypedUndecoratedFunction] |
| # flags: --disallow-any-decorated |
| from typing import Callable |
| |
| def f(i): # no error |
| return i |
| |
| [case testDisallowAnyDecoratedTwoDecorators] |
| # flags: --disallow-any-decorated |
| from typing import Callable |
| |
| def typed_dec(f) -> Callable[[], int]: pass |
| def untyped_dec(f): pass |
| |
| @typed_dec |
| @untyped_dec |
| def f(): # no error |
| return i |
| |
| @untyped_dec |
| @typed_dec |
| def g(): # E: Function is untyped after decorator transformation |
| return i |
| |
| [case testDisallowAnyExprSimple] |
| # flags: --disallow-any-expr |
| from typing import Any |
| def f(s): |
| yield s |
| |
| x = f(0) # E: Expression has type "Any" |
| for x in f(0): # E: Expression has type "Any" |
| g(x) # E: Expression has type "Any" |
| |
| def g(x) -> Any: |
| yield x # E: Expression has type "Any" |
| |
| l = [1, 2, 3] |
| l[f(0)] # E: Expression has type "Any" |
| f(l) |
| f(f(0)) # E: Expression has type "Any" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprUnannotatedFunction] |
| # flags: --disallow-any-expr |
| def g(s): |
| return s |
| |
| g(0) |
| w: int = g(1) |
| |
| [case testDisallowAnyExprExplicitAnyParam] |
| # flags: --disallow-any-expr |
| from typing import Any, List |
| def f(s: Any) -> None: |
| pass |
| |
| def g(s: List[Any]) -> None: |
| pass |
| |
| f(0) |
| |
| # type of list below is inferred with expected type of "List[Any]", so that becomes it's type |
| # instead of List[str] |
| g(['']) # E: Expression type contains "Any" (has type "List[Any]") |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprAllowsAnyInCast] |
| # flags: --disallow-any-expr |
| from typing import Any, cast |
| class Foo: |
| g: Any = 2 |
| |
| z = cast(int, Foo().g) |
| m = cast(Any, Foo().g) # E: Expression has type "Any" |
| k = Foo.g # E: Expression has type "Any" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprAllowsAnyInVariableAssignmentWithExplicitTypeAnnotation] |
| # flags: --disallow-any-expr |
| from typing import Any |
| class Foo: |
| g: Any = 2 |
| |
| z: int = Foo().g |
| x = Foo().g # type: int |
| m: Any = Foo().g # E: Expression has type "Any" |
| n = Foo().g # type: Any # E: Expression has type "Any" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprGeneric] |
| # flags: --disallow-any-expr |
| from typing import List |
| |
| l: List = [] |
| l.append(1) # E: Expression type contains "Any" (has type "List[Any]") |
| k = l[0] # E: Expression type contains "Any" (has type "List[Any]") # E: Expression has type "Any" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprTypeVar] |
| # flags: --disallow-any-expr |
| from typing import TypeVar |
| |
| T = TypeVar('T') # no error |
| |
| def f(t: T) -> T: |
| return t |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprNamedTuple] |
| # flags: --disallow-any-expr |
| from typing import NamedTuple |
| |
| Point = NamedTuple('Point', [('x', int), ('y', int)]) # no error |
| |
| def origin() -> Point: |
| return Point(x=0, y=0) |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprNewType] |
| # flags: --disallow-any-expr |
| from typing import NewType |
| |
| NT = NewType('NT', int) # no error |
| |
| def nt() -> NT: |
| return NT(1) |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprEnum] |
| # flags: --disallow-any-expr |
| from enum import Enum |
| E = Enum('E', '1, 2, 3') # no error |
| |
| def k(s: E) -> None: pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExprTypedDict] |
| # flags: --disallow-any-expr |
| from mypy_extensions import TypedDict |
| |
| Movie = TypedDict('Movie', {'name': str, 'year': int}) |
| |
| def g(m: Movie) -> Movie: |
| return m |
| [builtins fixtures/dict.pyi] |
| |
| [case testDisallowIncompleteDefs] |
| # flags: --disallow-incomplete-defs |
| |
| def f(i: int): # E: Function is missing a return type annotation |
| pass |
| def g(i) -> None: # E: Function is missing a type annotation for one or more arguments |
| pass |
| def h(i: int) -> int: # no error |
| return i |
| def i() -> None: # no error |
| pass |
| |
| [case testDisallowIncompleteDefsNoReturn] |
| # flags: --disallow-incomplete-defs --disallow-untyped-defs |
| |
| def f(i: int): # E: Function is missing a return type annotation |
| pass |
| |
| [case testDisallowIncompleteDefsSelf] |
| # flags: --disallow-incomplete-defs |
| class C: |
| def foo(self) -> None: # no error |
| pass |
| |
| [case testDisallowIncompleteDefsPartiallyAnnotatedParams] |
| # flags: --disallow-incomplete-defs |
| |
| def f(i: int, s): |
| pass |
| |
| [out] |
| main:3: error: Function is missing a return type annotation |
| main:3: error: Function is missing a type annotation for one or more arguments |
| |
| [case testDisallowIncompleteDefsAttrsNoAnnotations] |
| # flags: --disallow-incomplete-defs |
| import attr |
| |
| @attr.s() |
| class Unannotated: |
| foo = attr.ib() |
| |
| [case testDisallowIncompleteDefsAttrsWithAnnotations] |
| # flags: --disallow-incomplete-defs |
| import attr |
| |
| @attr.s() |
| class Annotated: |
| bar: int = attr.ib() |
| |
| [case testDisallowIncompleteDefsAttrsPartialAnnotations] |
| # flags: --disallow-incomplete-defs |
| import attr |
| |
| @attr.s() |
| class PartiallyAnnotated: # E: Function is missing a type annotation for one or more arguments |
| bar: int = attr.ib() |
| baz = attr.ib() |
| |
| [case testAlwaysTrueAlwaysFalseFlags] |
| # flags: --always-true=YOLO --always-true=YOLO1 --always-false=BLAH1 --always-false BLAH --ignore-missing-imports |
| from somewhere import YOLO, BLAH |
| if not YOLO: |
| 1+() |
| if BLAH: |
| 1+() |
| [builtins fixtures/bool.pyi] |
| |
| [case testAlwaysTrueAlwaysFalseConfigFile] |
| # flags: --config-file tmp/mypy.ini |
| from somewhere import YOLO, BLAH |
| if not YOLO: |
| 1+() |
| if BLAH: |
| 1+() |
| [file mypy.ini] |
| \[mypy] |
| ignore_missing_imports = True |
| always_true = YOLO1, YOLO |
| always_false = BLAH, BLAH1 |
| [builtins fixtures/bool.pyi] |
| |
| [case testDisableErrorCodeConfigFile] |
| # flags: --config-file tmp/mypy.ini --disallow-untyped-defs |
| import foo |
| def bar(): |
| pass |
| [file mypy.ini] |
| \[mypy] |
| disable_error_code = import, no-untyped-def |
| |
| [case testCheckDisallowAnyGenericsNamedTuple] |
| # flags: --disallow-any-generics |
| from typing import NamedTuple |
| |
| N = NamedTuple('N', [('x', N)]) # type: ignore |
| n: N |
| [builtins fixtures/tuple.pyi] |
| [out] |
| |
| [case testCheckDisallowAnyGenericsTypedDict] |
| # flags: --disallow-any-generics |
| from typing import Dict, Any, Optional |
| from mypy_extensions import TypedDict |
| |
| VarsDict = Dict[str, Any] |
| HostsDict = Dict[str, Optional[VarsDict]] |
| |
| GroupDataDict = TypedDict( |
| "GroupDataDict", {"children": "GroupsDict", # type: ignore |
| "vars": VarsDict, |
| "hosts": HostsDict}, total=False |
| ) |
| |
| GroupsDict = Dict[str, GroupDataDict] # type: ignore |
| [builtins fixtures/dict.pyi] |
| |
| |
| [case testCheckDisallowAnyGenericsStubOnly] |
| # flags: --disallow-any-generics --python-version 3.8 |
| from asyncio import Future |
| from queue import Queue |
| x: Future[str] |
| y: Queue[int] |
| |
| p: Future # E: Missing type parameters for generic type "Future" \ |
| # N: Subscripting classes that are not generic at runtime may require escaping, see https://mypy.readthedocs.io/en/latest/common_issues.html#not-generic-runtime |
| q: Queue # E: Missing type parameters for generic type "Queue" \ |
| # N: Subscripting classes that are not generic at runtime may require escaping, see https://mypy.readthedocs.io/en/latest/common_issues.html#not-generic-runtime |
| [builtins fixtures/async_await.pyi] |
| [typing fixtures/typing-full.pyi] |
| |
| |
| [case testCheckDefaultAllowAnyGeneric] |
| from typing import TypeVar, Callable |
| |
| T = TypeVar('T') |
| C = Callable[[], T] |
| |
| def f(c: C): |
| pass |
| [out] |
| |
| [case testCheckAllowAnyGenericAnyGeneric] |
| # flags: --strict --allow-any-generics |
| from typing import TypeVar, Callable |
| |
| T = TypeVar('T') |
| C = Callable[[], T] |
| |
| def f(c: C) -> None: |
| pass |
| [out] |
| |
| [case testCheckDisallowAnyGenericsAnyGeneric] |
| # flags: --disallow-any-generics |
| from typing import TypeVar, Callable |
| |
| T = TypeVar('T') |
| C = Callable[[], T] |
| |
| def f(c: C): # E: Missing type parameters for generic type "C" |
| pass |
| [out] |
| |
| [case testStrictAnyGeneric] |
| # flags: --strict |
| from typing import TypeVar, Generic |
| |
| T = TypeVar('T') |
| |
| class A(Generic[T]): |
| pass |
| |
| def f(c: A) -> None: # E: Missing type parameters for generic type "A" |
| pass |
| [out] |
| |
| [case testStrictInConfigAnyGeneric] |
| # flags: --config-file tmp/mypy.ini |
| from typing import TypeVar, Generic |
| |
| T = TypeVar('T') |
| |
| class A(Generic[T]): |
| pass |
| |
| def f(c: A) -> None: # E: Missing type parameters for generic type "A" |
| pass |
| [file mypy.ini] |
| \[mypy] |
| strict = True |
| [out] |
| |
| [case testStrictFalseInConfigAnyGeneric] |
| # flags: --config-file tmp/mypy.ini |
| from typing import TypeVar, Generic |
| |
| T = TypeVar('T') |
| |
| class A(Generic[T]): |
| pass |
| |
| def f(c: A) -> None: |
| pass |
| [file mypy.ini] |
| \[mypy] |
| strict = False |
| [out] |
| |
| [case testStrictAndStrictEquality] |
| # flags: --strict |
| x = 0 |
| y = '' |
| if x == y: # E: Non-overlapping equality check (left operand type: "int", right operand type: "str") |
| int() |
| [builtins fixtures/ops.pyi] |
| |
| [case testStrictEqualityPerFile] |
| # flags: --config-file tmp/mypy.ini |
| import b |
| 42 == 'no' # E: Non-overlapping equality check (left operand type: "Literal[42]", right operand type: "Literal['no']") |
| [file b.py] |
| 42 == 'no' |
| [file mypy.ini] |
| \[mypy] |
| strict_equality = True |
| \[mypy-b] |
| strict_equality = False |
| [builtins fixtures/bool.pyi] |
| |
| [case testNoImplicitReexport] |
| # flags: --no-implicit-reexport |
| from other_module_2 import a |
| [file other_module_1.py] |
| a = 5 |
| [file other_module_2.py] |
| from other_module_1 import a |
| [out] |
| main:2: error: Module 'other_module_2' does not explicitly export attribute 'a'; implicit reexport disabled |
| |
| [case testNoImplicitReexportRespectsAll] |
| # flags: --no-implicit-reexport |
| from other_module_2 import a |
| from other_module_2 import b |
| [file other_module_1.py] |
| a = 5 |
| b = 6 |
| [file other_module_2.py] |
| from other_module_1 import a, b |
| __all__ = ('b',) |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:2: error: Module 'other_module_2' does not explicitly export attribute 'a'; implicit reexport disabled |
| |
| [case testNoImplicitReexportStarConsideredImplicit] |
| # flags: --no-implicit-reexport |
| from other_module_2 import a |
| [file other_module_1.py] |
| a = 5 |
| [file other_module_2.py] |
| from other_module_1 import * |
| [out] |
| main:2: error: Module 'other_module_2' does not explicitly export attribute 'a'; implicit reexport disabled |
| |
| [case testNoImplicitReexportStarCanBeReexportedWithAll] |
| # flags: --no-implicit-reexport |
| from other_module_2 import a |
| from other_module_2 import b |
| [file other_module_1.py] |
| a = 5 |
| b = 6 |
| [file other_module_2.py] |
| from other_module_1 import * |
| __all__ = ('b',) |
| [builtins fixtures/tuple.pyi] |
| [out] |
| main:2: error: Module 'other_module_2' does not explicitly export attribute 'a'; implicit reexport disabled |
| |
| [case textNoImplicitReexportSuggestions] |
| # flags: --no-implicit-reexport |
| from other_module_2 import attr_1 |
| |
| [file other_module_1.py] |
| attr_1 = 5 |
| attr_2 = 6 |
| [file other_module_2.py] |
| from other_module_1 import attr_1, attr_2 |
| [out] |
| main:2: error: Module 'other_module_2' does not explicitly export attribute 'attr_1'; implicit reexport disabled |
| |
| [case testNoImplicitReexportMypyIni] |
| # flags: --config-file tmp/mypy.ini |
| from other_module_2 import a |
| |
| [file other_module_1.py] |
| a = 5 |
| |
| [file other_module_2.py] |
| from other_module_1 import a |
| |
| [file mypy.ini] |
| \[mypy] |
| implicit_reexport = True |
| \[mypy-other_module_2] |
| implicit_reexport = False |
| [out] |
| main:2: error: Module 'other_module_2' has no attribute 'a' |
| |
| [case testImplicitAnyOKForNoArgs] |
| # flags: --disallow-any-generics --show-column-numbers |
| from typing import List |
| |
| A = List # OK |
| B = List[A] # E:10: Missing type parameters for generic type "A" |
| x: A # E:4: Missing type parameters for generic type "A" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitDefSignature] |
| # flags: --disallow-any-explicit |
| |
| from typing import Any, List |
| |
| def f(x: Any) -> None: # E: Explicit "Any" is not allowed |
| pass |
| |
| def g() -> Any: # E: Explicit "Any" is not allowed |
| pass |
| |
| def h() -> List[Any]: # E: Explicit "Any" is not allowed |
| pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitVarDeclaration] |
| # flags: --python-version 3.6 --disallow-any-explicit |
| from typing import Any |
| v: Any = '' # E: Explicit "Any" is not allowed |
| w = '' # type: Any # E: Explicit "Any" is not allowed |
| class X: |
| y = '' # type: Any # E: Explicit "Any" is not allowed |
| |
| [case testDisallowAnyExplicitGenericVarDeclaration] |
| # flags: --python-version 3.6 --disallow-any-explicit |
| from typing import Any, List |
| v: List[Any] = [] # E: Explicit "Any" is not allowed |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitInheritance] |
| # flags: --disallow-any-explicit |
| from typing import Any, List |
| |
| class C(Any): # E: Explicit "Any" is not allowed |
| pass |
| |
| class D(List[Any]): # E: Explicit "Any" is not allowed |
| pass |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitAlias] |
| # flags: --disallow-any-explicit |
| from typing import Any, List |
| |
| X = Any # E: Explicit "Any" is not allowed |
| Y = List[Any] # E: Explicit "Any" is not allowed |
| |
| def foo(x: X) -> Y: # no error |
| x.nonexistent() # no error |
| return x |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitGenericAlias] |
| # flags: --disallow-any-explicit |
| from typing import Any, TypeVar, Tuple |
| |
| T = TypeVar('T') |
| |
| TupleAny = Tuple[Any, T] # E: Explicit "Any" is not allowed |
| |
| def foo(x: TupleAny[str]) -> None: # no error |
| pass |
| |
| def goo(x: TupleAny[Any]) -> None: # E: Explicit "Any" is not allowed |
| pass |
| [builtins fixtures/tuple.pyi] |
| |
| [case testDisallowAnyExplicitCast] |
| # flags: --disallow-any-explicit |
| from typing import Any, List, cast |
| |
| x = 1 |
| y = cast(Any, x) # E: Explicit "Any" is not allowed |
| z = cast(List[Any], x) # E: Explicit "Any" is not allowed |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitNamedTuple] |
| # flags: --disallow-any-explicit |
| from typing import Any, List, NamedTuple |
| |
| Point = NamedTuple('Point', [('x', List[Any]), ('y', Any)]) # E: Explicit "Any" is not allowed |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitTypeVarConstraint] |
| # flags: --disallow-any-explicit |
| from typing import Any, List, TypeVar |
| |
| T = TypeVar('T', Any, List[Any]) # E: Explicit "Any" is not allowed |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitNewType] |
| # flags: --disallow-any-explicit |
| from typing import Any, List, NewType |
| |
| # this error does not come from `--disallow-any-explicit` flag |
| Baz = NewType('Baz', Any) # E: Argument 2 to NewType(...) must be subclassable (got "Any") |
| Bar = NewType('Bar', List[Any]) # E: Explicit "Any" is not allowed |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyExplicitTypedDictSimple] |
| # flags: --disallow-any-explicit |
| from mypy_extensions import TypedDict |
| from typing import Any |
| |
| M = TypedDict('M', {'x': str, 'y': Any}) # E: Explicit "Any" is not allowed |
| M(x='x', y=2) # no error |
| def f(m: M) -> None: pass # no error |
| [builtins fixtures/dict.pyi] |
| |
| [case testDisallowAnyExplicitTypedDictGeneric] |
| # flags: --disallow-any-explicit |
| from mypy_extensions import TypedDict |
| from typing import Any, List |
| |
| M = TypedDict('M', {'x': str, 'y': List[Any]}) # E: Explicit "Any" is not allowed |
| N = TypedDict('N', {'x': str, 'y': List}) # no error |
| [builtins fixtures/dict.pyi] |
| |
| [case testDisallowAnyGenericsTupleNoTypeParams] |
| # flags: --python-version 3.6 --disallow-any-generics |
| from typing import Tuple |
| |
| def f(s: Tuple) -> None: pass # E: Missing type parameters for generic type "Tuple" |
| def g(s) -> Tuple: # E: Missing type parameters for generic type "Tuple" |
| return 'a', 'b' |
| def h(s) -> Tuple[str, str]: # no error |
| return 'a', 'b' |
| x: Tuple = () # E: Missing type parameters for generic type "Tuple" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testDisallowAnyGenericsTupleWithNoTypeParamsGeneric] |
| # flags: --disallow-any-generics |
| from typing import Tuple, List |
| |
| def f(s: List[Tuple]) -> None: pass # E: Missing type parameters for generic type "Tuple" |
| def g(s: List[Tuple[str, str]]) -> None: pass # no error |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyGenericsTypeType] |
| # flags: --disallow-any-generics |
| from typing import Type, Any |
| |
| def f(s: Type[Any]) -> None: pass # no error |
| def g(s) -> Type: # E: Missing type parameters for generic type "Type" |
| return s |
| def h(s) -> Type[str]: # no error |
| return s |
| x: Type = g(0) # E: Missing type parameters for generic type "Type" |
| |
| [case testDisallowAnyGenericsAliasGenericType] |
| # flags: --disallow-any-generics |
| from typing import List |
| |
| L = List # no error |
| |
| def f(l: L) -> None: pass # E: Missing type parameters for generic type "L" |
| def g(l: L[str]) -> None: pass # no error |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyGenericsGenericAlias] |
| # flags: --python-version 3.6 --disallow-any-generics |
| from typing import TypeVar, Tuple |
| |
| T = TypeVar('T') |
| A = Tuple[T, str, T] |
| |
| def f(s: A) -> None: pass # E: Missing type parameters for generic type "A" |
| def g(s) -> A: # E: Missing type parameters for generic type "A" |
| return 'a', 'b', 1 |
| def h(s) -> A[str]: # no error |
| return 'a', 'b', 'c' |
| x: A = ('a', 'b', 1) # E: Missing type parameters for generic type "A" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testDisallowAnyGenericsPlainList] |
| # flags: --python-version 3.6 --disallow-any-generics |
| from typing import List |
| |
| def f(l: List) -> None: pass # E: Missing type parameters for generic type "List" |
| def g(l: List[str]) -> None: pass # no error |
| def h(l: List[List]) -> None: pass # E: Missing type parameters for generic type "List" |
| def i(l: List[List[List[List]]]) -> None: pass # E: Missing type parameters for generic type "List" |
| |
| x = [] # E: Need type annotation for "x" (hint: "x: List[<type>] = ...") |
| y: List = [] # E: Missing type parameters for generic type "List" |
| [builtins fixtures/list.pyi] |
| |
| [case testDisallowAnyGenericsCustomGenericClass] |
| # flags: --python-version 3.6 --disallow-any-generics |
| from typing import Generic, TypeVar, Any |
| |
| T = TypeVar('T') |
| class G(Generic[T]): pass |
| |
| def f() -> G: # E: Missing type parameters for generic type "G" |
| return G() |
| |
| x: G[Any] = G() # no error |
| y: G = x # E: Missing type parameters for generic type "G" |
| |
| [case testDisallowSubclassingAny] |
| # flags: --config-file tmp/mypy.ini |
| import m |
| import y |
| |
| [file m.py] |
| from typing import Any |
| |
| x = None # type: Any |
| |
| class ShouldBeFine(x): ... |
| |
| [file y.py] |
| from typing import Any |
| |
| x = None # type: Any |
| |
| class ShouldNotBeFine(x): ... # E: Class cannot subclass 'x' (has type 'Any') |
| |
| [file mypy.ini] |
| \[mypy] |
| disallow_subclassing_any = True |
| \[mypy-m] |
| disallow_subclassing_any = False |
| |
| [case testNoImplicitOptionalPerModule] |
| # flags: --config-file tmp/mypy.ini |
| import m |
| |
| [file m.py] |
| def f(a: str = None) -> int: |
| return 0 |
| |
| [file mypy.ini] |
| \[mypy] |
| no_implicit_optional = True |
| \[mypy-m] |
| no_implicit_optional = False |
| |
| [case testNoImplicitOptionalPerModulePython2] |
| # flags: --config-file tmp/mypy.ini --python-version 2.7 |
| import m |
| |
| [file m.py] |
| def f(a = None): |
| # type: (str) -> int |
| return 0 |
| |
| [file mypy.ini] |
| \[mypy] |
| no_implicit_optional = True |
| \[mypy-m] |
| no_implicit_optional = False |
| |
| [case testDisableErrorCode] |
| # flags: --disable-error-code attr-defined |
| x = 'should be fine' |
| x.trim() |
| |
| [case testDisableDifferentErrorCode] |
| # flags: --disable-error-code name-defined --show-error-code |
| x = 'should not be fine' |
| x.trim() # E: "str" has no attribute "trim" [attr-defined] |
| |
| [case testDisableMultipleErrorCode] |
| # flags: --disable-error-code attr-defined --disable-error-code return-value --show-error-code |
| x = 'should be fine' |
| x.trim() |
| |
| def bad_return_type() -> str: |
| return None |
| |
| bad_return_type('no args taken!') # E: Too many arguments for "bad_return_type" [call-arg] |
| |
| [case testEnableErrorCode] |
| # flags: --disable-error-code attr-defined --enable-error-code attr-defined --show-error-code |
| x = 'should be fine' |
| x.trim() # E: "str" has no attribute "trim" [attr-defined] |
| |
| [case testEnableDifferentErrorCode] |
| # flags: --disable-error-code attr-defined --enable-error-code name-defined --show-error-code |
| x = 'should not be fine' |
| x.trim() # E: "str" has no attribute "trim" [attr-defined] |
| |
| [case testEnableMultipleErrorCode] |
| # flags: \ |
| --disable-error-code attr-defined \ |
| --disable-error-code return-value \ |
| --disable-error-code call-arg \ |
| --enable-error-code attr-defined \ |
| --enable-error-code return-value --show-error-code |
| x = 'should be fine' |
| x.trim() # E: "str" has no attribute "trim" [attr-defined] |
| |
| def bad_return_type() -> str: |
| return None # E: Incompatible return value type (got "None", expected "str") [return-value] |
| |
| bad_return_type('no args taken!') |
| |
| [case testDisallowUntypedCallsArgType] |
| # flags: --disallow-untyped-calls |
| def f(x): |
| pass |
| |
| y = 1 |
| f(reveal_type(y)) # E: Call to untyped function "f" in typed context \ |
| # N: Revealed type is 'builtins.int' |