#python #type-hinting #python-typing
Вопрос:
Время от времени я обнаруживаю, что определяю функцию с параметром, который может быть либо отдельным экземпляром типа, либо последовательностью одного и того же типа. Когда сам тип уже имеет сложную природу, подсказки типа могут очень быстро запутаться.
Вместо чего-то вроде
my_dicts: Union[Dict[str, int], Sequence[Dict[str, int]]]
Я хотел бы определить ярлык, чтобы я мог просто ввести
my_dicts: SingleOrSequence[Dict[str, int]]
Как мне сделать это самым питоническим образом? Также имейте в виду, что для соответствия другим типам подпись вызова должна выглядеть так, как указано выше, т. е. указывать имя пользовательского типа и передавать содержащийся тип непосредственно в квадратных скобках.
Лучшее, что я мог придумать, выглядит примерно так:
import typing
class SingleOrSequenceClass():
@staticmethod
def __getitem__(typ):
return typing.Union[typ, typing.Sequence[typ]]
SingleOrSequence = SingleOrSequenceClass()
Это действительно работает, но особенно необходимость создания экземпляра класса SingleOrSequenceClass на самом деле не устраивает меня. Есть какие-нибудь предложения о том, как это улучшить? Предлагает ли сам модуль ввода какое-либо элегантное решение для этого?
Комментарии:
1. «Это действительно работает» нет, это не так. Это не будет работать в качестве аннотации типа для статического анализа
2. Это почему? Как я могу это сфальсифицировать?
3. Попробуйте использовать его
mypy
, например, с. Инструменты статического анализа не будут иметь доступа к информации о времени выполнения .SingleOrSequence = SingleOrSequenceClass()
не является ни типом , ни допустимой аннотацией типа, ни псевдонимом типа.4. Понятно, спасибо за детализацию.
Ответ №1:
Я думаю, что тип дженериков может быть вашим другом.
from typing import TypeVar
T = TypeVar('T')
SingleOrSequence = Union[T, Sequence[T]]
my_dicts: SingleOrSequence[Dict[str, int]]