Ввод: сырье или контейнер - PullRequest
       40

Ввод: сырье или контейнер

0 голосов
/ 20 октября 2019

Я хотел бы создать параметризованный тип RawOrVariable[T] = Union[T, Variable[T]], чтобы

def foo(a: RawOrVariable[str]):
    ...
def bar(b: RawOrVariable[int]):
    ...

эквивалентно

def foo(a: Union[str, Variable[str]]):
    ...
def bar(b: Union[int, Variable[int]]):
    ...

Есть ли ярлык или мне нужно написать классRawOrVariable сам? Например, вот так:

@type_check_only
class RawOrVariable:
   def __class_getitem__(cls, t):
       return Union[t, Variable[t]]

О чем я должен знать?

Обновление

Когда я использую выше RawOrVarialbe, mypy жалуется: "RawOrVariable" expects no type arguments, but 1 given,Что я должен делать по-другому?

1 Ответ

1 голос
/ 21 октября 2019

Вы близки - вам нужно сделать RawOrVariable = Union[T, Variable[T]] вместо RawOrVariable[T] = Union[T, Variable[T]].

Обратите внимание, что последний не является допустимым кодом Python - переменная RawOrVariable не определена ввремя выполнения.

Подробнее см. в документации mypy по псевдонимам универсального типа . PEP 484 также кратко дает пример того, как выглядит псевдоним универсального типа во втором примере здесь .

...