【问题标题】:How to solve "unexpected keyword argument" with python-attrs construct, so that mypy is happy?如何用 python-attrs 构造解决“意外的关键字参数”,让 mypy 开心?
【发布时间】:2021-12-04 04:41:50
【问题描述】:

我在国外图书馆有一个class A

class A:
    def __init__(self, a: int):
        self.a = a

我想用A 扩展class B,例如:

import attr

@attr.s
class B(A):
    b: int = attr.ib()

代码似乎有效:

import attr

class A:
    def __init__(self, a: int):
        self.a = a

attr.s(these={
    "a": attr.ib(type=str)
}, init=True)(A)

@attr.s(kw_only=True)
class B(A):
    b: int = attr.ib()

if __name__ == "__main__":
    a = A(1)
    b = B(a=1, b=2)
    print(a)  # output: A(a=1) 
    print(b)  # output: B(a=1, b=2)

但是 mypy/pyright 不开心。

> mypy file.py
error: Unexpected keyword argument "a" for "B"

【问题讨论】:

    标签: python type-hinting mypy python-typing python-attrs


    【解决方案1】:

    我有理由确定 MyPy attrs 插件不支持 these

    由于您没有调用super,惯用的方法是将a 定义为B 上的一个属性,以便attrs 处理它。


    JFTR:如果您使用@attr.define@attr.s(auto_attribs=True),则可以省略attr.ib() 调用。

    【讨论】:

    • 谢谢,@hynek。这是一个重要的提示。我错误地认为attrs 在幕后制作了super()。与此同时,我将其更改为@attr.define。很遗憾 mypy 不能正确支持它。
    • attrs never 超级(每种方法都针对每种情况进行了优化)。如果需要调用 super,有办法实现:attrs.org/en/stable/…
    猜你喜欢
    • 2021-11-22
    • 2013-05-05
    • 1970-01-01
    • 2020-06-15
    • 2013-09-03
    • 1970-01-01
    • 2012-11-10
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多