blob: 646e4f0bafb3f1db71beaeb93158f556a31d36b5 [file] [log] [blame] [edit]
-- Type checker test cases dealing with modules and imports.
-- Towards the end there are tests for PEP 420 (namespace packages, i.e. __init__.py-less packages).
[case testAccessImportedDefinitions]
import m
import typing
m.f() # E: Too few arguments for "f"
m.f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
m.x = object() # E: Incompatible types in assignment (expression has type "object", variable has type "A")
m.f(m.A())
m.x = m.A()
[file m.py]
class A: pass
def f(a: A) -> None: pass
x = A()
[case testAccessImportedDefinitions]
import m
import typing
m.f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
m.f(m.A())
[file m.py]
class A: pass
def f(a: A) -> None: pass
[case testAccessImportedDefinitions2]
from m import f, A
import typing
f(object()) # E: Argument 1 to "f" has incompatible type "object"; expected "A"
f(A())
[file m.py]
class A: pass
def f(a: A) -> None: pass
[case testImportedExceptionType]
import m
import typing
try:
pass
except m.Err:
pass
except m.Bad: # E: Exception type must be derived from BaseException
pass
[file m.py]
class Err(BaseException): pass
class Bad: pass
[builtins fixtures/exception.pyi]
[case testImportedExceptionType2]
from m import Err, Bad
import typing
try:
pass
except Err:
pass
except Bad: # E: Exception type must be derived from BaseException
pass
[file m.py]
class Err(BaseException): pass
class Bad: pass
[builtins fixtures/exception.pyi]
[case testImportWithinBlock]
import typing
if 1:
import m
m.a = m.b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
m.a = m.a
m.f()
m.f(m.a) # E: Too many arguments for "f"
m.a = m.A()
m.a = m.B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[file m.py]
class A: pass
class B: pass
a = A()
b = B()
def f() -> None: pass
[case testImportWithinFunction]
import typing
def f() -> None:
from m import a, b, f, A, B
if int():
a = b \
# E: Incompatible types in assignment (expression has type "B", variable has type "A")
a = a
f()
f(a) # E: Too many arguments for "f"
a = A()
a = B() \
# E: Incompatible types in assignment (expression has type "B", variable has type "A")
[file m.py]
class A: pass
class B: pass
a = A()
b = B()
def f() -> None: pass
[out]
[case testImportWithinMethod]
import typing
class C:
def f(self) -> None:
from m import *
if int():
a = b # E: Incompatible types in assignment (expression has type "B", variable has type "A")
a = a
f()
f(a) # E: Too many arguments for "f"
a = A()
a = B() # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[file m.py]
class A: pass
class B: pass
a = A()
b = B()
def f() -> None: pass
[out]
[case testImportWithinClassBody]
import typing
class C:
import m
m.f()
m.f(C) # E: Too many arguments for "f"
[file m.py]
def f() -> None: pass
[out]
[case testImportWithinClassBody2]
import typing
class C:
from m import f
f()
f(C) # E: Too many arguments for "f"
[file m.py]
def f() -> None: pass
[out]
[case testImportWithStub]
import _m
_m.f("hola")
[file _m.pyi]
def f(c:str) -> None: pass
[out]
[case testImportWithStubIncompatibleType]
import _m
_m.f("hola")
_m.f(12) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
[file _m.py]
def f(c):
print(c)
[file _m.pyi]
def f(c:str) -> None: pass
[case testInvalidOperationsOnModules]
import m
import typing
class A: pass
m() # E: Module not callable
a = m # type: A # E: Incompatible types in assignment (expression has type Module, variable has type "A")
m + None # E: Unsupported left operand type for + (Module)
[file m.py]
[builtins fixtures/module.pyi]
[case testNameDefinedInDifferentModule]
import m, n
import typing
m.x # E: Module has no attribute "x"
[file m.py]
y = object()
[file n.py]
x = object()
[builtins fixtures/module.pyi]
[case testChainedAssignmentAndImports]
import m
i, s = None, None # type: (int, str)
if int():
i = m.x
if int():
i = m.y
if int():
s = m.x # E: Incompatible types in assignment (expression has type "int", variable has type "str")
if int():
s = m.y # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file m.py]
x = y = 1
[builtins fixtures/primitives.pyi]
[case testConditionalFunctionDefinitionAndImports]
import m
import typing
m.f(1)
m.f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
[file m.py]
x = object()
if x:
def f(x: int) -> None: pass
else:
def f(x: int) -> None: pass
[case testTypeCheckWithUnknownModule]
import nonexistent
None + ''
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
[case testTypeCheckWithUnknownModule2]
import m, nonexistent
None + ''
m.x = 1
m.x = ''
[file m.py]
x = 1
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
[case testTypeCheckWithUnknownModule3]
import nonexistent, m
None + ''
m.x = 1
m.x = ''
[file m.py]
x = 1
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
main:4: error: Incompatible types in assignment (expression has type "str", variable has type "int")
[case testTypeCheckWithUnknownModule4]
import nonexistent, another
None + ''
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:1: error: Cannot find implementation or library stub for module named 'another'
main:2: error: Unsupported left operand type for + ("None")
[case testTypeCheckWithUnknownModule5]
import nonexistent as x
None + ''
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
[case testTypeCheckWithUnknownModuleUsingFromImport]
from nonexistent import x
None + ''
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
[case testTypeCheckWithUnknownModuleUsingImportStar]
from nonexistent import *
None + ''
[out]
main:1: error: Cannot find implementation or library stub for module named 'nonexistent'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Unsupported left operand type for + ("None")
[case testAccessingUnknownModule]
import xyz
xyz.foo()
xyz()
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testAccessingUnknownModule2]
import xyz, bar
xyz.foo()
bar()
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:1: error: Cannot find implementation or library stub for module named 'bar'
[case testAccessingUnknownModule3]
import xyz as z
xyz.foo()
z()
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Name 'xyz' is not defined
[case testAccessingNameImportedFromUnknownModule]
from xyz import y, z
y.foo()
z()
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testAccessingNameImportedFromUnknownModule2]
from xyz import *
y
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Name 'y' is not defined
[case testAccessingNameImportedFromUnknownModule3]
from xyz import y as z
y
z
[out]
main:1: error: Cannot find implementation or library stub for module named 'xyz'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:2: error: Name 'y' is not defined
[case testUnknownModuleRedefinition]
# Error messages differ with the new analyzer
import xab # E: Cannot find implementation or library stub for module named 'xab' # N: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
def xab(): pass # E: Name 'xab' already defined (possibly by an import)
[case testAccessingUnknownModuleFromOtherModule]
import x
x.nonexistent.foo
x.z
[file x.py]
import nonexistent
[builtins fixtures/module.pyi]
[out]
tmp/x.py:1: error: Cannot find implementation or library stub for module named 'nonexistent'
tmp/x.py:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:3: error: Module has no attribute "z"
[case testUnknownModuleImportedWithinFunction]
def f():
import foobar
def foobar(): pass
foobar('')
[out]
main:2: error: Cannot find implementation or library stub for module named 'foobar'
main:2: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:4: error: Too many arguments for "foobar"
[case testUnknownModuleImportedWithinFunction2]
def f():
from foobar import x
def x(): pass
x('')
[out]
main:2: error: Cannot find implementation or library stub for module named 'foobar'
main:2: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:4: error: Too many arguments for "x"
[case testRelativeImports]
import typing
import m.a
m.a.x = m.a.y # Error
[file m/__init__.py]
[file m/a.py]
import typing
from .b import A, B, x, y
z = x
if int():
z = y # Error
[file m/b.py]
import typing
class A: pass
class B: pass
x = A()
y = B()
[out]
tmp/m/a.py:5: error: Incompatible types in assignment (expression has type "B", variable has type "A")
main:3: error: Incompatible types in assignment (expression has type "B", variable has type "A")
[case testRelativeImports2]
import typing
import m.a
m.a.x = m.a.y # E: Incompatible types in assignment (expression has type "B", variable has type "A")
[file m/__init__.py]
[file m/a.py]
import typing
from .b import A, B, x, y
[file m/b.py]
import typing
class A: pass
class B: pass
x = A()
y = B()
[case testExportedValuesInImportAll]
import typing
from m import *
_ = a
_ = b
_ = c
_ = d
_ = e
_ = f # E: Name 'f' is not defined
_ = _g # E: Name '_g' is not defined
[file m.py]
__all__ = ['a']
__all__ += ('b',)
__all__.append('c')
__all__.extend(('d', 'e'))
a = b = c = d = e = f = _g = 1
[builtins fixtures/module_all.pyi]
[case testAllMustBeSequenceStr]
import typing
__all__ = [1, 2, 3]
[builtins fixtures/module_all.pyi]
[out]
main:2: error: Type of __all__ must be "Sequence[str]", not "List[int]"
[case testAllMustBeSequenceStr_python2]
import typing
__all__ = [1, 2, 3]
[builtins_py2 fixtures/module_all_python2.pyi]
[out]
main:2: error: Type of __all__ must be "Sequence[unicode]", not "List[int]"
[case testAllUnicodeSequenceOK_python2]
import typing
__all__ = [u'a', u'b', u'c']
[builtins_py2 fixtures/module_all_python2.pyi]
[out]
[case testUnderscoreExportedValuesInImportAll]
import typing
from m import *
_ = a
_ = _b
_ = __c__
_ = ___d
_ = e
_ = f # E: Name 'f' is not defined
_ = _g # E: Name '_g' is not defined
[file m.py]
__all__ = ['a']
__all__ += ('_b',)
__all__.append('__c__')
__all__.extend(('___d', 'e'))
a = _b = __c__ = ___d = e = f = _g = 1
[builtins fixtures/module_all.pyi]
[case testEllipsisInitializerInStubFileWithType]
import m
m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[file m.pyi]
x = ... # type: int
[case testEllipsisInitializerInStubFileWithoutType]
import m
m.x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "ellipsis")
[file m.pyi]
# Ellipsis is only special with a # type: comment (not sure though if this is great)
x = ...
[case testEllipsisInitializerInModule]
x = ... # type: int # E: Incompatible types in assignment (expression has type "ellipsis", variable has type "int")
[case testEllipsisDefaultArgValueInStub]
import m
m.f(1)
m.f('') # E: Argument 1 to "f" has incompatible type "str"; expected "int"
[file m.pyi]
def f(x: int = ...) -> None: pass
[case testEllipsisDefaultArgValueInStub2]
import m
def f1(x: int = ...) -> int: return 1
def f2(x: int = '') -> int: return 1
[file m.pyi]
def g1(x: int = ...) -> int: pass
def g2(x: int = '') -> int: pass
[out]
tmp/m.pyi:2: error: Incompatible default for argument "x" (default has type "str", argument has type "int")
main:2: error: Incompatible default for argument "x" (default has type "ellipsis", argument has type "int")
main:3: error: Incompatible default for argument "x" (default has type "str", argument has type "int")
[case testEllipsisDefaultArgValueInNonStub]
def ok_1(x: int = ...) -> None: pass
def ok_2(x: int = ...) -> None: ...
def ok_3(x: int = ...) -> None: raise NotImplementedError
def ok_4(x: int = ...) -> None: raise NotImplementedError()
def ok_5(x: int = ...) -> None:
"""Docstring here"""
pass
def bad_1(x: int = ...) -> None: 1 # E: Incompatible default for argument "x" (default has type "ellipsis", argument has type "int")
def bad_2(x: int = ...) -> None: # E: Incompatible default for argument "x" (default has type "ellipsis", argument has type "int")
"""Docstring here"""
ok_1()
def bad_3(x: int = ...) -> None: # E: Incompatible default for argument "x" (default has type "ellipsis", argument has type "int")
raise Exception("Some other exception")
[builtins fixtures/exception.pyi]
[out]
[case testEllipsisDefaultArgValueInNonStubsOverload]
from typing import overload, Union
Both = Union[int, str]
@overload
def foo(x: int, y: int = ...) -> int: ...
@overload
def foo(x: str, y: str = ...) -> str: ...
def foo(x: Both, y: Both = ...) -> Both: # E: Incompatible default for argument "y" (default has type "ellipsis", argument has type "Union[int, str]")
return x
@overload
def bar(x: int, y: int = ...) -> int: ...
@overload
def bar(x: str, y: str = ...) -> str: ...
def bar(x: Both, y: Both = ...) -> Both:
raise NotImplementedError
[builtins fixtures/exception.pyi]
[out]
[case testEllipsisDefaultArgValueInNonStubsMethods]
from typing import Generic, TypeVar
from typing_extensions import Protocol
from abc import abstractmethod
T = TypeVar('T')
class Wrap(Generic[T]): ...
class MyProtocol(Protocol):
def no_impl(self, x: Wrap[int] = ...) -> int: ...
def default_impl(self, x: Wrap[int] = ...) -> int: return 3 # E: Incompatible default for argument "x" (default has type "ellipsis", argument has type "Wrap[int]")
class MyAbstractClass:
@abstractmethod
def no_impl(self, x: Wrap[int] = ...) -> int: raise NotImplementedError
@abstractmethod
def default_impl(self, x: Wrap[int] = ...) -> int: return 3 # E: Incompatible default for argument "x" (default has type "ellipsis", argument has type "Wrap[int]")
[builtins fixtures/exception.pyi]
[out]
[case testStarImportOverlapping]
from m1 import *
from m2 import *
j = ''
[file m1.py]
x = 1
[file m2.py]
x = 1
[case testStarImportOverlappingMismatch]
from m1 import *
from m2 import * # E: Incompatible import of "x" (imported name has type "int", local name has type "str")
j = ''
[file m1.py]
x = ''
[file m2.py]
x = 1
[case testStarImportOverridingLocalImports-skip]
from m1 import *
from m2 import *
x = '' # E: TODO (cannot assign str to int)
[file m1.py]
x = 1
[file m2.py]
x = 1
[case testAssignToFuncDefViaImport]
# flags: --strict-optional
# Errors differ with the new analyzer. (Old analyzer gave error on the
# input, which is maybe better, but no error about f, which seems
# wrong)
from m import *
f = None # E: Incompatible types in assignment (expression has type "None", variable has type "Callable[[], Any]")
x = '' # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[file m.py]
def f(): pass
x = 1+0
[out]
-- Conditional definitions and function redefinitions via module object
-- --------------------------------------------------------------------
[case testConditionalImportAndAssign]
try:
from m import x
except:
x = None
try:
from m import x as y
except:
y = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file m.py]
x = ''
[case testAssignAndConditionalImport]
x = ''
try:
from m import x
except:
pass
y = 1
try:
from m import x as y # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
except:
pass
[file m.py]
x = ''
[case testAssignAndConditionalStarImport]
x = ''
y = 1
try:
from m import * # E: Incompatible import of "y" (imported name has type "str", local name has type "int")
except:
pass
[file m.py]
x = ''
y = ''
[case testRedefineImportedFunctionViaImport]
try:
from m import f, g
except:
def f(x): pass
def g(x): pass # E: All conditional function variants must have identical signatures
[file m.py]
def f(x): pass
def g(x, y): pass
[case testImportedVariableViaImport]
try:
from m import x
except:
from n import x # E: Incompatible import of "x" (imported name has type "str", local name has type "int")
[file m.py]
x = 1
[file n.py]
x = ''
[case testRedefineFunctionViaImport]
def f(x): pass
def g(x): pass
try:
from m import f, g # E: Incompatible import of "g" (imported name has type "Callable[[Any, Any], Any]", local name has type "Callable[[Any], Any]")
except:
pass
[file m.py]
def f(x): pass
def g(x, y): pass
[case testImportVariableAndAssignNone]
try:
from m import x
except:
x = None
[file m.py]
x = 1
[case testImportFunctionAndAssignNone]
try:
from m import f
except:
f = None
[file m.py]
def f(): pass
[case testImportFunctionAndAssignFunction]
def g(x): pass
try:
from m import f
except:
f = g
[file m.py]
def f(x): pass
[case testImportFunctionAndAssignIncompatible]
try:
from m import f
except:
f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "Callable[[], Any]")
[file m.py]
def f(): pass
[case testAssignToFuncDefViaGlobalDecl2]
import typing
from m import f
def g() -> None:
global f
f = None
if int():
f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "Callable[[], Any]")
[file m.py]
def f(): pass
[out]
[case testAssignToFuncDefViaNestedModules]
import m.n
m.n.f = None
m.n.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "Callable[[], Any]")
[file m/__init__.py]
[file m/n.py]
def f(): pass
[out]
[case testAssignToFuncDefViaModule]
import m
m.f = None
m.f = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "Callable[[], Any]")
[file m.py]
def f(): pass
[out]
[case testConditionalImportAndAssignNoneToModule]
if object():
import m
else:
m = None
m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
[file m.py]
def f(x: str) -> None: pass
[builtins fixtures/module.pyi]
[out]
[case testConditionalImportAndAssignInvalidToModule]
if object():
import m
else:
m = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Module)
[file m.py]
[builtins fixtures/module.pyi]
[out]
[case testImportAndAssignToModule]
import m
m = None
m.f(1) # E: Argument 1 to "f" has incompatible type "int"; expected "str"
[file m.py]
def f(x: str) -> None: pass
[builtins fixtures/module.pyi]
[out]
-- Test cases that simulate 'mypy -m modname'
--
-- The module name to import is encoded in a comment.
[case testTypeCheckNamedModule]
# cmd: mypy -m m.a
[file m/__init__.py]
None + 1
[file m/a.py]
[out]
tmp/m/__init__.py:1: error: Unsupported left operand type for + ("None")
[case testTypeCheckNamedModule2]
# cmd: mypy -m m.a
[file m/__init__.py]
[file m/a.py]
None + 1
[out]
tmp/m/a.py:1: error: Unsupported left operand type for + ("None")
[case testTypeCheckNamedModule3]
# cmd: mypy -m m
[file m/__init__.py]
None + 1
[file m/a.py]
[out]
tmp/m/__init__.py:1: error: Unsupported left operand type for + ("None")
[case testTypeCheckNamedModule4]
# cmd: mypy -m m
[file m/__init__.py]
[file m/a.py]
None + 1 # Not analyzed.
[out]
[case testTypeCheckNamedModule5]
# cmd: mypy -m m
None + '' # Not analyzed.
[file m.py]
None + 1
[out]
tmp/m.py:1: error: Unsupported left operand type for + ("None")
[case testTypeCheckNamedModuleWithImportCycle]
# cmd: mypy -m m.a
None + 1 # Does not generate error, as this file won't be analyzed.
[file m/__init__.py]
import m.a
[file m/a.py]
[out]
[case testCheckDecoratedFuncAsAnnotWithImportCycle]
import a
[file a.py]
from typing import TypeVar
import b
T = TypeVar('T')
def idf(x: T) -> T: return x
@idf
def Session() -> None: pass
[file b.py]
MYPY = False
if MYPY:
from a import Session
def f(self, session: Session) -> None: # E: Function "a.Session" is not valid as a type \
# N: Perhaps you need "Callable[...]" or a callback protocol?
pass
[builtins fixtures/bool.pyi]
-- Checks dealing with submodules and different kinds of imports
-- -------------------------------------------------------------
[case testSubmoduleRegularImportAddsAllParents]
import a.b.c
reveal_type(a.value) # N: Revealed type is 'builtins.int'
reveal_type(a.b.value) # N: Revealed type is 'builtins.str'
reveal_type(a.b.c.value) # N: Revealed type is 'builtins.float'
b.value # E: Name 'b' is not defined
c.value # E: Name 'c' is not defined
[file a/__init__.py]
value = 3
[file a/b/__init__.py]
value = "a"
[file a/b/c.py]
value = 3.2
[out]
[case testSubmoduleImportAsDoesNotAddParents]
import a.b.c as foo
reveal_type(foo.value) # N: Revealed type is 'builtins.float'
a.value # E: Name 'a' is not defined
b.value # E: Name 'b' is not defined
c.value # E: Name 'c' is not defined
[file a/__init__.py]
value = 3
[file a/b/__init__.py]
value = "a"
[file a/b/c.py]
value = 3.2
[out]
[case testSubmoduleImportFromDoesNotAddParents]
from a import b
reveal_type(b.value) # N: Revealed type is 'builtins.str'
b.c.value # E: Module has no attribute "c"
a.value # E: Name 'a' is not defined
[file a/__init__.py]
value = 3
[file a/b/__init__.py]
value = "a"
[file a/b/c.py]
value = 3.2
[builtins fixtures/module.pyi]
[out]
[case testSubmoduleImportFromDoesNotAddParents2]
from a.b import c
reveal_type(c.value) # N: Revealed type is 'builtins.float'
a.value # E: Name 'a' is not defined
b.value # E: Name 'b' is not defined
[file a/__init__.py]
value = 3
[file a/b/__init__.py]
value = "a"
[file a/b/c.py]
value = 3.2
[out]
[case testSubmoduleRegularImportNotDirectlyAddedToParent]
import a.b.c
def accept_float(x: float) -> None: pass
accept_float(a.b.c.value)
[file a/__init__.py]
value = 3
b.value
a.b.value
[file a/b/__init__.py]
value = "a"
c.value
a.b.c.value
[file a/b/c.py]
value = 3.2
[out]
tmp/a/b/__init__.py:2: error: Name 'c' is not defined
tmp/a/b/__init__.py:3: error: Name 'a' is not defined
tmp/a/__init__.py:2: error: Name 'b' is not defined
tmp/a/__init__.py:3: error: Name 'a' is not defined
[case testSubmoduleMixingLocalAndQualifiedNames]
from a.b import MyClass
val1 = None # type: a.b.MyClass # E: Name 'a' is not defined
val2 = None # type: MyClass
[file a/__init__.py]
[file a/b.py]
class MyClass: pass
[out]
[case testSubmoduleMixingImportFrom]
import parent.child
[file parent/__init__.py]
[file parent/common.py]
class SomeClass: pass
[file parent/child.py]
from parent.common import SomeClass
from parent import common
foo = parent.common.SomeClass()
[builtins fixtures/module.pyi]
[out]
tmp/parent/child.py:3: error: Name 'parent' is not defined
[case testSubmoduleMixingImportFromAndImport]
import parent.child
[file parent/__init__.py]
[file parent/common.py]
class SomeClass: pass
[file parent/unrelated.py]
class ShouldNotLoad: pass
[file parent/child.py]
from parent.common import SomeClass
import parent
# Note, since this might be unintuitive -- when `parent.common` is loaded in any way,
# shape, or form, it's added to `parent`'s namespace, which is why the below line
# succeeds.
foo = parent.common.SomeClass()
reveal_type(foo)
bar = parent.unrelated.ShouldNotLoad()
[builtins fixtures/module.pyi]
[out]
tmp/parent/child.py:8: note: Revealed type is 'parent.common.SomeClass'
tmp/parent/child.py:9: error: Module has no attribute "unrelated"
[case testSubmoduleMixingImportFromAndImport2]
import parent.child
[file parent/__init__.py]
[file parent/common.py]
class SomeClass: pass
[file parent/child.py]
from parent import common
import parent
foo = parent.common.SomeClass()
reveal_type(foo)
[builtins fixtures/module.pyi]
[out]
tmp/parent/child.py:4: note: Revealed type is 'parent.common.SomeClass'
-- Tests repeated imports
[case testIdenticalImportFromTwice]
from a import x, y, z
from b import x, y, z
[file a.py]
from common import x, y, z
[file b.py]
from common import x, y, z
[file common.py]
x = 3
def y() -> int: return 3
class z: pass
[out]
[case testIdenticalImportStarTwice]
from a import *
from b import *
[file a.py]
from common import x, y, z
[file b.py]
from common import x, y, z
[file common.py]
x = 3
def y() -> int: return 3
class z: pass
[out]
[case testDifferentImportSameNameTwice]
from a import x, y, z
from b import x, y, z
[file a.py]
x = 3
def y() -> int: return 1
class z: pass
[file b.py]
x = "foo"
def y() -> str: return "foo"
class z: pass
[out]
main:2: error: Incompatible import of "x" (imported name has type "str", local name has type "int")
main:2: error: Incompatible import of "y" (imported name has type "Callable[[], str]", local name has type "Callable[[], int]")
main:2: error: Incompatible import of "z" (imported name has type "Type[b.z]", local name has type "Type[a.z]")
-- Misc
[case testInheritFromBadImport]
# cmd: mypy -m bar
[file foo.py]
pass
[file bar.py]
from foo import B
class C(B):
pass
[out]
tmp/bar.py:1: error: Module 'foo' has no attribute 'B'
[case testImportSuppressedWhileAlmostSilent]
# cmd: mypy -m main
# flags: --follow-imports=error
[file main.py]
import mod
[file mod.py]
[builtins fixtures/module.pyi]
[out]
tmp/main.py:1: error: Import of 'mod' ignored
tmp/main.py:1: note: (Using --follow-imports=error, module not passed on command line)
[case testAncestorSuppressedWhileAlmostSilent]
# cmd: mypy -m foo.bar
# flags: --follow-imports=error
[file foo/bar.py]
[file foo/__init__.py]
[builtins fixtures/module.pyi]
[out]
tmp/foo/bar.py: error: Ancestor package 'foo' ignored
tmp/foo/bar.py: note: (Using --follow-imports=error, submodule passed on command line)
[case testStubImportNonStubWhileSilent]
# cmd: mypy -m main
# flags: --follow-imports=skip
[file main.py]
from stub import x, z # Followed
from other import y # Not followed
x + '' # No error here
y + '' # No error here
z + '' # Error here
[file stub.pyi]
from non_stub import x as x # this import is not followed
z = 42
[file non_stub.py]
x = 42
x + '' # no error because file is not analyzed
[file other.py]
y = 42
[builtins fixtures/module.pyi]
[out]
tmp/main.py:5: error: Unsupported left operand type for + ("int")
[case testSilentSubmoduleImport]
# cmd: mypy -m foo
# flags: --follow-imports=skip
[file foo/__init__.py]
from foo import bar
[file foo/bar.py]
pass
[case testImportReExportFromChildrenInCycle1]
# cmd: mypy -m project.root project.study.a project.neighbor
[file project/__init__.py]
from project.study import CustomType
x = 10
[file project/root.py]
[file project/study/__init__.py]
from project.study.a import CustomType
[file project/study/a.py]
from project import root
# TODO (#4498): This test is basically testing the `all_are_submodules` logic
# in build, which skips generating a dependency to a module if
# everything in it is a submodule. But that is still all just a
# workaround for bugs in cycle handling. If we uncomment the next
# line, we'll still break:
# from project import x
CustomType = str
[file project/neighbor/__init__.py]
from project.study import CustomType
def m(arg: CustomType) -> str:
return 'test'
[case testImportReExportFromChildrenInCycle2]
# cmd: mypy -m project project.b project.ba project.c
# See comments in above test about this being a workaround.
[file foo.py]
def get_foo() -> int: return 12
[file project/ba.py]
from . import b
b.FOO
[file project/b.py]
import foo
from . import c
FOO = foo.get_foo()
[file project/c.py]
[file project/__init__.py]
from . import ba
[case testSuperclassInImportCycle]
import a
import d
a.A().f(d.D())
[file a.py]
if 0:
import d
class B: pass
class C(B): pass
class A:
def f(self, x: B) -> None: pass
[file d.py]
import a
class D(a.C): pass
[case testSuperclassInImportCycleReversedImports]
import d
import a
a.A().f(d.D())
[file a.py]
if 0:
import d
class B: pass
class C(B): pass
class A:
def f(self, x: B) -> None: pass
[file d.py]
import a
class D(a.C): pass
[case testPreferPackageOverFile]
import a
[file a.py]
/ # intentional syntax error -- this file shouldn't be parsed
[file a/__init__.py]
pass
[out]
[case testPreferPackageOverFile2]
from a import x
[file a.py]
/ # intentional syntax error -- this file shouldn't be parsed
[file a/__init__.py]
x = 0
[out]
[case testImportInClass]
class C:
import foo
reveal_type(C.foo.bar) # N: Revealed type is 'builtins.int'
[file foo.py]
bar = 0
[builtins fixtures/module.pyi]
[out]
[case testIfFalseImport]
if False:
import a
def f(x: 'a.A') -> int:
return x.f()
[file a.py]
class A:
def f(self) -> int:
return 0
[builtins fixtures/bool.pyi]
-- Test stability under import cycles
-- ----------------------------------
-- The first two tests are identical except one main has 'import x'
-- and the other 'import y'. Previously (before build.order_ascc()
-- was added) one of these would fail because the imports were
-- processed in the (reverse) order in which the files were
-- encountered.
[case testImportCycleStability1]
import x
[file x.py]
def f() -> str: return ''
class Base:
attr = f()
def foo():
import y
[file y.py]
import x
class Sub(x.Base):
attr = x.Base.attr
[out]
[case testImportCycleStability2]
import y
[file x.py]
def f() -> str: return ''
class Base:
attr = f()
def foo():
import y
[file y.py]
import x
class Sub(x.Base):
attr = x.Base.attr
[out]
-- This case isn't fixed by order_ascc(), but is fixed by the
-- lightweight type inference added to semanal.py
-- (analyze_simple_literal_type()).
[case testImportCycleStability3]
import y
[file x.py]
class Base:
pass
def foo() -> int:
import y
reveal_type(y.Sub.attr)
return y.Sub.attr
[file y.py]
import x
class Sub(x.Base):
attr = 0
[out]
tmp/x.py:5: note: Revealed type is 'builtins.int'
-- This case has a symmetrical cycle, so it doesn't matter in what
-- order the files are processed. It depends on the lightweight type
-- interference.
[case testImportCycleStability4]
import x
[file x.py]
import y
class C:
attr = ''
def foo() -> int:
return y.D.attr
[file y.py]
import x
class D:
attr = 0
def bar() -> str:
return x.C.attr
-- These cases test all supported literal types.
[case testImportCycleStability5]
import y
[file x.py]
class Base:
pass
def foo() -> None:
import y
i = y.Sub.iattr # type: int
f = y.Sub.fattr # type: float
s = y.Sub.sattr # type: str
b = y.Sub.battr # type: bytes
[file y.py]
import x
class Sub(x.Base):
iattr = 0
fattr = 0.0
sattr = ''
battr = b''
[out]
[case testImportCycleStability6_python2]
import y
[file x.py]
class Base:
pass
def foo():
# type: () -> None
import y
i = y.Sub.iattr # type: int
f = y.Sub.fattr # type: float
s = y.Sub.sattr # type: str
u = y.Sub.uattr # type: unicode
[file y.py]
import x
class Sub(x.Base):
iattr = 0
fattr = 0.0
sattr = ''
uattr = u''
[out]
-- This case tests module-level variables.
[case testImportCycleStability7]
import x
[file x.py]
def foo() -> int:
import y
reveal_type(y.value)
return y.value
[file y.py]
import x
value = 12
[out]
tmp/x.py:3: note: Revealed type is 'builtins.int'
-- This is not really cycle-related but still about the lightweight
-- type checker.
[case testImportCycleStability8]
x = 1 # type: str
reveal_type(x)
[out]
main:1: error: Incompatible types in assignment (expression has type "int", variable has type "str")
main:2: note: Revealed type is 'builtins.str'
-- Tests for cross-module second_pass checking.
[case testSymmetricImportCycle1]
import a
[file a.py]
import b
def f() -> int:
return b.x
y = 0 + 0
[file b.py]
import a
def g() -> int:
reveal_type(a.y)
return a.y
x = 1 + 1
[out]
tmp/b.py:3: note: Revealed type is 'builtins.int'
[case testSymmetricImportCycle2]
import b
[file a.py]
import b
def f() -> int:
reveal_type(b.x)
return b.x
y = 0 + 0
[file b.py]
import a
def g() -> int:
return a.y
x = 1 + 1
[out]
tmp/a.py:3: note: Revealed type is 'builtins.int'
[case testThreePassesRequired]
import b
[file a.py]
import b
class C:
def f1(self) -> None:
self.x2
def f2(self) -> None:
self.x2 = b.b
[file b.py]
import a
b = 1 + 1
[out]
tmp/a.py:4: error: Cannot determine type of 'x2'
[case testErrorInPassTwo1]
import b
[file a.py]
import b
def f() -> None:
a = b.x + 1
a + ''
[file b.py]
import a
x = 1 + 1
[out]
tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
[case testErrorInPassTwo2]
import a
[file a.py]
import b
def f() -> None:
a = b.x + 1
a + ''
[file b.py]
import a
x = 1 + 1
[out]
tmp/a.py:4: error: Unsupported operand types for + ("int" and "str")
[case testDeferredDecorator]
import a
[file a.py]
import b
def g() -> None:
f('')
@b.deco
def f(a: str) -> int: pass
reveal_type(f)
x = 1 + 1
[file b.py]
from typing import Callable, TypeVar
import a
T = TypeVar('T')
def deco(f: Callable[[T], int]) -> Callable[[T], int]:
a.x
return f
[out]
tmp/a.py:6: note: Revealed type is 'def (builtins.str*) -> builtins.int'
[case testDeferredClassContext]
class A:
def f(self) -> str: return 'foo'
class B(A):
def f(self) -> str: return self.x
def initialize(self) -> None: self.x = 'bar'
[case testDeferredClassContextUnannotated]
class A:
def f(self) -> str: return 'foo'
class B(A):
def f(self) -> str: return self.x
def initialize(self): self.x = 'bar'
-- Scripts and __main__
[case testScriptsAreModules]
# flags: --scripts-are-modules
[file a]
pass
[file b]
pass
-- Misc
[case testScriptsAreNotModules]
# cmd: mypy a b
[file a]
pass
[file b]
pass
[out]
[case testTypeCheckPrio]
# cmd: mypy -m part1 part2 part3 part4
[file part1.py]
from part3 import Thing
class FirstThing: pass
[file part2.py]
from part4 import part4_thing as Thing
[file part3.py]
from part2 import Thing
reveal_type(Thing)
[file part4.py]
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from part1 import FirstThing
def part4_thing(a: int) -> str: pass
[builtins fixtures/bool.pyi]
[out]
tmp/part3.py:2: note: Revealed type is 'def (a: builtins.int) -> builtins.str'
[case testImportStarAliasAnyList]
import bar
[file bar.py]
from foo import *
def bar(y: AnyAlias) -> None: pass
l = None # type: ListAlias[int]
reveal_type(l)
[file foo.py]
from typing import Any, List
AnyAlias = Any
ListAlias = List
[builtins fixtures/list.pyi]
[out]
tmp/bar.py:5: note: Revealed type is 'builtins.list[builtins.int]'
[case testImportStarAliasSimpleGeneric]
from ex2a import *
def do_something(dic: Row) -> None:
pass
def do_another() -> Row:
return {}
do_something({'good': 'bad'}) # E: Dict entry 0 has incompatible type "str": "str"; expected "str": "int"
reveal_type(do_another()) # N: Revealed type is 'builtins.dict[builtins.str, builtins.int]'
[file ex2a.py]
from typing import Dict
Row = Dict[str, int]
[builtins fixtures/dict.pyi]
[out]
[case testImportStarAliasGeneric]
from y import *
notes = None # type: G[X]
another = G[X]()
second = XT[str]()
last = XT[G]()
reveal_type(notes) # N: Revealed type is 'y.G[y.G[builtins.int]]'
reveal_type(another) # N: Revealed type is 'y.G[y.G*[builtins.int]]'
reveal_type(second) # N: Revealed type is 'y.G[builtins.str*]'
reveal_type(last) # N: Revealed type is 'y.G[y.G*[Any]]'
[file y.py]
from typing import Generic, TypeVar
T = TypeVar('T')
class G(Generic[T]):
pass
X = G[int]
XT = G[T]
[out]
[case testImportStarAliasCallable]
from foo import *
from typing import Any
def bar(x: Any, y: AnyCallable) -> Any:
return 'foo'
cb = None # type: AnyCallable
reveal_type(cb) # N: Revealed type is 'def (*Any, **Any) -> Any'
[file foo.py]
from typing import Callable, Any
AnyCallable = Callable[..., Any]
[out]
[case testRevealType]
import types
def f() -> types.ModuleType:
return types
reveal_type(f()) # N: Revealed type is 'types.ModuleType'
reveal_type(types) # N: Revealed type is 'types.ModuleType'
[builtins fixtures/module.pyi]
[case testClassImportAccessedInMethod]
class C:
import m
def foo(self) -> None:
x = self.m.a
reveal_type(x) # N: Revealed type is 'builtins.str'
# ensure we distinguish self from other variables
y = 'hello'
z = y.m.a # E: "str" has no attribute "m"
@classmethod
def cmethod(cls) -> None:
y = cls.m.a
reveal_type(y) # N: Revealed type is 'builtins.str'
@staticmethod
def smethod(foo: int) -> None:
# we aren't confused by first arg of a staticmethod
y = foo.m.a # E: "int" has no attribute "m"
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testModuleAlias]
import m
m2 = m
reveal_type(m2.a) # N: Revealed type is 'builtins.str'
m2.b # E: Module has no attribute "b"
m2.c = 'bar' # E: Module has no attribute "c"
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testClassModuleAlias]
import m
class C:
x = m
def foo(self) -> None:
reveal_type(self.x.a) # N: Revealed type is 'builtins.str'
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testLocalModuleAlias]
import m
def foo() -> None:
x = m
reveal_type(x.a) # N: Revealed type is 'builtins.str'
class C:
def foo(self) -> None:
x = m
reveal_type(x.a) # N: Revealed type is 'builtins.str'
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testChainedModuleAlias]
import m
m3 = m2 = m
m4 = m3
m5 = m4
reveal_type(m2.a) # N: Revealed type is 'builtins.str'
reveal_type(m3.a) # N: Revealed type is 'builtins.str'
reveal_type(m4.a) # N: Revealed type is 'builtins.str'
reveal_type(m5.a) # N: Revealed type is 'builtins.str'
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testMultiModuleAlias]
import m, n
m2, n2, (m3, n3) = m, n, [m, n]
reveal_type(m2.a) # N: Revealed type is 'builtins.str'
reveal_type(n2.b) # N: Revealed type is 'builtins.str'
reveal_type(m3.a) # N: Revealed type is 'builtins.str'
reveal_type(n3.b) # N: Revealed type is 'builtins.str'
x, y = m # E: 'types.ModuleType' object is not iterable
x, y, z = m, n # E: Need more than 2 values to unpack (3 expected)
x, y = m, m, m # E: Too many values to unpack (2 expected, 3 provided)
x, (y, z) = m, n # E: 'types.ModuleType' object is not iterable
x, (y, z) = m, (n, n, n) # E: Too many values to unpack (2 expected, 3 provided)
[file m.py]
a = 'foo'
[file n.py]
b = 'bar'
[builtins fixtures/module.pyi]
[case testModuleAliasWithExplicitAnnotation]
from typing import Any
import types
import m
mod_mod: types.ModuleType = m
mod_mod2: types.ModuleType
mod_mod2 = m
mod_mod3 = m # type: types.ModuleType
mod_any: Any = m
mod_int: int = m # E: Incompatible types in assignment (expression has type Module, variable has type "int")
reveal_type(mod_mod) # N: Revealed type is 'types.ModuleType'
mod_mod.a # E: Module has no attribute "a"
reveal_type(mod_mod2) # N: Revealed type is 'types.ModuleType'
mod_mod2.a # E: Module has no attribute "a"
reveal_type(mod_mod3) # N: Revealed type is 'types.ModuleType'
mod_mod3.a # E: Module has no attribute "a"
reveal_type(mod_any) # N: Revealed type is 'Any'
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testModuleAliasPassedToFunction]
import types
import m
def takes_module(x: types.ModuleType):
reveal_type(x.__file__) # N: Revealed type is 'builtins.str'
n = m
takes_module(m)
takes_module(n)
[file m.py]
a = 'foo'
[builtins fixtures/module.pyi]
[case testModuleAliasRepeated]
import m, n
if bool():
x = m
else:
x = 3 # E: Incompatible types in assignment (expression has type "int", variable has type Module)
if bool():
y = 3
else:
y = m # E: Incompatible types in assignment (expression has type Module, variable has type "int")
if bool():
z = m
else:
z = n # E: Cannot assign multiple modules to name 'z' without explicit 'types.ModuleType' annotation
[file m.py]
a = 'foo'
[file n.py]
a = 3
[builtins fixtures/module.pyi]
[case testModuleAliasRepeatedWithAnnotation]
import types
import m, n
x: types.ModuleType
if bool():
x = m
else:
x = n
x.a # E: Module has no attribute "a"
reveal_type(x.__file__) # N: Revealed type is 'builtins.str'
[file m.py]
a = 'foo'
[file n.py]
a = 3
[builtins fixtures/module.pyi]
[case testModuleAliasRepeatedComplex]
import m, n, o
x = m
if int():
x = n # E: Cannot assign multiple modules to name 'x' without explicit 'types.ModuleType' annotation
if int():
x = o # E: Cannot assign multiple modules to name 'x' without explicit 'types.ModuleType' annotation
y = o
if int():
y, z = m, n # E: Cannot assign multiple modules to name 'y' without explicit 'types.ModuleType' annotation
xx = m
if int():
xx = m
reveal_type(xx.a) # N: Revealed type is 'builtins.str'
[file m.py]
a = 'foo'
[file n.py]
a = 3
[file o.py]
a = 'bar'
[builtins fixtures/module.pyi]
[case testModuleAliasToOtherModule]
import m, n
m = n # E: Cannot assign multiple modules to name 'm' without explicit 'types.ModuleType' annotation
[file m.py]
[file n.py]
[builtins fixtures/module.pyi]
[case testNoReExportFromStubs]
from stub import Iterable # E: Module 'stub' has no attribute 'Iterable'
from stub import C
c = C()
reveal_type(c.x) # N: Revealed type is 'builtins.int'
it: Iterable[int]
reveal_type(it) # N: Revealed type is 'Any'
[file stub.pyi]
from typing import Iterable
from substub import C as C
def fun(x: Iterable[str]) -> Iterable[int]: pass
[file substub.pyi]
class C:
x: int
[builtins fixtures/module.pyi]
[case testNoReExportFromStubsMemberType]
import stub
c = stub.C()
reveal_type(c.x) # N: Revealed type is 'builtins.int'
it: stub.Iterable[int] # E: Name 'stub.Iterable' is not defined
reveal_type(it) # N: Revealed type is 'Any'
[file stub.pyi]
from typing import Iterable
from substub import C as C
def fun(x: Iterable[str]) -> Iterable[int]: pass
[file substub.pyi]
class C:
x: int
[builtins fixtures/module.pyi]
[case testNoReExportFromStubsMemberVar]
import stub
reveal_type(stub.y) # N: Revealed type is 'builtins.int'
reveal_type(stub.z) # E: Module has no attribute "z" \
# N: Revealed type is 'Any'
[file stub.pyi]
from substub import y as y
from substub import z
[file substub.pyi]
y = 42
z: int
[builtins fixtures/module.pyi]
[case testReExportChildStubs]
import mod
from mod import submod
reveal_type(mod.x) # N: Revealed type is 'mod.submod.C'
y = submod.C()
reveal_type(y.a) # N: Revealed type is 'builtins.str'
[file mod/__init__.pyi]
from . import submod
x: submod.C
[file mod/submod.pyi]
class C:
a: str
[builtins fixtures/module.pyi]
[case testReExportChildStubs2]
import mod.submod
y = mod.submod.C()
reveal_type(y.a) # N: Revealed type is 'builtins.str'
[file mod/__init__.pyi]
from . import submod
x: submod.C
[file mod/submod.pyi]
class C:
a: str
[builtins fixtures/module.pyi]
[case testNoReExportChildStubs]
import mod
from mod import C, D # E: Module 'mod' has no attribute 'C'
reveal_type(mod.x) # N: Revealed type is 'mod.submod.C'
mod.C # E: Module has no attribute "C"
y = mod.D()
reveal_type(y.a) # N: Revealed type is 'builtins.str'
[file mod/__init__.pyi]
from .submod import C, D as D
x: C
[file mod/submod.pyi]
class C: pass
class D:
a: str
[builtins fixtures/module.pyi]
[case testNoReExportNestedStub]
from stub import substub # E: Module 'stub' has no attribute 'substub'
[file stub.pyi]
import substub
[file substub.pyi]
x = 42
[file mod/submod.pyi]
[case testModuleAliasToQualifiedImport]
import package.module
alias = package.module
reveal_type(alias.whatever('/')) # N: Revealed type is 'builtins.str*'
[file package/__init__.py]
[file package/module.py]
from typing import TypeVar
T = TypeVar('T')
def whatever(x: T) -> T: pass
[builtins fixtures/module.pyi]
[case testModuleAliasToQualifiedImport2]
import mod
import othermod
alias = mod.submod
reveal_type(alias.whatever('/')) # N: Revealed type is 'builtins.str*'
if int():
alias = othermod # E: Cannot assign multiple modules to name 'alias' without explicit 'types.ModuleType' annotation
[file mod.py]
import submod
[file submod.py]
from typing import TypeVar
T = TypeVar('T')
def whatever(x: T) -> T: pass
[file othermod.py]
[builtins fixtures/module.pyi]
[case testModuleLevelGetattr]
import has_getattr
reveal_type(has_getattr.any_attribute) # N: Revealed type is 'Any'
[file has_getattr.pyi]
from typing import Any
def __getattr__(name: str) -> Any: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrReturnType]
import has_getattr
reveal_type(has_getattr.any_attribute) # N: Revealed type is 'builtins.str'
[file has_getattr.pyi]
def __getattr__(name: str) -> str: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrInvalidSignature]
import has_getattr
reveal_type(has_getattr.any_attribute)
[file has_getattr.pyi]
def __getattr__(x: int, y: str) -> str: ...
[out]
tmp/has_getattr.pyi:1: error: Invalid signature "def (builtins.int, builtins.str) -> builtins.str" for "__getattr__"
main:3: note: Revealed type is 'builtins.str'
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrNotCallable]
import has_getattr
reveal_type(has_getattr.any_attribute)
[file has_getattr.pyi]
__getattr__ = 3
[out]
tmp/has_getattr.pyi:1: error: Invalid signature "builtins.int" for "__getattr__"
main:3: note: Revealed type is 'Any'
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrUntyped]
import has_getattr
reveal_type(has_getattr.any_attribute) # N: Revealed type is 'Any'
[file has_getattr.pyi]
def __getattr__(name): ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrNotStub36]
# flags: --python-version 3.6
import has_getattr
reveal_type(has_getattr.any_attribute) # E: Module has no attribute "any_attribute" \
# N: Revealed type is 'Any'
[file has_getattr.py]
def __getattr__(name) -> str: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrNotStub37]
# flags: --python-version 3.7
import has_getattr
reveal_type(has_getattr.any_attribute) # N: Revealed type is 'builtins.str'
[file has_getattr.py]
def __getattr__(name) -> str: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattribute]
def __getattribute__(): ... # E: __getattribute__ is not valid at the module level
[case testModuleLevelGetattrImportFrom]
from has_attr import name
reveal_type(name) # N: Revealed type is 'Any'
[file has_attr.pyi]
from typing import Any
def __getattr__(name: str) -> Any: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrImportFromRetType]
from has_attr import int_attr
reveal_type(int_attr) # N: Revealed type is 'builtins.int'
[file has_attr.pyi]
def __getattr__(name: str) -> int: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrImportFromNotStub36]
# flags: --python-version 3.6
from non_stub import name # E: Module 'non_stub' has no attribute 'name'
reveal_type(name) # N: Revealed type is 'Any'
[file non_stub.py]
from typing import Any
def __getattr__(name: str) -> Any: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrImportFromNotStub37]
# flags: --python-version 3.7
from non_stub import name
reveal_type(name) # N: Revealed type is 'Any'
[file non_stub.py]
from typing import Any
def __getattr__(name: str) -> Any: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrImportFromAs]
from has_attr import name as n
reveal_type(name) # E: Name 'name' is not defined # N: Revealed type is 'Any'
reveal_type(n) # N: Revealed type is 'Any'
[file has_attr.pyi]
from typing import Any
def __getattr__(name: str) -> Any: ...
[builtins fixtures/module.pyi]
[case testModuleLevelGetattrImportFromAsTwice]
from has_attr import name
from has_attr import name
from has_attr import x
from has_attr import y as x # E: Name 'x' already defined (possibly by an import)
reveal_type(name) # N: Revealed type is 'builtins.int'
[file has_attr.pyi]
from typing import Any
def __getattr__(name: str) -> int: ...
[case testModuleLevelGetattrAssignedGood]
# flags: --python-version 3.7
import non_stub
reveal_type(non_stub.name) # N: Revealed type is 'builtins.int'
[file non_stub.py]
from typing import Callable
def make_getattr_good() -> Callable[[str], int]: ...
__getattr__ = make_getattr_good() # OK
[case testModuleLevelGetattrAssignedBad]
# flags: --python-version 3.7
import non_stub
reveal_type(non_stub.name)
[file non_stub.py]
from typing import Callable
def make_getattr_bad() -> Callable[[], int]: ...
__getattr__ = make_getattr_bad()
[out]
tmp/non_stub.py:4: error: Invalid signature "def () -> builtins.int" for "__getattr__"
main:3: note: Revealed type is 'builtins.int'
[case testModuleLevelGetattrImportedGood]
# flags: --python-version 3.7
import non_stub
reveal_type(non_stub.name) # N: Revealed type is 'builtins.int'
[file non_stub.py]
from has_getattr import __getattr__
[file has_getattr.py]
def __getattr__(name: str) -> int: ...
[case testModuleLevelGetattrImportedBad]
# flags: --python-version 3.7
import non_stub
reveal_type(non_stub.name)
[file non_stub.py]
from has_getattr import __getattr__
[file has_getattr.py]
def __getattr__() -> int: ...
[out]
tmp/has_getattr.py:1: error: Invalid signature "def () -> builtins.int" for "__getattr__"
main:3: note: Revealed type is 'builtins.int'
[builtins fixtures/module.pyi]
[case testFailedImportFromTwoModules]
import c
import b
[file b.py]
import c
[out]
-- TODO: it would be better for this to be in the other order
tmp/b.py:1: error: Cannot find implementation or library stub for module named 'c'
main:1: error: Cannot find implementation or library stub for module named 'c'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testIndirectFromImportWithinCycle1]
import a
[file a.py]
from b import f
from c import x
[file b.py]
from c import y
from a import x
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file c.py]
x = str()
y = int()
[case testIndirectFromImportWithinCycle2]
import a
[file a.py]
from c import y
from b import x
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file b.py]
from a import f
from c import x
[file c.py]
x = str()
y = int()
[case testIndirectFromImportWithinCycleInPackage]
import p.a
[file p/__init__.py]
[file p/a.py]
from p.b import f
from p.c import x
[file p/b.py]
from p.c import y
from p.a import x
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file p/c.py]
x = str()
y = int()
[case testIndirectFromImportWithinCycleInPackageIgnoredInit]
# cmd: mypy -m p.a p.b p.c
# flags: --follow-imports=skip --ignore-missing-imports
[file p/__init__.py]
[file p/a.py]
from p.b import f
from p.c import x
[file p/b.py]
from p.c import y
from p.a import x
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file p/c.py]
x = str()
y = int()
[case testForwardReferenceToListAlias-skip]
# TODO: This fails because of missing ImportedName handling in
# mypy.typeanal.TypeAnalyser.visit_unbound_type.
x: List[int]
reveal_type(x) # N: Revealed type is 'builtins.list[builtins.int]'
def f() -> 'List[int]': pass
reveal_type(f) # N: Revealed type is 'def () -> builtins.list[builtins.int]'
class A:
y: 'List[str]'
def g(self, x: 'List[int]') -> None: pass
reveal_type(A().y) # N: Revealed type is 'builtins.list[builtins.str]'
reveal_type(A().g) # N: Revealed type is 'def (x: builtins.list[builtins.int])'
from typing import List
[builtins fixtures/list.pyi]
[case testIndirectStarImportWithinCycle1]
import a
[file a.py]
from b import f
from c import x
[file b.py]
from c import y
from a import *
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file c.py]
x = str()
y = int()
[case testIndirectStarImportWithinCycle2]
import a
[file a.py]
from c import y
from b import *
def f() -> None: pass
reveal_type(x) # N: Revealed type is 'builtins.str'
[file b.py]
from a import f
from c import x
[file c.py]
x = str()
y = int()
[case testModuleGetattrInit1]
from a import b
x = b.f()
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrInit2]
import a.b
x = a.b.f()
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrInit3]
import a.b
x = a.b.f()
[file a/__init__.py]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
main:1: error: Cannot find implementation or library stub for module named 'a.b'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testModuleGetattrInit4]
import a.b.c
x = a.b.c.f()
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrInit5]
from a.b import f
x = f()
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrInit5a]
from a.b import f
x = f()
[file a/__init__.pyi]
from types import ModuleType
def __getattr__(attr: str) -> ModuleType: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrInit8]
import a.b.c.d
x = a.b.c.d.f()
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[file a/b/__init__.pyi]
# empty (i.e. complete subpackage)
[builtins fixtures/module.pyi]
[out]
main:1: error: Cannot find implementation or library stub for module named 'a.b.c.d'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
main:1: error: Cannot find implementation or library stub for module named 'a.b.c'
[case testModuleGetattrInit8a]
import a.b.c # E: Cannot find implementation or library stub for module named 'a.b.c' # N: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
import a.d # OK
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[file a/b/__init__.pyi]
# empty (i.e. complete subpackage)
[builtins fixtures/module.pyi]
[case testModuleGetattrInit10]
# flags: --config-file tmp/mypy.ini
import a.b.c # silenced
import a.b.d # error
[file a/__init__.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[file a/b/__init__.pyi]
# empty (i.e. complete subpackage)
[file mypy.ini]
\[mypy]
\[mypy-a.b.c]
ignore_missing_imports = True
[builtins fixtures/module.pyi]
[out]
main:3: error: Cannot find implementation or library stub for module named 'a.b.d'
main:3: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testIndirectFromImportWithinCycleUsedAsBaseClass-skip]
-- TODO: Fails because of missing ImportedName handling in mypy.typeanal
import a
[file a.py]
from b import f
from c import B
[file b.py]
from c import y
class A(B): pass
reveal_type(A().x) # N: Revealed type is 'builtins.str'
from a import B
def f() -> None: pass
[file c.py]
class B:
x: int
x = str()
y = int()
[case testImportFromReExportInCycleUsingRelativeImport1]
from m import One
reveal_type(One)
[file m/__init__.py]
from .one import One
from .two import Two
reveal_type(One)
[file m/one.py]
class One:
pass
[file m/two.py]
from m import One
reveal_type(One)
x: One
reveal_type(x)
class Two(One):
pass
y: Two
y = x
x = y
[out]
tmp/m/two.py:2: note: Revealed type is 'def () -> m.one.One'
tmp/m/two.py:4: note: Revealed type is 'm.one.One'
tmp/m/two.py:9: error: Incompatible types in assignment (expression has type "One", variable has type "Two")
tmp/m/__init__.py:3: note: Revealed type is 'def () -> m.one.One'
main:2: note: Revealed type is 'def () -> m.one.One'
[case testImportReExportInCycleUsingRelativeImport2]
from m import One
reveal_type(One)
[file m/__init__.py]
from .one import One
from .two import Two
reveal_type(One)
[file m/one.py]
class One:
pass
[file m/two.py]
import m
reveal_type(m.One)
x: m.One
reveal_type(x)
class Two:
pass
[out]
tmp/m/two.py:2: note: Revealed type is 'def () -> m.one.One'
tmp/m/two.py:4: note: Revealed type is 'm.one.One'
tmp/m/__init__.py:3: note: Revealed type is 'def () -> m.one.One'
main:2: note: Revealed type is 'def () -> m.one.One'
[case testImportReExportedNamedTupleInCycle1]
from m import One
[file m/__init__.py]
from .one import One
from .two import Two
[file m/one.py]
from typing import NamedTuple
class One(NamedTuple):
name: str
[file m/two.py]
import m
x = m.One(name="Foo")
reveal_type(x.name)
class Two:
pass
[out]
tmp/m/two.py:3: note: Revealed type is 'builtins.str'
[case testImportReExportedNamedTupleInCycle2]
from m import One
[file m/__init__.py]
from .one import One
from .two import Two
[file m/one.py]
from typing import NamedTuple
One = NamedTuple('One', [('name', str)])
[file m/two.py]
import m
x = m.One(name="Foo")
reveal_type(x.name)
class Two:
pass
[out]
tmp/m/two.py:3: note: Revealed type is 'builtins.str'
[case testImportReExportedTypeAliasInCycle]
from m import One
[file m/__init__.py]
from .one import One
from .two import Two
[file m/one.py]
from typing import Union
One = Union[int, str]
[file m/two.py]
import m
x: m.One
reveal_type(x)
class Two:
pass
[out]
tmp/m/two.py:3: note: Revealed type is 'Union[builtins.int, builtins.str]'
[case testImportCycleSpecialCase]
import p
[file p/__init__.py]
from . import a
from . import b
reveal_type(a.foo())
[file p/a.py]
import p
def foo() -> int: pass
[file p/b.py]
import p
def run() -> None:
reveal_type(p.a.foo())
[builtins fixtures/module.pyi]
[out]
tmp/p/b.py:4: note: Revealed type is 'builtins.int'
tmp/p/__init__.py:3: note: Revealed type is 'builtins.int'
[case testMissingSubmoduleImportedWithIgnoreMissingImports]
# flags: --ignore-missing-imports
import whatever.works
import a.b
x = whatever.works.f()
y = a.b.f()
[file a/__init__.py]
# empty
[out]
[case testMissingSubmoduleImportedWithIgnoreMissingImportsStub]
# flags: --ignore-missing-imports --follow-imports=skip
import whatever.works
import a.b
x = whatever.works.f()
y = a.b.f()
xx: whatever.works.C
yy: a.b.C
xx2: whatever.works.C.D
yy2: a.b.C.D
[file a/__init__.pyi]
# empty
[out]
[case testMissingSubmoduleImportedWithIgnoreMissingImportsNested]
# flags: --ignore-missing-imports
import a.b.c.d
y = a.b.c.d.f()
[file a/__init__.py]
# empty
[file a/b/__init__.py]
# empty
[out]
[case testModuleGetattrBusted]
from a import A
x: A
reveal_type(x) # N: Revealed type is 'Any'
[file a.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testModuleGetattrBusted2]
from a import A
def f(x: A.B) -> None: ...
reveal_type(f) # N: Revealed type is 'def (x: Any)'
[file a.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
[builtins fixtures/module.pyi]
[out]
[case testNoGetattrInterference]
import testmod as t
def f(x: t.Cls) -> None:
reveal_type(x) # N: Revealed type is 'testmod.Cls'
[file testmod.pyi]
from typing import Any
def __getattr__(attr: str) -> Any: ...
class Cls: ...
[builtins fixtures/module.pyi]
[out]
[case testFunctionWithDunderName]
def __add__(self) -> int: ...
[case testFunctionWithReversibleDunderName]
def __radd__(self) -> int: ...
[case testFunctionWithInPlaceDunderName]
def __iadd__(self) -> int: ...
-- Tests for PEP 420 namespace packages.
[case testClassicPackage]
from foo.bar import x
[file foo/__init__.py]
# empty
[file foo/bar.py]
x = 0
[case testClassicNotPackage]
from foo.bar import x
[file foo/bar.py]
x = 0
[out]
main:1: error: Cannot find implementation or library stub for module named 'foo.bar'
main:1: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testNamespacePackage]
# flags: --namespace-packages
from foo.bar import x
reveal_type(x) # N: Revealed type is 'builtins.int'
[file foo/bar.py]
x = 0
[case testNamespacePackageWithMypyPath]
# flags: --namespace-packages --config-file tmp/mypy.ini
from foo.bax import x
from foo.bay import y
from foo.baz import z
reveal_type(x) # N: Revealed type is 'builtins.int'
reveal_type(y) # N: Revealed type is 'builtins.int'
reveal_type(z) # N: Revealed type is 'builtins.int'
[file xx/foo/bax.py]
x = 0
[file yy/foo/bay.py]
y = 0
[file foo/baz.py]
z = 0
[file mypy.ini]
\[mypy]
mypy_path = tmp/xx, tmp/yy
[case testClassicPackageIgnoresEarlierNamespacePackage]
# flags: --namespace-packages --config-file tmp/mypy.ini
from foo.bar import y
reveal_type(y) # N: Revealed type is 'builtins.int'
[file xx/foo/bar.py]
x = ''
[file yy/foo/bar.py]
y = 0
[file yy/foo/__init__.py]
[file mypy.ini]
\[mypy]
mypy_path = tmp/xx, tmp/yy
[case testNamespacePackagePickFirstOnMypyPath]
# flags: --namespace-packages --config-file tmp/mypy.ini
from foo.bar import x
reveal_type(x) # N: Revealed type is 'builtins.int'
[file xx/foo/bar.py]
x = 0
[file yy/foo/bar.py]
x = ''
[file mypy.ini]
\[mypy]
mypy_path = tmp/xx, tmp/yy
[case testNamespacePackageInsideClassicPackage]
# flags: --namespace-packages --config-file tmp/mypy.ini
from foo.bar.baz import x
reveal_type(x) # N: Revealed type is 'builtins.int'
[file xx/foo/bar/baz.py]
x = ''
[file yy/foo/bar/baz.py]
x = 0
[file yy/foo/__init__.py]
[file mypy.ini]
\[mypy]
mypy_path = tmp/xx, tmp/yy
[case testClassicPackageInsideNamespacePackage]
# flags: --namespace-packages --config-file tmp/mypy.ini
from foo.bar.baz.boo import x
reveal_type(x) # N: Revealed type is 'builtins.int'
[file xx/foo/bar/baz/boo.py]
x = ''
[file xx/foo/bar/baz/__init__.py]
[file yy/foo/bar/baz/boo.py]
x = 0
[file yy/foo/bar/__init__.py]
[file mypy.ini]
\[mypy]
mypy_path = tmp/xx, tmp/yy
[case testNamespacePackagePlainImport]
# flags: --namespace-packages
import foo.bar.baz
reveal_type(foo.bar.baz.x) # N: Revealed type is 'builtins.int'
[file foo/bar/baz.py]
x = 0
[case testModuleGetAttrAssignUnannotated]
import roles
# this should not crash
roles.role = 1
[file roles.pyi]
def __getattr__(name): ...
[case testModuleGetAttrAssignUnannotatedDouble]
import roles
# this also should not crash
roles.role.attr = 1
[file roles.pyi]
def __getattr__(name): ...
[case testModuleGetAttrAssignAny]
import roles
roles.role = 1
[file roles.pyi]
from typing import Any
def __getattr__(name: str) -> Any: ...
[case testModuleGetAttrAssignError]
import roles
roles.role = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "str")
[file roles.pyi]
def __getattr__(name: str) -> str: ...
[case testModuleGetAttrAssignSubmodule]
import roles
roles.role = 1
roles.missing.attr = 1
[file roles/__init__.pyi]
from typing import Any
def __getattr__(name: str) -> Any: ...
[case testModuleGetAttrAssignSubmoduleStrict]
import roles
roles.role = 1 # E: Incompatible types in assignment (expression has type "int", variable has type Module)
[file roles/__init__.pyi]
from types import ModuleType
def __getattr__(name: str) -> ModuleType: ...
[builtins fixtures/module.pyi]
[case testAlwaysReportMissingAttributesOnFoundModules]
# flags: --ignore-missing-imports
import pack.mod as alias
x: alias.NonExistent # E: Name 'alias.NonExistent' is not defined
[file pack/__init__.py]
[file pack/mod.py]
class Existent: pass