-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Closed
Labels
bugmypy got something wrongmypy got something wrongfalse-positivemypy gave an error on correct codemypy gave an error on correct codepriority-1-normaltopic-type-variables
Description
from typing import Callable
from typing import Iterable
from typing import List
from typing import Optional
from typing import TypeVar
class C:
x: str
T = TypeVar('T')
def f(i: Iterable[T], c: Callable[[T], bool]) -> Optional[T]:
for x in i:
if c(x):
return x
else:
return None
def g(l: List[C], x: str) -> Optional[C]:
return f(l, lambda d: d.x == x)$ mypy test.py
test.py:24: error: Item "None" of "Optional[C]" has no attribute "x"
$ mypy --version
mypy 0.610
A little bit complicated, though I believe the lambda should be inferenced as Callable[[C], bool] though it appears to instead be inferenced as Callable[[Optional[C]], bool]
A related, less-lambda-y reproduction:
from typing import Callable
from typing import Iterable
from typing import List
from typing import Optional
from typing import TypeVar
class C:
x: str
T = TypeVar('T')
def f(i: Iterable[T], c: Callable[[T], bool]) -> Optional[T]:
for x in i:
if c(x):
return x
else:
return None
def g(l: List[C], x: str) -> Optional[C]:
def pred(d: C) -> bool:
return d.x == x
return f(l, pred)$ mypy test2.py
test2.py:27: error: Argument 2 to "f" has incompatible type "Callable[[C], bool]"; expected "Callable[[Optional[C]], bool]"
mxr and mantognini
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrongfalse-positivemypy gave an error on correct codemypy gave an error on correct codepriority-1-normaltopic-type-variables