Mypy 对于带有 attrs 包的修饰类的子类返回错误“意外的关键字参数”

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

我有两个使用 attrs 包装饰的类,如下所示:

@attr.s(kw_only=True)
class Entity:
    """
    base class of all entities
    """
    entity_id = attr.ib(type=str)
    # ...

@attr.s(kw_only=True)
class Customer(Entity):
    customer_name = attr.ib(type=Name)
    # ...

我得到

Unexpected keyword argument "entity_id" for "Customer"
这样的代码:

def register_customer(customer_name: str):
    return Customer(
        entity_id=unique_id_generator(),
        customer_name=Name(full_name=customer_name),
    )

那么我怎样才能让 Mypy 知道我的父类的

__init__
方法。我应该提到的是,代码运行完美,并且(至少看起来)没有运行时错误。

python type-hinting mypy python-typing python-attrs
2个回答
4
投票

您的代码是正确的并且应该可以工作。如果我运行以下简化版本:

import attr

@attr.s(kw_only=True)
class Entity:
    """
    base class of all entities
    """
    entity_id = attr.ib(type=str)
    # ...

@attr.s(kw_only=True)
class Customer(Entity):
    customer_name = attr.ib(type=str)

def register_customer(customer_name: str) -> Customer:
    return Customer(
        entity_id="abc",
        customer_name=customer_name,
    )   # ...

通过在 Python 3.9.7 上使用 attrs 21.2.0 的 Mypy 0.910 我得到:

Success: no issues found in 1 source file

我的理论:

  • 旧的 Mypy(一直都有很多变化,有时 attrs 插件需要时间来更新新功能)。
  • 旧的 attrs(我们尝试跟上 attrs 的变化以及 Mypy 提供的功能)。
  • Python 2(因为您使用的是旧语法)。
    kw_only
    曾经仅支持 Python 3,如果 mypy 有一些驻留逻辑,我不会感到惊讶?

0
投票

对于从

TypedDict
转换为
attr.s
的类,我遇到了相同的错误。就我而言,旧版本可能已缓存,我通过发出以下命令解决了问题:

rm -r .tox/
© www.soinside.com 2019 - 2024. All rights reserved.