获取列表类型的元素类型

时间:2018-07-29 07:17:33

标签: python python-3.6 typing

我有一些列表类型(来自inspect.signature-> inspect.Parameter),我想了解它们的元素类型。我当前的解决方案可以工作,但是非常难看,请参见下面的最小示例:

from typing import List, Type, TypeVar

TypeT = TypeVar('TypeT')

IntList = List[int]
StrList = List[str]

# todo: Solve without string representation and eval
def list_elem_type(list_type: Type[TypeT]) -> Type[TypeT]:
    assert str(list_type)[:11] == 'typing.List'
    return eval(str(list_type)[12:-1]) # type: ignore

assert list_elem_type(IntList) is int
assert list_elem_type(StrList) is str

获取List元素类型的正确方法是什么?

(我使用的是Python 3.6,该代码应在通过mypy --strict的检查后仍然可以保存。)

1 个答案:

答案 0 :(得分:1)

相信,您应该可以检查__args__参数:

>>> from typing import Dict, List, Type, TypeVar
>>> List[Dict].__args__
(typing.Dict,)
>>> List[int].__args__
(<class 'int'>,)

但是请注意docs

  

注意:打字模块已临时包含在标准库中。可能会添加新功能并且API可能会更改   即使在核心认为必要的次要发行之间   开发人员。

所以这可能不是未来的证明。