Получить исходный тип Python из подсказки типа

#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