mypy:无法推断 "map" 的类型参数 1
mypy: Cannot infer type argument 1 of "map"
当尝试使用 mypy 检查以下代码时:
import itertools
from typing import Sequence, Union, List
DigitsSequence = Union[str, Sequence[Union[str, int]]]
def normalize_input(digits: DigitsSequence) -> List[str]:
try:
new_digits = list(map(str, digits)) # <- Line 17
if not all(map(str.isdecimal, new_digits)):
raise TypeError
except TypeError:
print("Digits must be an iterable containing strings.")
return []
return new_digits
mypy 抛出以下错误:
calculate.py:17: error: Cannot infer type argument 1 of "map"
为什么会出现这个错误?我该如何解决?
谢谢:)
编辑:原来是mypy里的bug,现在修复了
您可能已经知道,mypy depends on typeshed to stub the classes and functions in Python's standard library. I believe your issue this has to do with typeshed's stubbing of map
:
@overload
def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterator[_S]: ...
而且 mypy 的当前状态是它的类型推断不是无限的。 (项目还有over 600 open issues.)
我认为您的问题可能与 issue #1855 有关。我认为是这种情况,因为 DigitsSequence = str
和 DigitsSequence = Sequence[int]
都有效,而 DigitsSequence = Union[str, Sequence[int]]
无效。
一些解决方法:
改用 lambda 表达式:
new_digits = list(map(lambda s: str(s), digits))
重新转换为新变量:
any_digits = digits # type: Any
new_digits = list(map(str, any_digits))
让mypy忽略这一行:
new_digits = list(map(str, digits)) # type: ignore
当尝试使用 mypy 检查以下代码时:
import itertools
from typing import Sequence, Union, List
DigitsSequence = Union[str, Sequence[Union[str, int]]]
def normalize_input(digits: DigitsSequence) -> List[str]:
try:
new_digits = list(map(str, digits)) # <- Line 17
if not all(map(str.isdecimal, new_digits)):
raise TypeError
except TypeError:
print("Digits must be an iterable containing strings.")
return []
return new_digits
mypy 抛出以下错误:
calculate.py:17: error: Cannot infer type argument 1 of "map"
为什么会出现这个错误?我该如何解决?
谢谢:)
编辑:原来是mypy里的bug,现在修复了
您可能已经知道,mypy depends on typeshed to stub the classes and functions in Python's standard library. I believe your issue this has to do with typeshed's stubbing of map
:
@overload
def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterator[_S]: ...
而且 mypy 的当前状态是它的类型推断不是无限的。 (项目还有over 600 open issues.)
我认为您的问题可能与 issue #1855 有关。我认为是这种情况,因为 DigitsSequence = str
和 DigitsSequence = Sequence[int]
都有效,而 DigitsSequence = Union[str, Sequence[int]]
无效。
一些解决方法:
改用 lambda 表达式:
new_digits = list(map(lambda s: str(s), digits))
重新转换为新变量:
any_digits = digits # type: Any new_digits = list(map(str, any_digits))
让mypy忽略这一行:
new_digits = list(map(str, digits)) # type: ignore