Python TypeVar描述的类必须子类化多个类
我想创建一个类型注释Python TypeVar描述的类必须子类化多个类,python,python-3.x,typing,python-typing,Python,Python 3.x,Typing,Python Typing,我想创建一个类型注释T,它描述的类型必须是classa和classB的子类 T=TypeVar('T',bound=A)仅指定T必须是A的子类 T=TypeVar('T',A,B)仅指定T必须是A的子类或B的子类,但不一定两者都是。 实际上,我想要类似于T=TypeVar('T',bound=[A,B])的东西,这意味着T必须同时对A和B进行子类化。有标准的方法吗?您需要的是交叉口类型。严格地说,我不相信Python的类型注释支持这一点(至少现在还不支持)。但是,您可以通过协议获得类似的结果:
T
,它描述的类型必须是classa
和classB
的子类
T=TypeVar('T',bound=A)
仅指定T
必须是A
的子类
T=TypeVar('T',A,B)
仅指定T
必须是A
的子类或B
的子类,但不一定两者都是。
实际上,我想要类似于
T=TypeVar('T',bound=[A,B])
的东西,这意味着T
必须同时对A
和B
进行子类化。有标准的方法吗?您需要的是交叉口类型。严格地说,我不相信Python的类型注释支持这一点(至少现在还不支持)。但是,您可以通过协议获得类似的结果:
from typing import Protocol, TypeVar
class A:
def foo(self) -> int:
return 42
class B:
def bar(self) -> bool:
return False
class C(A, B): pass
class D(A): pass
class E(B): pass
class ABProtocol(Protocol):
def foo(self) -> int: ...
def bar(self) -> bool: ...
T = TypeVar('T', bound=ABProtocol)
def frobnicate(obj: T) -> int:
if obj.bar():
return obj.foo()
return 0
frobnicate(C())
frobnicate(D())
frobnicate(E())
Mypy抱怨说:
test.py:26: error: Value of type variable "T" of "frobnicate" cannot be "D"
test.py:27: error: Value of type variable "T" of "frobnicate" cannot be "E"
当然,这需要您自己显式地注释所有的方法,不幸的是,类似于类ABProtocol(A,B,Protocol):pass
是不允许的感谢您对协议的指导。我认为这对于我的用例来说已经足够好了,因为我只关心来自每个父类的一个或两个方法。