约束的TypeVar和Union之间有什么区别?

时间:2019-11-17 18:42:15

标签: python python-3.x type-hinting union-types type-variables

如果我想要一个可以表示多种可能类型的类型,那么Union似乎就是我的表示方式:

U = Union(int, str)

U可以是intstr

我注意到,尽管TypeVar允许可选的var-arg参数,但它们似乎也做同样的事情:

T = TypeVar("T", int, str)

TU似乎都只能采用strint类型。

这两种方式之间有什么区别,什么时候应该优先使用?

1 个答案:

答案 0 :(得分:3)

T的类型必须在给定“范围”内的多次使用中保持一致,而U的类型必须不一致。

使用Union类型作为函数参数时,参数以及返回类型都可以不同:

U = Union[int, str]

def union_f(arg1: U, arg2: U) -> U:
    return arg1

x = union_f(1, "b")  # No error due to different types
x = union_f(1, 2)  # Also no error
x = union_f("a", 2)  # Also no error
x # And it can't tell in any of the cases if 'x' is an int or string

将其与参数类型必须匹配的TypeVar进行比较:

T = TypeVar("T", int, str)

def typevar_f(arg1: T, arg2: T) -> T:
    return arg1

y = typevar_f(1, "b")  # "Expected type 'int' (matched generic type 'T'), got 'str' instead
y = typevar_f("a", 2)  # "Expected type 'str' (matched generic type 'T'), got 'int' instead

y = typevar_f("a", "b")  # No error
y  # It knows that 'y' is a string

y = typevar_f(1, 2)  # No error
y  # It knows that 'y' is an int

因此,如果允许多种类型,请使用TypeVar,但是单个作用域内的不同用法必须彼此匹配。如果允许使用多种类型,请使用Union,但不同的用法不需要​​与其他用法的类型匹配。