如果我想要一个可以表示多种可能类型的类型,那么Union
似乎就是我的表示方式:
U = Union(int, str)
U
可以是int
或str
。
我注意到,尽管TypeVar
允许可选的var-arg参数,但它们似乎也做同样的事情:
T = TypeVar("T", int, str)
T
和U
似乎都只能采用str
和int
类型。
这两种方式之间有什么区别,什么时候应该优先使用?
答案 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
,但不同的用法不需要与其他用法的类型匹配。