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
,它描述的类型必须是class
a
和class
B
的子类

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
是不允许的

感谢您对协议的指导。我认为这对于我的用例来说已经足够好了,因为我只关心来自每个父类的一个或两个方法。