Получить тип элемента типа списка

У меня есть несколько типов списков (из 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.)


person Tobias Hermann    schedule 29.07.2018    source источник


Ответы (1)


Я полагаю, что вы должны иметь возможность проверить параметр __args__:

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

Но обратите внимание на документы:

Примечание. Модуль набора текста включен в стандартную библиотеку на временной основе. Могут быть добавлены новые функции, а API может измениться даже между второстепенными выпусками, если основные разработчики сочтут это необходимым.

Так что это, вероятно, не доказательство будущего.

person juanpa.arrivillaga    schedule 29.07.2018