gpt4 book ai didi

python - 用多个基数指定类型(输入 AND 运算符)

转载 作者:行者123 更新时间:2023-12-03 23:45:24 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





python typing module: Mixin

(1 个回答)


去年关闭。




我明白(如 this questionthe 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 type-hints不支持显式 intersection注解。但是您至少有两种解决方法:
你可以介绍一个 混合类,例如:

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()
或者使用结构子类型, Protocol ,例如:
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())

关于python - 用多个基数指定类型(输入 AND 运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63108452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com