mypy:无法推断“map”的类型参数1

时间:2017-07-08 16:08:07

标签: python python-3.x python-3.6 mypy

尝试使用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:错误:无法推断“map”的类型参数1

为什么会出现此错误?我该如何解决?

谢谢:)

1 个答案:

答案 0 :(得分:3)

您可能已经知道,mypy依赖于typeshed来保存Python标准库中的类和函数。我相信您的问题与类型化stubbing of map

有关
@overload
def map(func: Callable[[_T1], _S], iter1: Iterable[_T1]) -> Iterator[_S]: ...

mypy的当前状态是这样的,它的类型推断不是无限制的。 (该项目还有over 600 open issues.

我相信您的问题可能与issue #1855有关。我认为情况就是这样,因为DigitsSequence = strDigitsSequence = Sequence[int]都有效,而DigitsSequence = Union[str, Sequence[int]]却没有。

一些解决方法:

  1. 改为使用lambda表达式:

    new_digits = list(map(lambda s: str(s), digits))
    
  2. 重新投射到新变量:

    any_digits = digits # type: Any
    new_digits = list(map(str, any_digits))
    
  3. 请mypy忽略该行:

    new_digits = list(map(str, digits)) # type: ignore