blob: 96f78d81dd168963c028674991178c3c82598f37 [file] [log] [blame] [edit]
[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 testDisallowUntypedDecoratorsCallableInstanceDecoratedCall]
# flags: --disallow-untyped-decorators
from typing import Callable, TypeVar
C = TypeVar('C', bound=Callable)
def typed_decorator(c: C) -> C:
return c
def untyped_decorator(c):
return c
class TypedDecorator:
@typed_decorator
def __call__(self, c: Callable) -> Callable:
return function
class UntypedDecorator1:
@untyped_decorator
def __call__(self, c):
return function
class UntypedDecorator2:
@untyped_decorator # E: Untyped decorator makes function "__call__" untyped
def __call__(self, c: Callable) -> Callable:
return function
class UntypedDecorator3:
@typed_decorator
@untyped_decorator # E: Untyped decorator makes function "__call__" untyped
def __call__(self, c: Callable) -> Callable:
return function
class UntypedDecorator4:
@untyped_decorator # E: Untyped decorator makes function "__call__" untyped
@typed_decorator
def __call__(self, c: Callable) -> Callable:
return function
@TypedDecorator()
def f() -> None: pass
@UntypedDecorator1() # E: Untyped decorator makes function "g1" untyped
def g1() -> None: pass
@UntypedDecorator2() # E: Untyped decorator makes function "g2" untyped
def g2() -> None: pass
@UntypedDecorator3() # E: Untyped decorator makes function "g3" untyped
def g3() -> None: pass
@UntypedDecorator4() # E: Untyped decorator makes function "g4" untyped
def g4() -> None: pass
reveal_type(f) # N: Revealed type is "def (*Any, **Any) -> Any"
reveal_type(g1) # N: Revealed type is "Any"
reveal_type(g2) # N: Revealed type is "Any"
reveal_type(g3) # N: Revealed type is "Any"
reveal_type(g4) # N: Revealed type is "Any"
[builtins fixtures/bool.pyi]
[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 testNoReturnImplicitReturnCheckInDeferredNode]
# flags: --warn-no-return
from typing import NoReturn
def exit() -> NoReturn: ...
def force_forward_reference() -> int:
return 4
def f() -> NoReturn:
x
exit()
x = force_forward_reference()
[builtins fixtures/exception.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 testNoReturnAsync]
# flags: --warn-no-return
from mypy_extensions import NoReturn
async def f() -> NoReturn: ...
async def g() -> NoReturn:
await f()
async def h() -> NoReturn: # E: Implicit return in function which does not return
# Purposely not evaluating coroutine
_ = f()
[builtins fixtures/dict.pyi]
[typing fixtures/typing-async.pyi]
[case testNoWarnNoReturn]
# flags: --no-warn-no-return
import typing
def implicit_optional_return(arg) -> typing.Optional[str]:
if arg:
return "false"
def unsound_implicit_return(arg) -> str: # E: Incompatible return value type (implicitly returns "None", expected "str")
if arg:
return "false"
def implicit_return_gen(arg) -> typing.Generator[int, None, typing.Optional[str]]:
yield 1
def unsound_implicit_return_gen(arg) -> typing.Generator[int, None, str]: # E: Incompatible return value type (implicitly returns "None", expected "str")
yield 1
[builtins fixtures/dict.pyi]
[case testNoWarnNoReturnNoStrictOptional]
# flags: --no-warn-no-return --no-strict-optional
import typing
def implicit_optional_return(arg) -> typing.Optional[str]:
if arg:
return "false"
def unsound_implicit_return(arg) -> str:
if arg:
return "false"
def implicit_return_gen(arg) -> typing.Generator[int, None, typing.Optional[str]]:
yield 1
def unsound_implicit_return_gen(arg) -> typing.Generator[int, None, str]:
yield 1
[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/stable/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 testPerFileIncompleteDefsBasicPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
disallow_incomplete_defs = false
\[[tool.mypy.overrides]]
module = '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 testPerFileStrictOptionalBasicPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_optional = false
\[[tool.mypy.overrides]]
module = '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 testPerFileStrictOptionalBasicImportStandardPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_optional = false
\[[tool.mypy.overrides]]
module = '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 testPerFileStrictOptionalBasicImportOptionalPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_optional = false
\[[tool.mypy.overrides]]
module = '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 testPerFileStrictOptionalListItemImportOptionalPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_optional = false
\[[tool.mypy.overrides]]
module = '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
implicit_optional = true
\[mypy-optional]
strict_optional = True
[case testPerFileStrictOptionalNoneArgumentsPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_optional = false
implicit_optional = true
\[[tool.mypy.overrides]]
module = '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/stable/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
def g(x) -> Any:
yield x # E: Expression has type "Any"
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"
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 attrs
@attrs.define
class Unannotated:
foo = attrs.field()
[builtins fixtures/plugin_attrs.pyi]
[case testDisallowIncompleteDefsAttrsWithAnnotations]
# flags: --disallow-incomplete-defs
import attrs
@attrs.define
class Annotated:
bar: int = attrs.field()
[builtins fixtures/plugin_attrs.pyi]
[case testDisallowIncompleteDefsAttrsPartialAnnotations]
# flags: --disallow-incomplete-defs
import attrs
@attrs.define
class PartiallyAnnotated: # E: Function is missing a type annotation for one or more arguments
bar: int = attrs.field()
baz = attrs.field()
[builtins fixtures/plugin_attrs.pyi]
[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 testAlwaysTrueAlwaysFalseConfigFilePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
from somewhere import YOLO, BLAH
if not YOLO:
1+()
if BLAH:
1+()
[file pyproject.toml]
\[tool.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 testDisableErrorCodeConfigFilePyProjectTOML]
# flags: --config-file tmp/pyproject.toml --disallow-untyped-defs
import foo
def bar():
pass
[file pyproject.toml]
\[tool.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/stable/runtime_troubles.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/stable/runtime_troubles.html#not-generic-runtime
[file asyncio/__init__.pyi]
from asyncio.futures import Future as Future
[file asyncio/futures.pyi]
from typing import TypeVar, Generic
_T = TypeVar('_T')
class Future(Generic[_T]): ...
[file queue.pyi]
from typing import TypeVar, Generic
_T = TypeVar('_T')
class Queue(Generic[_T]): ...
[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 testStrictInConfigAnyGenericPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.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 testStrictFalseInConfigAnyGenericPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
from typing import TypeVar, Generic
T = TypeVar('T')
class A(Generic[T]):
pass
def f(c: A) -> None:
pass
[file pyproject.toml]
\[tool.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 testStrictEqualityPerFilePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
strict_equality = true
\[[tool.mypy.overrides]]
module = 'b'
strict_equality = false
[builtins fixtures/bool.pyi]
[case testNoImplicitReexport]
# flags: --no-implicit-reexport --show-error-codes
from other_module_2 import a # E: Module "other_module_2" does not explicitly export attribute "a" [attr-defined]
reveal_type(a) # N: Revealed type is "builtins.int"
import other_module_2
# TODO: this should also reveal builtins.int, see #13965
reveal_type(other_module_2.a) # E: "object" does not explicitly export attribute "a" [attr-defined] \
# N: Revealed type is "Any"
[file other_module_1.py]
a = 5
[file other_module_2.py]
from other_module_1 import a
[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"
[case testNoImplicitReexportStarConsideredExplicit]
# 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]
[case testNoImplicitReexportGetAttr]
# flags: --no-implicit-reexport --python-version 3.7
from other_module_2 import a # E: Module "other_module_2" does not explicitly export attribute "a"
[file other_module_1.py]
from typing import Any
def __getattr__(name: str) -> Any: ...
[file other_module_2.py]
from other_module_1 import a
[builtins fixtures/tuple.pyi]
[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"
[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" does not explicitly export attribute "a"
[case testNoImplicitReexportPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
implicit_reexport = true
\[[tool.mypy.overrides]]
module = 'other_module_2'
implicit_reexport = false
[out]
main:2: error: Module "other_module_2" does not explicitly export 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: --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: --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: --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: --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: --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: --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 testDisallowAnyGenericsForAliasesInRuntimeContext]
# flags: --disallow-any-generics
from typing import Any, TypeVar, Generic, Tuple
T = TypeVar("T")
class G(Generic[T]):
@classmethod
def foo(cls) -> T: ...
A = G[Tuple[T, T]]
A() # E: Missing type parameters for generic type "A"
A.foo() # E: Missing type parameters for generic type "A"
B = G
B()
B.foo()
def foo(x: Any) -> None: ...
foo(A)
foo(A.foo)
[builtins fixtures/classmethod.pyi]
[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 testDisallowSubclassingAnyPyProjectTOML]
# flags: --config-file tmp/pyproject.toml
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 pyproject.toml]
\[tool.mypy]
disallow_subclassing_any = true
\[[tool.mypy.overrides]]
module = '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 testNoImplicitOptionalPerModulePyProjectTOML]
# flags: --config-file tmp/pyproject.toml
import m
[file m.py]
def f(a: str = None) -> int:
return 0
[file pyproject.toml]
\[tool.mypy]
no_implicit_optional = true
\[[tool.mypy.overrides]]
module = '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-codes
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-codes
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-codes
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-codes
x = 'should not be fine'
x.trim()
y.trim() # E: Name "y" is not defined [name-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-codes
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"
[case testDisallowUntypedCallsAllowListFlags]
# flags: --disallow-untyped-calls --untyped-calls-exclude=foo --untyped-calls-exclude=bar.A
from foo import test_foo
from bar import A, B
from baz import test_baz
from foobar import bad
test_foo(42) # OK
test_baz(42) # E: Call to untyped function "test_baz" in typed context
bad(42) # E: Call to untyped function "bad" in typed context
a: A
b: B
a.meth() # OK
b.meth() # E: Call to untyped function "meth" in typed context
[file foo.py]
def test_foo(x): pass
[file foobar.py]
def bad(x): pass
[file bar.py]
class A:
def meth(self): pass
class B:
def meth(self): pass
[file baz.py]
def test_baz(x): pass
[case testDisallowUntypedCallsAllowListConfig]
# flags: --config-file tmp/mypy.ini
from foo import test_foo
from bar import A, B
from baz import test_baz
test_foo(42) # OK
test_baz(42) # E: Call to untyped function "test_baz" in typed context
a: A
b: B
a.meth() # OK
b.meth() # E: Call to untyped function "meth" in typed context
[file foo.py]
def test_foo(x): pass
[file bar.py]
class A:
def meth(self): pass
class B:
def meth(self): pass
[file baz.py]
def test_baz(x): pass
[file mypy.ini]
\[mypy]
disallow_untyped_calls = True
untyped_calls_exclude = foo, bar.A
[case testPerModuleErrorCodes]
# flags: --config-file tmp/mypy.ini
import tests.foo
import bar
[file bar.py]
x = [] # E: Need type annotation for "x" (hint: "x: List[<type>] = ...")
[file tests/__init__.py]
[file tests/foo.py]
x = [] # OK
[file mypy.ini]
\[mypy]
strict = True
\[mypy-tests.*]
allow_untyped_defs = True
allow_untyped_calls = True
disable_error_code = var-annotated
[case testPerModuleErrorCodesOverride]
# flags: --config-file tmp/mypy.ini
import tests.foo
import bar
[file bar.py]
def foo() -> int: ...
if foo: ... # E: Function "foo" could always be true in boolean context
42 + "no" # type: ignore # E: "type: ignore" comment without error code (consider "type: ignore[operator]" instead)
[file tests/__init__.py]
[file tests/foo.py]
def foo() -> int: ...
if foo: ... # E: Function "foo" could always be true in boolean context
42 + "no" # type: ignore
[file mypy.ini]
\[mypy]
enable_error_code = ignore-without-code, truthy-bool, used-before-def
\[mypy-tests.*]
disable_error_code = ignore-without-code
[case testShowErrorCodes]
# flags: --show-error-codes
x: int = "" # E: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
[case testHideErrorCodes]
# flags: --hide-error-codes
x: int = "" # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[case testTypeVarTupleDisabled_no_incomplete]
from typing_extensions import TypeVarTuple
Ts = TypeVarTuple("Ts") # E: "TypeVarTuple" support is experimental, use --enable-incomplete-feature=TypeVarTuple to enable
[builtins fixtures/tuple.pyi]
[case testTypeVarTupleEnabled_no_incomplete]
# flags: --enable-incomplete-feature=TypeVarTuple
from typing_extensions import TypeVarTuple
Ts = TypeVarTuple("Ts") # OK
[builtins fixtures/tuple.pyi]
[case testDisableBytearrayPromotion]
# flags: --disable-bytearray-promotion
def f(x: bytes) -> None: ...
f(bytearray(b"asdf")) # E: Argument 1 to "f" has incompatible type "bytearray"; expected "bytes"
f(memoryview(b"asdf"))
[builtins fixtures/primitives.pyi]
[case testDisableMemoryviewPromotion]
# flags: --disable-memoryview-promotion
def f(x: bytes) -> None: ...
f(bytearray(b"asdf"))
f(memoryview(b"asdf")) # E: Argument 1 to "f" has incompatible type "memoryview"; expected "bytes"
[builtins fixtures/primitives.pyi]
[case testDisableBytearrayMemoryviewPromotionStrictEquality]
# flags: --disable-bytearray-promotion --disable-memoryview-promotion --strict-equality
def f(x: bytes, y: bytearray, z: memoryview) -> None:
x == y
y == z
x == z
97 in x
97 in y
97 in z
x in y
x in z
[builtins fixtures/primitives.pyi]
[case testEnableBytearrayMemoryviewPromotionStrictEquality]
# flags: --strict-equality
def f(x: bytes, y: bytearray, z: memoryview) -> None:
x == y
y == z
x == z
97 in x
97 in y
97 in z
x in y
x in z
[builtins fixtures/primitives.pyi]
[case testNoCrashFollowImportsForStubs]
# flags: --config-file tmp/mypy.ini
{**{"x": "y"}}
[file mypy.ini]
\[mypy]
follow_imports = skip
follow_imports_for_stubs = true
[builtins fixtures/dict.pyi]
[case testReturnAnyLambda]
# flags: --warn-return-any
from typing import Any, Callable
def cb(f: Callable[[int], int]) -> None: ...
a: Any
cb(lambda x: a) # OK
fn = lambda x: a
cb(fn)
[case testShowErrorCodeLinks]
# flags: --show-error-codes --show-error-code-links
x: int = "" # E: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
list(1) # E: No overload variant of "list" matches argument type "int" [call-overload] \
# N: Possible overload variants: \
# N: def [T] __init__(self) -> List[T] \
# N: def [T] __init__(self, x: Iterable[T]) -> List[T] \
# N: See https://mypy.rtfd.io/en/stable/_refs.html#code-call-overload for more info
list(2) # E: No overload variant of "list" matches argument type "int" [call-overload] \
# N: Possible overload variants: \
# N: def [T] __init__(self) -> List[T] \
# N: def [T] __init__(self, x: Iterable[T]) -> List[T]
[builtins fixtures/list.pyi]