Параметризованное объединение для аннотаций типа python - PullRequest
1 голос
/ 03 февраля 2020

Я бы хотел определить обобщенный тип c, например, следующий

MyType(OtherType) := Union[SomeClass, OtherType]

, чтобы вместо ввода следующего текста для аннотации x:

x: Union[SomeClass, int]

я бы нужно только написать

x: MyType[int]   # or MyType(int) for what it's worth

Нужно ли подкласс Type? Если да, то как же go делать это?

1 Ответ

2 голосов
/ 03 февраля 2020

Если я правильно понял, все, что вам нужно, это TypeVar экземпляр как

from typing import TypeVar, Union


class SomeClass:
    ...


OtherType = TypeVar('OtherType')
MyType = Union[SomeClass, OtherType]


def foo(x: MyType[int]) -> int:
    return x ** 2

с кодом, подобным этому, помещенным в test.py модуль

$ mypy test.py

дает мне

test.py:13: error: Unsupported operand types for ** ("SomeClass" and "int")
test.py:13: note: Left operand is of type "Union[SomeClass, int]"

и с исправлением в foo

def foo(x: MyType[int]) -> int:
    if isinstance(x, SomeClass):
        return 0
    return x ** 2

проблем нет.

Примечания

Если нам это действительно нужно тип псевдонима, который я назвал примерно так:

SomeClassOr = Union[SomeClass, OtherType]

, поскольку

SomeClassOr[int]

кажется мне более читабельным, чем

MyClass[int]

Ссылка

...