Подсказка пользовательского типа с параметром

#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]]