我有一些列表类型(来自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
的检查后仍然可以保存。)
答案 0 :(得分:1)
我相信,您应该可以检查__args__
参数:
>>> from typing import Dict, List, Type, TypeVar
>>> List[Dict].__args__
(typing.Dict,)
>>> List[int].__args__
(<class 'int'>,)
但是请注意docs:
注意:打字模块已临时包含在标准库中。可能会添加新功能并且API可能会更改 即使在核心认为必要的次要发行之间 开发人员。
所以这可能不是未来的证明。