У меня есть некоторые типы списков (исходящие из 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
.)
Я считаю, что вы должны проверить параметр __args__
:
>>> from typing import Dict, List, Type, TypeVar
>>> List[Dict].__args__
(typing.Dict,)
>>> List[int].__args__
(<class 'int'>,)
Но обратите внимание на документы:
Примечание. Типовой модуль был включен в стандартную библиотеку на временной основе. Новые функции могут быть добавлены, и API может измениться даже между незначительными версиями, если это будет сочтено необходимым для основных разработчиков.
Так что это, вероятно, не будущее доказательство.