如何在 Python 中正确注释合作继承?
How do I properly annotate cooperative inherance in Python?
假设我有这样的东西:
from typing import Mapping, Any
class Hidden:
def __init__(self, z: float, **kwargs: Any):
super().__init__(**kwargs)
self.z = z
class Base:
def __init__(self, x: int, **kwargs: Any):
super().__init__(**kwargs)
self.x = x
class Inherited(Base):
def __init__(self, y: int, **kwargs: Any):
super().__init__(**kwargs)
self.y = y
class Final(Inherited, Hidden):
pass
应该怎么标注呢?我尝试用 TypedDict
的某些用途替换 Any
,但它只需要值类型。这是我能做的最好的了吗?
更新
由于 Inherited
需要 x
和 y
进行初始化,因此应将它们显式定义为参数。 kwargs 用于合作继承,允许一个 class 调用另一个的 init 而不必明确担心参数类型(这里 z:float
)是什么。因此 Any
在这种情况下确实是正确的注释。
同样,为了初始化 Final
,我建议使用所有必需的参数定义 __init__
,即 def __init__(self, x:int, y:int, z:float, **kwargs:Any)
同样,Final 也可以被其他 class 继承,它不关心派生 class 的参数,但保留 **kwargs:Any
以实现合作继承兼容性
ps,抱歉为同样的事情兜兜转转。
旧答案
python 中的 kwargs 是键值对的字典,这些键值对不在该方法的显式定义参数中。因此 **kwargs
最终会收集任何 foo=bar
参数,其中 foo
不在定义的参数中。
值 bar
几乎可以是任何值,这就是为什么使用 Any
的原因,因为 **
表示这些值将自然地包含在 kwargs dict 中。
不过,您可以在此处注释值的类型 bar
。
**kwargs:int
意味着您可以传递任何未声明的键值对,只要它是一个 int。
假设我有这样的东西:
from typing import Mapping, Any
class Hidden:
def __init__(self, z: float, **kwargs: Any):
super().__init__(**kwargs)
self.z = z
class Base:
def __init__(self, x: int, **kwargs: Any):
super().__init__(**kwargs)
self.x = x
class Inherited(Base):
def __init__(self, y: int, **kwargs: Any):
super().__init__(**kwargs)
self.y = y
class Final(Inherited, Hidden):
pass
应该怎么标注呢?我尝试用 TypedDict
的某些用途替换 Any
,但它只需要值类型。这是我能做的最好的了吗?
更新
由于 Inherited
需要 x
和 y
进行初始化,因此应将它们显式定义为参数。 kwargs 用于合作继承,允许一个 class 调用另一个的 init 而不必明确担心参数类型(这里 z:float
)是什么。因此 Any
在这种情况下确实是正确的注释。
同样,为了初始化 Final
,我建议使用所有必需的参数定义 __init__
,即 def __init__(self, x:int, y:int, z:float, **kwargs:Any)
同样,Final 也可以被其他 class 继承,它不关心派生 class 的参数,但保留 **kwargs:Any
以实现合作继承兼容性
ps,抱歉为同样的事情兜兜转转。
旧答案
python 中的 kwargs 是键值对的字典,这些键值对不在该方法的显式定义参数中。因此 **kwargs
最终会收集任何 foo=bar
参数,其中 foo
不在定义的参数中。
值 bar
几乎可以是任何值,这就是为什么使用 Any
的原因,因为 **
表示这些值将自然地包含在 kwargs dict 中。
不过,您可以在此处注释值的类型 bar
。
**kwargs:int
意味着您可以传递任何未声明的键值对,只要它是一个 int。