用于Python类型注释的参数联合

时间:2020-02-03 11:23:08

标签: python python-3.x mypy python-typing

我想定义如下的通用类型

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

因此不必键入以下内容来注释x:

x: Union[SomeClass, int]

我只需要写

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

我是否必须继承Type的子类?如果是这样,该怎么做呢?

1 个答案:

答案 0 :(得分:2)

如果我正确理解,您所需要的只是像TypeVar instance

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]

参考