【发布时间】:2020-07-27 14:42:30
【问题描述】:
我理解(如this question 和the docs) 中所述,X 或 Y 的类型提示可以表示为:
Union[X,Y]
但是如何表达X 和 Y 的类型提示?这在表示所讨论的对象必须是X 和Y 的子类时很有用。
只要事先知道所有继承X 和Y 的类,以下示例就可以工作:
class X: pass
class Y: pass
class A(X,Y): pass
class B(X,Y): pass
def some_function(arg: Union[A,B]):
pass
# do stuff with arg that only depends on inherited members from X and Y
但是如果另一个依赖于上述代码的包定义:
class C(X,Y): pass
C 在设计上也可以在some_function 中工作。我正在寻找一个更好的类型提示来代替 Union[X,Y] 使用,它包括任何可能的子类 X 和 Y。
我了解解决方法可能是定义:
class XY(X,Y): pass
然后将其用作基类并键入提示:
class A(XY): pass
class B(XY): pass
class C(XY): pass
def some_function(arg: XY): pass
但我不确定是否值得仅为类型提示定义一个新类,这无论如何都不会影响运行时。
我们如何为X 和 Y 的子类的任何类创建类型提示?
【问题讨论】:
-
泛型类型是具有一个或多个类型变量的类。我不认为我在谈论泛型类型。
-
对于未来的读者,我想强调 python 协议完全支持这里的要求,尽管语法有点难看。你可以在这里看到一个例子:peps.python.org/pep-0544/#unions-and-intersections-of-protocols。您基本上可以随意要求混合接口,例如 rust 中的特征或 haskell 中的类型类。这个想法真的很强大,目前的答案并没有真正突出这一点,恕我直言。
标签: python python-typing