blob: 187d9c1c96a455fc661426da5d6a0c879dc64290 [file] [log] [blame] [edit]
-- Test cases for type checking mypy programs using full stubs and running
-- using CPython.
--
-- These are mostly regression tests -- no attempt is made to make these
-- complete.
[case testHello]
import typing
print('hello, world')
[out]
hello, world
[case testReversed]
from typing import Reversible
class A(Reversible):
def __iter__(self): return iter('oof')
def __reversed__(self): return iter('foo')
print(list(reversed(range(5))))
print(list(reversed([1,2,3])))
print(list(reversed('abc')))
print(list(reversed(A())))
[out]
-- Escape bracket at line beginning
\[4, 3, 2, 1, 0]
\[3, 2, 1]
\['c', 'b', 'a']
\['f', 'o', 'o']
[case testIntAndFloatConversion]
from typing import SupportsInt, SupportsFloat
class A(SupportsInt):
def __int__(self): return 5
class B(SupportsFloat):
def __float__(self): return 1.2
print(int(1))
print(int(6.2))
print(int('3'))
print(int(b'4'))
print(int(A()))
print(float(-9))
print(float(B()))
[out]
1
6
3
4
5
-9.0
1.2
[case testAbs]
from typing import SupportsAbs
class A(SupportsAbs[float]):
def __abs__(self) -> float: return 5.5
print(abs(-1))
print(abs(-1.2))
print(abs(A()))
[out]
1
1.2
5.5
[case testAbs2]
n = None # type: int
f = None # type: float
n = abs(1)
abs(1) + 'x' # Error
f = abs(1.1)
abs(1.1) + 'x' # Error
[out]
_program.py:4: error: Unsupported operand types for + ("int" and "str")
_program.py:6: error: Unsupported operand types for + ("float" and "str")
[case testRound]
from typing import SupportsRound
class A(SupportsRound):
def __round__(self, ndigits=0): return 'x%d' % ndigits
print(round(1.6))
print(round(A()))
print(round(A(), 2))
[out]
2
x0
x2
[case testCallMethodViaTypeObject]
import typing
print(list.__add__([1, 2], [3, 4]))
[out]
\[1, 2, 3, 4]
[case testInheritedClassAttribute]
import typing
class A:
x = 1
def f(self) -> None: print('f')
class B(A):
pass
B.f(None)
print(B.x)
[out]
f
1
[case testModuleAttributes]
import math
import typing
print(math.__name__)
print(type(math.__dict__))
print(type(math.__doc__ or ''))
print(math.__class__)
[out]
math
<class 'dict'>
<class 'str'>
<class 'module'>
[case testSpecialAttributes]
import typing
class A:
"""A docstring!"""
print(A().__doc__)
print(A().__class__)
[out]
A docstring!
<class '__main__.A'>
[case testFunctionAttributes]
import typing
ord.__class__
print(type(ord.__doc__ + ''))
print(ord.__name__)
print(ord.__module__)
[out]
<class 'str'>
ord
builtins
[case testTypeAttributes]
import typing
print(str.__class__)
print(type(str.__doc__))
print(str.__name__)
print(str.__module__)
print(str.__dict__ is not None)
[out]
<class 'type'>
<class 'str'>
str
builtins
True
[case testBoolCompatibilityWithInt]
import typing
x = 0
x = True
print(bool('x'))
print(bool(''))
[out]
True
False
[case testCallBuiltinTypeObjectsWithoutArguments]
import typing
print(int())
print(repr(str()))
print(repr(bytes()))
print(float())
print(bool())
[out]
0
''
b''
0.0
False
[case testIntegerDivision]
import typing
x = 1 / 2
x = 1.5
[out]
[case testIntMethods]
import typing
print(int.from_bytes(b'ab', 'big'))
n = 0
print(n.from_bytes(b'ac', 'big'))
print(n.from_bytes([2, 3], 'big'))
print(n.to_bytes(2, 'big'))
[out]
24930
24931
515
b'\x00\x00'
[case testFloatMethods]
import typing
print(1.5.as_integer_ratio())
print(1.5.hex())
print(2.0.is_integer())
print(float.fromhex('0x1.8'))
[out]
(3, 2)
0x1.8000000000000p+0
True
1.5
[case testDictFromkeys]
import typing
d = dict.fromkeys('foo')
d['x'] = 2
d2 = dict.fromkeys([1, 2], b'')
d2[2] = b'foo'
[out]
[case testIsinstanceWithTuple]
from typing import cast, Any
x = cast(Any, (1, 'x'))
if isinstance(x, tuple):
print(x[0], x[1])
[out]
1 x
[case testAnyStr]
from typing import AnyStr
def f(x: AnyStr) -> AnyStr:
if isinstance(x, str):
return 'foo'
else:
return b'zar'
print(f(''))
print(f(b''))
[out]
foo
b'zar'
[case testNameNotImportedFromTyping]
import typing
cast(int, 2)
[out]
_program.py:2: error: Name 'cast' is not defined
_program.py:2: note: Did you forget to import it from "typing"? (Suggestion: "from typing import cast")
[case testBinaryIOType]
from typing import BinaryIO
def f(f: BinaryIO) -> None:
f.write(b'foo')
f.write(bytearray(b'foo'))
[out]
[case testIOTypes]
from typing import IO
import sys
def txt(f: IO[str]) -> None:
f.write('foo')
f.write(b'foo')
def bin(f: IO[bytes]) -> None:
f.write(b'foo')
f.write(bytearray(b'foo'))
txt(sys.stdout)
bin(sys.stdout)
[out]
_program.py:5: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str"
_program.py:10: error: Argument 1 to "bin" has incompatible type "TextIO"; expected "IO[bytes]"
[case testBuiltinOpen]
f = open('x')
f.write('x')
f.write(b'x')
f.foobar()
[out]
_program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str"
_program.py:4: error: "TextIO" has no attribute "foobar"
[case testOpenReturnTypeInference]
reveal_type(open('x'))
reveal_type(open('x', 'r'))
reveal_type(open('x', 'rb'))
mode = 'rb'
reveal_type(open('x', mode))
[out]
_program.py:1: note: Revealed type is 'typing.TextIO'
_program.py:2: note: Revealed type is 'typing.TextIO'
_program.py:3: note: Revealed type is 'typing.BinaryIO'
_program.py:5: note: Revealed type is 'typing.IO[Any]'
[case testOpenReturnTypeInferenceSpecialCases]
reveal_type(open(mode='rb', file='x'))
reveal_type(open(file='x', mode='rb'))
mode = 'rb'
reveal_type(open(mode=mode, file='r'))
[out]
_testOpenReturnTypeInferenceSpecialCases.py:1: note: Revealed type is 'typing.BinaryIO'
_testOpenReturnTypeInferenceSpecialCases.py:2: note: Revealed type is 'typing.BinaryIO'
_testOpenReturnTypeInferenceSpecialCases.py:4: note: Revealed type is 'typing.IO[Any]'
[case testPathOpenReturnTypeInference]
from pathlib import Path
p = Path("x")
reveal_type(p.open())
reveal_type(p.open('r'))
reveal_type(p.open('rb'))
mode = 'rb'
reveal_type(p.open(mode))
[out]
_program.py:3: note: Revealed type is 'typing.TextIO'
_program.py:4: note: Revealed type is 'typing.TextIO'
_program.py:5: note: Revealed type is 'typing.BinaryIO'
_program.py:7: note: Revealed type is 'typing.IO[Any]'
[case testPathOpenReturnTypeInferenceSpecialCases]
from pathlib import Path
p = Path("x")
reveal_type(p.open(mode='rb', errors='replace'))
reveal_type(p.open(errors='replace', mode='rb'))
mode = 'rb'
reveal_type(p.open(mode=mode, errors='replace'))
[out]
_program.py:3: note: Revealed type is 'typing.BinaryIO'
_program.py:4: note: Revealed type is 'typing.BinaryIO'
_program.py:6: note: Revealed type is 'typing.IO[Any]'
[case testGenericPatterns]
from typing import Pattern
import re
p = None # type: Pattern[str]
p = re.compile('foo*')
b = None # type: Pattern[bytes]
b = re.compile(b'foo*')
print(p.match('fooo').group(0))
[out]
fooo
[case testGenericMatch]
from typing import Match
import re
def f(m: Match[bytes]) -> None:
print(m.group(0))
f(re.match(b'x*', b'xxy'))
[out]
b'xx'
[case testIntFloatDucktyping]
x = None # type: float
x = 2.2
x = 2
def f(x: float) -> None: pass
f(1.1)
f(1)
[out]
[case testsFloatOperations]
import typing
print(1.5 + 1.5)
print(1.5 + 1)
[out]
3.0
2.5
[case testMathFunctionWithIntArgument]
import typing
import math
math.sin(2)
math.sin(2.2)
[case testAbsReturnType]
f = None # type: float
n = None # type: int
n = abs(2)
f = abs(2.2)
abs(2.2) + 'x'
[out]
_program.py:6: error: Unsupported operand types for + ("float" and "str")
[case testROperatorMethods]
b = None # type: bytes
s = None # type: str
if int():
s = b'foo' * 5 # Error
if int():
b = 5 * b'foo'
if int():
b = b'foo' * 5
if int():
s = 5 * 'foo'
if int():
s = 'foo' * 5
[out]
_program.py:4: error: Incompatible types in assignment (expression has type "bytes", variable has type "str")
[case testROperatorMethods2]
import typing
print(2 / 0.5)
print(' ', 2 * [3, 4])
[out]
4.0
[3, 4, 3, 4]
[case testNotImplemented]
import typing
class A:
def __add__(self, x: int) -> int:
if isinstance(x, int):
return x + 1
return NotImplemented
class B:
def __radd__(self, x: A) -> str:
return 'x'
print(A() + 1)
print(A() + B())
[out]
2
x
[case testMappingMethods]
# Regression test
from typing import Mapping
x = {'x': 'y'} # type: Mapping[str, str]
print('x' in x)
print('y' in x)
[out]
True
False
[case testOverlappingOperatorMethods]
class X: pass
class A:
def __add__(self, x) -> int:
if isinstance(x, X):
return 1
return NotImplemented
class B:
def __radd__(self, x: A) -> str: return 'x'
class C(X, B): pass
b = None # type: B
b = C()
print(A() + b)
[out]
_program.py:9: error: Signatures of "__radd__" of "B" and "__add__" of "A" are unsafely overlapping
[case testBytesAndBytearrayComparisons]
import typing
print(b'ab' < bytearray(b'b'))
print(bytearray(b'ab') < b'a')
[out]
True
False
[case testBytesAndBytearrayComparisons2]
import typing
'' < b''
b'' < ''
'' < bytearray()
bytearray() < ''
[out]
_program.py:2: error: Unsupported operand types for < ("str" and "bytes")
_program.py:3: error: Unsupported operand types for < ("bytes" and "str")
_program.py:4: error: Unsupported operand types for < ("str" and "bytearray")
_program.py:5: error: Unsupported operand types for < ("bytearray" and "str")
[case testInplaceOperatorMethod]
import typing
a = [1]
print('', a.__iadd__([2]))
print('', a)
[out]
[1, 2]
[1, 2]
[case testListInplaceAdd]
import typing
a = [1]
a += iter([2, 3])
print(tuple(a))
[out]
(1, 2, 3)
[case testInferHeterogeneousListOfIterables]
from typing import Sequence
s = ['x', 'y'] # type: Sequence[str]
a = [['x', 'x'], 'fo', s, iter('foo'), {'aa'}]
for i, x in enumerate(a):
print(i, next(iter(x)))
[out]
0 x
1 f
2 x
3 f
4 aa
[case testTextIOProperties]
import typing
import sys
print(type(sys.stdin.encoding))
print(type(sys.stdin.errors))
sys.stdin.line_buffering
sys.stdin.buffer
sys.stdin.newlines
[out]
<class 'str'>
<class 'str'>
[case testIOProperties]
import typing
import sys
print(sys.stdin.name)
print(sys.stdin.buffer.mode)
[out]
<stdin>
rb
[case testFromFuturePrintFunction]
from __future__ import print_function
print('a', 'b')
[out]
a b
[case testListMethods]
import typing
import sys
l = [0, 1, 2, 3, 4]
if sys.version >= '3.3':
l.clear()
else:
l = []
l.append(0)
print('>', l)
if sys.version >= '3.3':
m = l.copy()
else:
m = l[:]
m.extend([1, 2, 3, 4])
print('>', m)
print(l.index(0))
print(l.index(0, 0))
print(l.index(0, 0, 1))
try:
print(l.index(1))
print('expected ValueError')
except ValueError:
pass
l.insert(0, 1)
print('>', l)
print(l.pop(0))
print(l.pop())
m.remove(0)
try:
m.remove(0)
print('expected ValueError')
except ValueError:
pass
m.reverse()
m.sort()
m.sort(key=lambda x: -x)
m.sort(reverse=False)
m.sort(key=lambda x: -x, reverse=True)
print('>', m)
[out]
> [0]
> [0, 1, 2, 3, 4]
0
0
0
> [1, 0]
1
0
> [1, 2, 3, 4]
[case testListOperators]
import typing
l = [0, 1]
print('+', l + [2])
print('*', l * 2)
print('*', 2 * l)
print('in', 1 in l)
print('==', l == [1, 2])
print('!=', l != [1, 2])
print('>', l > [1, 2, 3])
print('>=', l >= [1, 2, 3])
print('<', l < [1, 2, 3])
print('<=', l <= [1, 2, 3])
print('>[0]', l[0])
l += [2]
print('+=', l)
l *= 2
print('*=', l)
print('iter', list(iter(l)))
print('len', len(l))
print('repr', repr(l))
l[:3] = []
print('setslice', l)
print('reversed', list(reversed(l)))
[out]
+ [0, 1, 2]
* [0, 1, 0, 1]
* [0, 1, 0, 1]
in True
== False
!= True
> False
>= False
< True
<= True
>[0] 0
+= [0, 1, 2]
*= [0, 1, 2, 0, 1, 2]
iter [0, 1, 2, 0, 1, 2]
len 6
repr [0, 1, 2, 0, 1, 2]
setslice [0, 1, 2]
reversed [2, 1, 0]
[case testTupleAsSubtypeOfSequence]
from typing import TypeVar, Sequence
T = TypeVar('T')
def f(a: Sequence[T]) -> None: print(a)
f(tuple())
[out]
()
[case testMapWithLambdaSpecialCase]
from typing import List, Iterator
a = [[1], [3]]
b = map(lambda y: y[0], a)
print('>', list(b))
[out]
> [1, 3]
[case testInternalBuiltinDefinition]
import typing
def f(x: _T) -> None: pass
s: FrozenSet
[out]
_program.py:2: error: Name '_T' is not defined
_program.py:3: error: Name 'FrozenSet' is not defined
[case testVarArgsFunctionSubtyping]
import typing
def f(*args: str) -> str: return args[0]
map(f, ['x'])
map(f, [1])
[out]
_program.py:4: error: Argument 1 to "map" has incompatible type "Callable[[VarArg(str)], str]"; expected "Callable[[int], str]"
[case testMapStr]
import typing
x = range(3)
a = list(map(str, x))
a + 1
[out]
_program.py:4: error: Unsupported operand types for + ("List[str]" and "int")
[case testRelativeImport]
import typing
from m import x
print(x)
[file m/__init__.py]
from .n import x
[file m/n.py]
x = 1
[out]
1
[case testRelativeImport2]
import typing
from m.n import x
print(x)
[file m/__init__.py]
[file m/n.py]
from .nn import x
[file m/nn.py]
x = 2
[out]
2
[case testPyiTakesPrecedenceOverPy]
import m
m.f(1)
[file m.py]
def f(x):
print(x)
[file m.pyi]
import typing
def f(x: str) -> None: pass
[out]
_program.py:2: error: Argument 1 to "f" has incompatible type "int"; expected "str"
[case testComplexArithmetic]
import typing
print(5 + 8j)
print(3j * 2.0)
print(4J / 2.0)
[out]
(5+8j)
6j
2j
[case testComplexArithmetic2]
x = 5 + 8j
if int():
x = '' # E
y = 3j * 2.0
if int():
y = '' # E
[out]
_program.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
_program.py:6: error: Incompatible types in assignment (expression has type "str", variable has type "complex")
[case testSuperNew]
from typing import Dict, Any
class MyType(type):
def __new__(cls, name: str, bases: tuple, namespace: Dict[str, Any]) -> Any:
return super().__new__(cls, name + 'x', bases, namespace)
class A(metaclass=MyType): pass
print(type(A()).__name__)
[out]
Ax
[case testSubclassBothGenericAndNonGenericABC]
from typing import Generic, TypeVar
from abc import ABCMeta
T = TypeVar('T')
class A(metaclass=ABCMeta): pass
class B(Generic[T]): pass
class C(A, B): pass
class D(B, A): pass
class E(A, B[T], Generic[T]): pass
class F(B[T], A, Generic[T]): pass
def f(e: E[int], f: F[int]) -> None: pass
[out]
[case testTypeVariableTypeComparability]
from typing import TypeVar
T = TypeVar('T')
def eq(x: T, y: T, z: T) -> T:
if x == y:
return y
else:
return z
print(eq(1, 2, 3))
print(eq('x', 'x', 'z'))
[out]
3
x
[case testIntDecimalCompatibility]
import typing
from decimal import Decimal
print(Decimal(1) + 2)
print(Decimal(1) - 2)
print(1 + Decimal('2.34'))
print(1 - Decimal('2.34'))
print(2 * Decimal('2.34'))
[out]
3
-1
3.34
-1.34
4.68
[case testInstantiateBuiltinTypes]
from typing import Dict, Set, List
d = dict() # type: Dict[int, str]
s = set() # type: Set[int]
l = list() # type: List[int]
str()
bytes()
bytearray()
int()
float()
complex()
slice(1)
bool()
[case testVariableLengthTupleError]
from typing import Tuple
def p(t: Tuple[str, ...]) -> None:
n = 5
print(t[n])
for s in t:
s()
''.startswith(('x', 'y'))
''.startswith(('x', b'y'))
[out]
_program.py:6: error: "str" not callable
_program.py:8: error: Argument 1 to "startswith" of "str" has incompatible type "Tuple[str, bytes]"; expected "Union[str, Tuple[str, ...]]"
[case testMultiplyTupleByInteger]
n = 4
t = ('',) * n
t + 1
[out]
_program.py:3: error: No overload variant of "__add__" of "tuple" matches argument type "int"
_program.py:3: note: Possible overload variants:
_program.py:3: note: def __add__(self, Tuple[str, ...]) -> Tuple[str, ...]
_program.py:3: note: def __add__(self, Tuple[Any, ...]) -> Tuple[Any, ...]
[case testMultiplyTupleByIntegerReverse]
n = 4
t = n * ('',)
t + 1
[out]
_program.py:3: error: No overload variant of "__add__" of "tuple" matches argument type "int"
_program.py:3: note: Possible overload variants:
_program.py:3: note: def __add__(self, Tuple[str, ...]) -> Tuple[str, ...]
_program.py:3: note: def __add__(self, Tuple[Any, ...]) -> Tuple[Any, ...]
[case testDictWithKeywordArgs]
from typing import Dict, Any, List
d1 = dict(a=1, b=2) # type: Dict[str, int]
d2 = dict(a=1, b='') # type: Dict[str, int] # E
d3 = dict(a=1, b=1)
d3.xyz # E
d4 = dict(a=1, b='') # type: Dict[str, Any]
result = dict(x=[], y=[]) # type: Dict[str, List[str]]
[out]
_program.py:3: error: Dict entry 1 has incompatible type "str": "str"; expected "str": "int"
_program.py:5: error: "Dict[str, int]" has no attribute "xyz"
[case testDefaultDict]
import typing as t
from collections import defaultdict
T = t.TypeVar('T')
d1 = defaultdict(list) # type: t.DefaultDict[int, str]
d2 = defaultdict() # type: t.DefaultDict[int, str]
d2[0] = '0'
d2['0'] = 0
def tst(dct: t.DefaultDict[int, T]) -> T:
return dct[0]
collections = ['coins', 'stamps', 'comics'] # type: t.List[str]
d3 = defaultdict(str) # type: t.DefaultDict[int, str]
collections[2]
tst(defaultdict(list, {0: []}))
tst(defaultdict(list, {'0': []}))
class MyDDict(t.DefaultDict[int,T], t.Generic[T]):
pass
MyDDict(dict)['0']
MyDDict(dict)[0]
[out]
_program.py:6: error: Argument 1 to "defaultdict" has incompatible type "Type[List[Any]]"; expected "Callable[[], str]"
_program.py:9: error: Invalid index type "str" for "defaultdict[int, str]"; expected type "int"
_program.py:9: error: Incompatible types in assignment (expression has type "int", target has type "str")
_program.py:19: error: Dict entry 0 has incompatible type "str": "List[<nothing>]"; expected "int": "List[<nothing>]"
_program.py:23: error: Invalid index type "str" for "MyDDict[Dict[_KT, _VT]]"; expected type "int"
[case testNoSubcriptionOfStdlibCollections]
# flags: --python-version 3.6
import collections
from collections import Counter
from typing import TypeVar
collections.defaultdict[int, str]()
Counter[int]()
T = TypeVar('T')
DDint = collections.defaultdict[T, int]
d = DDint[str]()
d[0] = 1
def f(d: collections.defaultdict[int, str]) -> None:
...
[out]
_program.py:6: error: "defaultdict" is not subscriptable
_program.py:7: error: "Counter" is not subscriptable
_program.py:10: error: "defaultdict" is not subscriptable
_program.py:13: error: Invalid index type "int" for "defaultdict[str, int]"; expected type "str"
_program.py:15: error: "defaultdict" is not subscriptable, use "typing.DefaultDict" instead
[case testCollectionsAliases]
import typing as t
import collections as c
o1 = c.Counter() # type: t.Counter[int]
reveal_type(o1)
o1['string']
o2 = c.ChainMap() # type: t.ChainMap[int, str]
reveal_type(o2)
o3 = c.deque() # type: t.Deque[int]
reveal_type(o3)
o4 = t.Counter[int]()
reveal_type(o4)
o5 = t.ChainMap[int, str]()
reveal_type(o5)
o6 = t.Deque[int]()
reveal_type(o6)
[out]
_testCollectionsAliases.py:5: note: Revealed type is 'collections.Counter[builtins.int]'
_testCollectionsAliases.py:6: error: Invalid index type "str" for "Counter[int]"; expected type "int"
_testCollectionsAliases.py:9: note: Revealed type is 'collections.ChainMap[builtins.int, builtins.str]'
_testCollectionsAliases.py:12: note: Revealed type is 'collections.deque[builtins.int]'
_testCollectionsAliases.py:15: note: Revealed type is 'collections.Counter[builtins.int*]'
_testCollectionsAliases.py:18: note: Revealed type is 'collections.ChainMap[builtins.int*, builtins.str*]'
_testCollectionsAliases.py:21: note: Revealed type is 'collections.deque[builtins.int*]'
[case testChainMapUnimported]
ChainMap[int, str]()
[out]
_testChainMapUnimported.py:1: error: Name 'ChainMap' is not defined
[case testDequeWrongCase]
import collections
import typing
collections.Deque()
typing.deque()
[out]
_testDequeWrongCase.py:4: error: Module has no attribute "Deque"; maybe "deque"?
_testDequeWrongCase.py:5: error: Module has no attribute "deque"; maybe "Deque"?
[case testDictUpdateInference]
from typing import Dict, Optional
d = {} # type: Dict[str, Optional[int]]
d.update({str(i): None for i in range(4)})
[case testSuperAndSetattr]
class A:
def __init__(self) -> None:
super().__setattr__('a', 1)
super().__setattr__(1, 'a')
[out]
_program.py:4: error: Argument 1 to "__setattr__" of "object" has incompatible type "int"; expected "str"
[case testMetaclassAndSuper]
from typing import Any
class A(type):
def __new__(cls, name, bases, namespace) -> Any:
return super().__new__(cls, '', (object,), {'x': 7})
class B(metaclass=A):
pass
print(getattr(B(), 'x'))
[out]
7
[case testSortedNoError]
from typing import Iterable, Callable, TypeVar, List, Dict
T = TypeVar('T')
def sorted(x: Iterable[T], *, key: Callable[[T], object] = None) -> None: ...
a = None # type: List[Dict[str, str]]
sorted(a, key=lambda y: y[''])
[case testAbstractProperty]
from abc import abstractproperty, ABCMeta
class A(metaclass=ABCMeta):
@abstractproperty
def x(self) -> int: pass
class B(A):
@property
def x(self) -> int:
return 3
b = B()
print(b.x + 1)
[out]
4
[case testInferenceWithLambda]
from typing import TypeVar, Iterable, Iterator, List
import itertools
_T = TypeVar('_T')
def f(iterable): # type: (Iterable[_T]) -> Iterator[List[_T]]
grouped = itertools.groupby(enumerate(iterable), lambda pair: pair[0] // 2)
return ([elem for _, elem in group] for _, group in grouped)
[case testReModuleBytes]
# Regression tests for various overloads in the re module -- bytes version
import re
bre = b'a+'
bpat = re.compile(bre)
bpat = re.compile(bpat)
re.search(bre, b'').groups()
re.search(bre, u'') # Error
re.search(bpat, b'').groups()
re.search(bpat, u'') # Error
# match(), split(), findall(), finditer() are much the same, so skip those.
# sub(), subn() have more overloads and we are checking these:
re.sub(bre, b'', b'') + b''
re.sub(bpat, b'', b'') + b''
re.sub(bre, lambda m: b'', b'') + b''
re.sub(bpat, lambda m: b'', b'') + b''
re.subn(bre, b'', b'')[0] + b''
re.subn(bpat, b'', b'')[0] + b''
re.subn(bre, lambda m: b'', b'')[0] + b''
re.subn(bpat, lambda m: b'', b'')[0] + b''
[out]
_program.py:7: error: Value of type variable "AnyStr" of "search" cannot be "object"
_program.py:9: error: Cannot infer type argument 1 of "search"
[case testReModuleString]
# Regression tests for various overloads in the re module -- string version
import re
sre = 'a+'
spat = re.compile(sre)
spat = re.compile(spat)
re.search(sre, '').groups()
re.search(sre, b'') # Error
re.search(spat, '').groups()
re.search(spat, b'') # Error
# match(), split(), findall(), finditer() are much the same, so skip those.
# sus(), susn() have more overloads and we are checking these:
re.sub(sre, '', '') + ''
re.sub(spat, '', '') + ''
re.sub(sre, lambda m: '', '') + ''
re.sub(spat, lambda m: '', '') + ''
re.subn(sre, '', '')[0] + ''
re.subn(spat, '', '')[0] + ''
re.subn(sre, lambda m: '', '')[0] + ''
re.subn(spat, lambda m: '', '')[0] + ''
[out]
_program.py:7: error: Value of type variable "AnyStr" of "search" cannot be "object"
_program.py:9: error: Cannot infer type argument 1 of "search"
[case testListSetitemTuple]
from typing import List, Tuple
a = [] # type: List[Tuple[str, int]]
a[0] = 'x', 1
a[1] = 2, 'y'
a[:] = [('z', 3)]
[out]
_program.py:4: error: Incompatible types in assignment (expression has type "Tuple[int, str]", target has type "Tuple[str, int]")
[case testContextManager]
import contextlib
from contextlib import contextmanager
from typing import Iterator
@contextmanager
def f(x: int) -> Iterator[str]:
yield 'foo'
@contextlib.contextmanager
def g(*x: str) -> Iterator[int]:
yield 1
reveal_type(f)
reveal_type(g)
with f('') as s:
reveal_type(s)
[out]
_program.py:13: note: Revealed type is 'def (x: builtins.int) -> contextlib._GeneratorContextManager[builtins.str*]'
_program.py:14: note: Revealed type is 'def (*x: builtins.str) -> contextlib._GeneratorContextManager[builtins.int*]'
_program.py:16: error: Argument 1 to "f" has incompatible type "str"; expected "int"
_program.py:17: note: Revealed type is 'builtins.str*'
[case testTypedDictGet]
# Test that TypedDict get plugin works with typeshed stubs
# TODO: Make it possible to use strict optional here
from mypy_extensions import TypedDict
class A: pass
D = TypedDict('D', {'x': int, 'y': str})
d: D
reveal_type(d.get('x'))
reveal_type(d.get('y'))
reveal_type(d.get('z'))
d.get()
s = ''
reveal_type(d.get(s))
[out]
_testTypedDictGet.py:7: note: Revealed type is 'builtins.int'
_testTypedDictGet.py:8: note: Revealed type is 'builtins.str'
_testTypedDictGet.py:9: note: Revealed type is 'builtins.object*'
_testTypedDictGet.py:10: error: All overload variants of "get" of "Mapping" require at least one argument
_testTypedDictGet.py:10: note: Possible overload variants:
_testTypedDictGet.py:10: note: def get(self, key: str) -> object
_testTypedDictGet.py:10: note: def [_T] get(self, key: str, default: object) -> object
_testTypedDictGet.py:12: note: Revealed type is 'builtins.object*'
[case testTypedDictMappingMethods]
from mypy_extensions import TypedDict
Cell = TypedDict('Cell', {'value': int})
c = Cell(value=42)
for x in c:
reveal_type(x)
reveal_type(iter(c))
reveal_type(len(c))
reveal_type('value' in c)
reveal_type(c.keys())
reveal_type(c.items())
reveal_type(c.values())
reveal_type(c.copy())
reveal_type(c.setdefault('value', False))
c.update({'value': 2})
c.update({'invalid': 2})
c.pop('value')
c == c
c != c
Cell2 = TypedDict('Cell2', {'value': int}, total=False)
c2 = Cell2()
reveal_type(c2.pop('value'))
[out]
_testTypedDictMappingMethods.py:5: note: Revealed type is 'builtins.str*'
_testTypedDictMappingMethods.py:6: note: Revealed type is 'typing.Iterator[builtins.str*]'
_testTypedDictMappingMethods.py:7: note: Revealed type is 'builtins.int'
_testTypedDictMappingMethods.py:8: note: Revealed type is 'builtins.bool'
_testTypedDictMappingMethods.py:9: note: Revealed type is 'typing.KeysView[builtins.str]'
_testTypedDictMappingMethods.py:10: note: Revealed type is 'typing.ItemsView[builtins.str, builtins.object]'
_testTypedDictMappingMethods.py:11: note: Revealed type is 'typing.ValuesView[builtins.object]'
_testTypedDictMappingMethods.py:12: note: Revealed type is 'TypedDict('_testTypedDictMappingMethods.Cell', {'value': builtins.int})'
_testTypedDictMappingMethods.py:13: note: Revealed type is 'builtins.int'
_testTypedDictMappingMethods.py:15: error: Unexpected TypedDict key 'invalid'
_testTypedDictMappingMethods.py:16: error: Key "value" of TypedDict "Cell" cannot be deleted
_testTypedDictMappingMethods.py:21: note: Revealed type is 'builtins.int'
[case testCrashOnComplexCheckWithNamedTupleNext]
from typing import NamedTuple
MyNamedTuple = NamedTuple('MyNamedTuple', [('parent', 'MyNamedTuple')]) # type: ignore
def foo(mymap) -> MyNamedTuple:
return next((mymap[key] for key in mymap), None)
[out]
[case testCanConvertTypedDictToAnySuperclassOfMapping]
from mypy_extensions import TypedDict
from typing import Sized, Iterable, Container
Point = TypedDict('Point', {'x': int, 'y': int})
p: Point
s: Sized = p
it: Iterable[str] = p
c: Container[str] = p
o: object = p
it2: Iterable[int] = p
[out]
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: error: Incompatible types in assignment (expression has type "Point", variable has type "Iterable[int]")
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: note: Following member(s) of "Point" have conflicts:
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: note: Expected:
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: note: def __iter__(self) -> Iterator[int]
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: note: Got:
_testCanConvertTypedDictToAnySuperclassOfMapping.py:11: note: def __iter__(self) -> Iterator[str]
[case testAsyncioGatherPreciseType]
import asyncio
from typing import Tuple
async def get_location(arg: str) -> Tuple[str, str]:
return arg, arg
async def main() -> None:
((a_x, a_y),) = await asyncio.gather(get_location('start'))
reveal_type(a_x)
reveal_type(a_y)
reveal_type(asyncio.gather(*[asyncio.sleep(1), asyncio.sleep(1)]))
[out]
_testAsyncioGatherPreciseType.py:9: note: Revealed type is 'builtins.str'
_testAsyncioGatherPreciseType.py:10: note: Revealed type is 'builtins.str'
_testAsyncioGatherPreciseType.py:11: note: Revealed type is 'asyncio.futures.Future[builtins.list[Any]]'
[case testMultipleInheritanceWorksWithTupleTypeGeneric]
from typing import SupportsAbs, NamedTuple
class Point(NamedTuple('Point', [('x', int), ('y', int)]), SupportsAbs[int]):
def __abs__(p) -> int:
return abs(p.x) + abs(p.y)
def test(a: Point) -> bool:
return abs(a) == 2
[out]
[case testNoCrashOnGenericUnionUnpacking]
from typing import Union, Dict
TEST = {'key': ('a', 'b')}
def test() -> None:
a, b = TEST.get('foo', ('x', 'y'))
reveal_type(a)
reveal_type(b)
def test2() -> None:
a, b = TEST.get('foo', (1, 2))
reveal_type(a)
reveal_type(b)
x: Union[Dict[int, int], Dict[str, str]] = dict(a='b')
for a, b in x.items():
reveal_type(a)
reveal_type(b)
[out]
_testNoCrashOnGenericUnionUnpacking.py:6: note: Revealed type is 'builtins.str'
_testNoCrashOnGenericUnionUnpacking.py:7: note: Revealed type is 'builtins.str'
_testNoCrashOnGenericUnionUnpacking.py:10: note: Revealed type is 'Union[builtins.str, builtins.int]'
_testNoCrashOnGenericUnionUnpacking.py:11: note: Revealed type is 'Union[builtins.str, builtins.int]'
_testNoCrashOnGenericUnionUnpacking.py:15: note: Revealed type is 'Union[builtins.int*, builtins.str*]'
_testNoCrashOnGenericUnionUnpacking.py:16: note: Revealed type is 'Union[builtins.int*, builtins.str*]'
[case testMetaclassOpAccess]
from typing import Type
class A:
pass
class Meta(type):
def __mul__(self, other: int) -> Type[A]:
pass
def __add__(self, other: int) -> Type[C]:
pass
def __radd__(self, other: int) -> Type[C]:
pass
class C(metaclass=Meta):
pass
bar: Type[C]
def get_c_type() -> Type[C]:
pass
res = bar * 4
other = 4 + get_c_type() + 5
reveal_type(res)
reveal_type(other)
[out]
_testMetaclassOpAccess.py:21: note: Revealed type is 'Type[_testMetaclassOpAccess.A]'
_testMetaclassOpAccess.py:22: note: Revealed type is 'Type[_testMetaclassOpAccess.C]'
[case testMetaclassOpAccessUnion]
from typing import Type, Union
class MetaA(type):
def __mul__(self, other: int) -> str:
pass
class A(metaclass=MetaA):
pass
class MetaB(type):
def __mul__(self, other: int) -> int:
pass
class B(metaclass=MetaB):
pass
bar: Type[Union[A, B]]
res = bar * 4
reveal_type(res)
[out]
_testMetaclassOpAccessUnion.py:16: note: Revealed type is 'Union[builtins.str, builtins.int]'
[case testMetaclassOpAccessAny]
from typing import Type
from nonexistent import C
bar: Type[C]
bar * 4 + bar + 3 # should not produce more errors
[out]
_testMetaclassOpAccessAny.py:2: error: Cannot find implementation or library stub for module named "nonexistent"
_testMetaclassOpAccessAny.py:2: note: See https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports
[case testEnumIterationAndPreciseElementType]
# Regression test for #2305
from enum import Enum
class E(Enum):
A = 'a'
(reveal_type(e) for e in E)
for e in E:
reveal_type(e)
[out]
_testEnumIterationAndPreciseElementType.py:5: note: Revealed type is '_testEnumIterationAndPreciseElementType.E*'
_testEnumIterationAndPreciseElementType.py:7: note: Revealed type is '_testEnumIterationAndPreciseElementType.E*'
[case testEnumIterable]
from enum import Enum
from typing import Iterable
class E(Enum):
A = 'a'
def f(ie: Iterable[E]):
pass
f(E)
[case testIntEnumIterable]
from enum import IntEnum
from typing import Iterable
class N(IntEnum):
X = 1
def f(ni: Iterable[N]):
pass
def g(ii: Iterable[int]):
pass
f(N)
g(N)
reveal_type(list(N))
[out]
_testIntEnumIterable.py:11: note: Revealed type is 'builtins.list[_testIntEnumIterable.N*]'
[case testDerivedEnumIterable]
from enum import Enum
from typing import Iterable
class E(str, Enum):
A = 'foo'
def f(ei: Iterable[E]):
pass
def g(si: Iterable[str]):
pass
f(E)
g(E)
[case testInvalidSlots]
class A:
__slots__ = 1
class B:
__slots__ = (1, 2)
[out]
_testInvalidSlots.py:2: error: Incompatible types in assignment (expression has type "int", base class "object" defined the type as "Union[str, Iterable[str]]")
_testInvalidSlots.py:4: error: Incompatible types in assignment (expression has type "Tuple[int, int]", base class "object" defined the type as "Union[str, Iterable[str]]")
[case testDictWithStarStarSpecialCase]
from typing import Dict
def f() -> Dict[int, str]:
return {1: '', **d()}
def d() -> Dict[int, int]:
return {}
[out]
_testDictWithStarStarSpecialCase.py:4: error: Argument 1 to "update" of "dict" has incompatible type "Dict[int, int]"; expected "Mapping[int, str]"
[case testLoadsOfOverloads]
from typing import overload, Any, TypeVar, Iterable, List, Dict, Callable, Union
S = TypeVar('S')
T = TypeVar('T')
@overload
def simple_map() -> None: ...
@overload
def simple_map(func: Callable[[T], S], one: Iterable[T]) -> S: ...
@overload
def simple_map(func: Callable[..., S], *iterables: Iterable[Any]) -> S: ...
def simple_map(*args): pass
def format_row(*entries: object) -> str: pass
class DateTime: pass
JsonBlob = Dict[str, Any]
Column = Union[List[str], List[int], List[bool], List[float], List[DateTime], List[JsonBlob]]
def print_custom_table() -> None:
a = None # type: Column
for row in simple_map(format_row, a, a, a, a, a, a, a, a): # 8 columns
reveal_type(row)
[out]
_testLoadsOfOverloads.py:24: note: Revealed type is 'builtins.str*'
[case testReduceWithAnyInstance]
from typing import Iterable
from functools import reduce
M = Iterable
def f(m1: M, m2):
...
def g(ms: 'T[M]') -> None:
reduce(f, ms)
T = Iterable
[out]
[case testNamedTupleNew]
# This is an eval test because there was a snag found only with full stubs
from typing import NamedTuple
Base = NamedTuple('Base', [('param', int)])
class Child(Base):
def __new__(cls, param: int = 1) -> 'Child':
return Base.__new__(cls, param)
Base(param=10)
Child(param=10)
reveal_type(Child())
from collections import namedtuple
X = namedtuple('X', ['a', 'b'])
x = X(a=1, b='s')
[out]
_testNamedTupleNew.py:12: note: Revealed type is 'Tuple[builtins.int, fallback=_testNamedTupleNew.Child]'
[case testNewAnalyzerBasicTypeshed_newsemanal]
from typing import Dict, List, Tuple
x: Dict[str, List[int]]
reveal_type(x['test'][0])
[out]
_testNewAnalyzerBasicTypeshed_newsemanal.py:4: note: Revealed type is 'builtins.int*'
[case testNewAnalyzerTypedDictInStub_newsemanal]
import stub
reveal_type(stub.thing)
[file stub.pyi]
from typing_extensions import TypedDict
class StuffDict(TypedDict):
foo: str
bar: int
def thing(stuff: StuffDict) -> int: ...
[out]
_testNewAnalyzerTypedDictInStub_newsemanal.py:2: note: Revealed type is 'def (stuff: TypedDict('stub.StuffDict', {'foo': builtins.str, 'bar': builtins.int})) -> builtins.int'
[case testStrictEqualityWhitelist]
# mypy: strict-equality
{1} == frozenset({1})
frozenset({1}) == {1}
frozenset({1}) == [1] # Error
{1: 2}.keys() == {1}
{1: 2}.keys() == frozenset({1})
{1: 2}.items() == {(1, 2)}
{1: 2}.keys() == {'no'} # Error
{1: 2}.values() == {2} # Error
{1: 2}.keys() == [1] # Error
[out]
_testStrictEqualityWhitelist.py:5: error: Non-overlapping equality check (left operand type: "FrozenSet[int]", right operand type: "List[int]")
_testStrictEqualityWhitelist.py:11: error: Non-overlapping equality check (left operand type: "KeysView[int]", right operand type: "Set[str]")
_testStrictEqualityWhitelist.py:12: error: Non-overlapping equality check (left operand type: "ValuesView[int]", right operand type: "Set[int]")
_testStrictEqualityWhitelist.py:13: error: Non-overlapping equality check (left operand type: "KeysView[int]", right operand type: "List[int]")
[case testUnreachableWithStdlibContextManagers]
# mypy: warn-unreachable, strict-optional
from contextlib import suppress
# This test overlaps with some of the warn-unreachable tests in check-unreachable-code,
# but 'open(...)' is a very common function so we want to make sure we don't regress
# against it specifically
def f_open() -> str:
with open("foo.txt", "r") as f:
return f.read()
print("noop")
# contextlib.suppress is less common, but it's a fairly prominent example of an
# exception-suppressing context manager, so it'd be good to double-check.
def f_suppresses() -> int:
with suppress(Exception):
return 3
print("noop")
[out]
_testUnreachableWithStdlibContextManagers.py:11: error: Statement is unreachable
_testUnreachableWithStdlibContextManagers.py:15: error: Missing return statement
[case testUnreachableWithStdlibContextManagersNoStrictOptional]
# mypy: warn-unreachable, no-strict-optional
from contextlib import suppress
# When strict-optional is disabled, 'open' should still behave in the same way as before
def f_open() -> str:
with open("foo.txt", "r") as f:
return f.read()
print("noop")
# ...but unfortunately, we can't
def f_suppresses() -> int:
with suppress(Exception):
return 3
print("noop")
[out]
_testUnreachableWithStdlibContextManagersNoStrictOptional.py:9: error: Statement is unreachable
_testUnreachableWithStdlibContextManagersNoStrictOptional.py:15: error: Statement is unreachable
[case testIsInstanceAdHocIntersectionWithStrAndBytes]
# mypy: warn-unreachable
x: str
if isinstance(x, bytes):
reveal_type(x)
y: str
if isinstance(x, int):
reveal_type(x)
[out]
_testIsInstanceAdHocIntersectionWithStrAndBytes.py:3: error: Subclass of "str" and "bytes" cannot exist: would have incompatible method signatures
_testIsInstanceAdHocIntersectionWithStrAndBytes.py:4: error: Statement is unreachable
_testIsInstanceAdHocIntersectionWithStrAndBytes.py:6: error: Subclass of "str" and "int" cannot exist: would have incompatible method signatures
_testIsInstanceAdHocIntersectionWithStrAndBytes.py:7: error: Statement is unreachable
[case testAsyncioFutureWait]
# mypy: strict-optional
from asyncio import Future, wait
from typing import List
async def foo() -> None:
f = [] # type: List[Future[None]]
await wait(f)
[case testShadowTypingModule]
1 + ''
[file typing.py]
x = 0
1 + ''
[out]
mypy: "tmp/typing.py" shadows library module "typing"
note: A user-defined top-level module with name "typing" is not supported