如何在Python中正确注释合作继承?

问题描述 投票:0回答:1

假设我有这样的东西。

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

我应该如何注释它? 我试着用 Any 伴随着一些使用 TypedDict但它只是想要值类型。 这是我能做的最好的事情吗?

python mypy python-typing
1个回答
2
投票

更新自 Inherited 两者都需要 xy 来初始化,它们应该被明确定义为参数。kwargs用于合作继承,允许一个类调用另一个类的init,而不需要显式地担心参数的类型(这里指的是 z:float)是。因此 Any 在这种情况下确实是正确的注解。

同样,为了初始化 Final我建议定义 __init__ 和所有必要的参数,即, def __init__(self, x:int, y:int, z:float, **kwargs:Any)

同样的,Final也可以被其他类继承,并且它不关心派生类的参数,但保留了 **kwargs:Any 为了合作继承的兼容性

ps,不好意思,绕来绕去说的都是同一件事。

老答案 python中的kwargs是一个键值对的dict,这些键值对并不在方法的显式参数中。因此 **kwargs 会收集任何 foo=bar 争论,其中 foo 不在定义的参数中。的值 bar 可以是任何东西,这就是为什么 Any 因为 ** 表示这些值将被自然地包裹在一个kwargs dict中。你可以对值的类型进行注释 bar 但在这里,你可以传递任何未声明的键值对。**kwargs:int 意味着你可以传递任何未声明的键值对,只要它是一个int。

© www.soinside.com 2019 - 2024. All rights reserved.