使用内置地图功能键入

时间:2017-05-15 23:00:12

标签: python python-3.x pycharm type-hinting

我的IDE(PyCharm)无法自动完成以下操作:

from typing import List, TypeVar

T = TypeVar('T')

def listify(x: T) -> List[T]:
    return [x]

str_list: List[str] = ['a', 'b']
listified = map(listify, str_list)
listified[0].<TAB>  # autocomplete fail, IDE fails to recognize this is a List

这是我的IDE的问题,还是typingmap不兼容?

无论答案是什么,我试图通过包裹map

来解决
from typing import Callable, Iterable, List, TypeVar

T = TypeVar('T')
U = TypeVar('U')

def listify(x: T) -> List[T]:
    return [x]

def univariate_map(func: Callable[[T], U], x: Iterable[T]) -> Iterable[U]:
    return map(func, x)  

str_list: List[str] = ['a', 'b']
listified = univariate_map(listify, str_list)
listified[0].<TAB>  # still fails to autocomplete

同样,这是我的IDE的问题,还是我对typing模块的期望不正确?

1 个答案:

答案 0 :(得分:1)

问题是map返回一个迭代器,你不能索引([0])迭代器。当您将map转换为list时,PyCharm会识别出类型:

from typing import List, TypeVar

T = TypeVar('T')

def listify(x: T) -> List[T]:
    return [x]

str_list: List[str] = ['a', 'b']
listified = list(map(listify, str_list))  # list is new here
listified[0].

截图:

enter image description here

但是,即使没有任何类型提示(在这种情况下),PyCharm似乎也可以推断出函数的类型。