以下两个
我相信在Python 3.12中,这就是这两个边界之间的区别。
这是一个我不明白的例子:这通过了类型检查...
...但是使用
相关:关于
TypeVar
之间有什么区别?from typing import TypeVar, Union
class A: pass
class B: pass
T = TypeVar("T", A, B)
T = TypeVar("T", bound=Union[A, B])
我相信在Python 3.12中,这就是这两个边界之间的区别。
class Foo[T: (A, B)]: ...
class Foo[T: A | B]: ...
这是一个我不明白的例子:这通过了类型检查...
T = TypeVar("T", bound=Union[A, B])
class AA(A):
pass
class X(Generic[T]):
pass
class XA(X[A]):
pass
class XAA(X[AA]):
pass
...但是使用
T = TypeVar("T", A, B)
时,它会失败,并显示以下错误信息:
错误:类型变量"T"的值在"X"中不能为"AA"
相关:关于
Union[A, B]
和TypeVar("T", A, B)
之间的区别,可以参考这个问题。
MyUnion
可能是Union[int, str]
的子类型,但它不是int
的子类型。 - Michael0x2aUnion[A, B]
是符合PEP 484标准的有效绑定,因为该类型不包含任何类型变量--类型变量是通过使用TypeVar创建的类型。例如,如果您执行了T1 = TypeVar('T1')
,则在另一个TypeVar定义中尝试使用T1将是非法的,例如通过执行T2 = TypeVar('T2', bound=T2)
或T3 = TypeVar('T3', T2, int)
。这种限制主要存在是为了使类型检查器不需要实现高阶类型,这是一种相当复杂的类型系统特性。 - Michael0x2aT = TypeVar("T", Union[A, B])
- pabouk - Ukraine stay strong