python-指定具有多个基的类型(类型和运算符)

python-指定具有多个基的类型(类型和运算符),python,python-typing,Python,Python Typing,我理解(如和中所述,X或Y的类型提示可以表示为: Union[X,Y] 但是如何表达X和Y的类型提示呢?当表示所讨论的对象必须是X和Y的子类时,这将非常有用 只要预先知道继承X和Y的所有类,以下示例就可以工作: X级:通过 Y班:通过 A类(X,Y):合格 B类(X,Y):合格 定义一些函数(arg:Union[A,B]): 通过 #使用仅依赖于从X和Y继承的成员的arg进行操作 但是,如果依赖于上述代码的另一个包定义: C类(X,Y):通过 C也可以通过设计在某些函数中工作。我正在寻找一

我理解(如和中所述,
X
Y
的类型提示可以表示为:

Union[X,Y]
但是如何表达
X
Y
的类型提示呢?当表示所讨论的对象必须是
X
Y
的子类时,这将非常有用

只要预先知道继承
X
Y
的所有类,以下示例就可以工作:

X级:通过
Y班:通过
A类(X,Y):合格
B类(X,Y):合格
定义一些函数(arg:Union[A,B]):
通过
#使用仅依赖于从X和Y继承的成员的arg进行操作
但是,如果依赖于上述代码的另一个包定义:

C类(X,Y):通过
C
也可以通过设计在
某些函数中工作。我正在寻找一个更好的类型提示来代替
Union[X,Y]
,它包括任何可能的类,这些类同时包含
X
Y

我知道解决方法可以定义:

XY类(X,Y):通过
然后将其用作基类并键入提示:

A类(XY):通过
B级(XY):合格
C类(XY):合格
def some_函数(arg:XY):通过
但我不确定只为类型hint定义一个新类是否值得,因为它不会影响运行时


如何为同时是
X
Y
的子类的任何类创建类型提示?

Python
类型提示不支持显式
交集
注释。但您至少有两种解决方法:

您可以引入一个混合类,例如:

class A:
    def foo_a(self):
        pass

class B:
    def foo_b(self):
        pass
    

class Mix(A, B):
    pass


def foo(p: Mix) -> None:
    p.foo_a()
    p.foo_b()
或者使用结构子类型,
协议
,例如:

from typing import Protocol

class Supports_ab(Protocol):
    def a(self):
        pass
    
    def b(self):
        pass

class A:
    def a(self):
        pass

class B:
    def b(self):
        pass

class Derived(A, B):
    pass

    
class SomeClassAB:  # no need superclass
    def a(self):
        pass
    
    def b(self):
        pass
    
def foo(p: Supports_ab) -> None:
    p.a()
    p.b()

foo(SomeClassAB())
foo(Derived())

泛型类型是一个包含一个或多个类型变量的类。我不认为我在谈论泛型类型。有趣的是,
Protocol
非常接近我要找的。