#python #python-3.x #types #type-hinting
#python #python-3.x #типы #подсказка типа
Вопрос:
Я использую современные подсказки типа Python, как и Tuple[int,...]
. Где-то мне нужно получить исходный тип Python ( tuple
, list
…) из заданной переменной подсказки типа. например:
t = Tuple[int,...]
# Get tuple from t
Комментарии:
1. подсказка типа полезна только для статического анализа кода. Кроме этого особого случая, от него мало пользы.
2. @Daniel: Но при выполнении статического анализа кода, несомненно, было бы полезно иметь удобный способ получения
tuple
из аннотацииTuple[int, float]
.3. Я думаю, вы застряли с грубыми вариантами, такими как синтаксический анализ
repr(t)
.4. @Bakuriu: Функция, которая принимает подсказки типа к конкретным типам, если они действительно соответствуют конкретному типу, может легко существовать. Например, эти подсказки типа могли бы просто предоставлять
concrete_type
атрибут. Однако, похоже, такой функциональности не существует.5. Один из возможных способов — использовать
__extra__
атрибут. Если он присутствует, он работает следующим образомList[int].__extra__ == list
. В настоящее время это работает не со всеми типами (например, не дляTuple
). Обратите внимание, это недокументированная внутренняя функция и может быть отключена без предупреждения 😉 Также вы никогда не должны изменять__extra__
, иначе все может очень сильно сломаться.
Ответ №1:
Простой пример: Type[type, ...]
:
import typing
from typing import Tuple, Optional
t = Tuple[int,...]
typing.get_origin(t)
>>> tuple
typing.get_args(t)
>>> (int, Ellipsis)
Необязательный и вложенный : Optional[Type[type, ...]]
As Optional[T]
эквивалентно Union[T, None]
возвращаемому типу, подобному Union
. Вложенные типы извлекаются рекурсивно таким же образом.
t = Optional[Tuple[int,...]]
typing.get_origin(t)
>>> typing.Union
typing.get_args(t)
>>> (typing.Tuple[int, ...], NoneType)
typing.get_origin(typing.get_args(t)[0])
>>> tuple