如何在 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 需要 xy 进行初始化,因此应将它们显式定义为参数。 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。