类型:原始值或容器

Typing: Raw value or Container

我想创建一个参数化类型 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]]):
    ...

有没有捷径或者我需要自己写一个class 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。我需要做哪些不同的事情?

你很接近了——你需要做 RawOrVariable = Union[T, Variable[T]] 而不是 RawOrVariable[T] = Union[T, Variable[T]]

请注意,后者是无效的 Python 代码 -- RawOrVariable 变量未在运行时定义。

有关详细信息,请参阅 mypy docs on generic type aliases. PEP 484 also briefly gives an example of what a generic type alias looks like in the second example here