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
非常接近我要找的。