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__我的父类的方法。我应该提到代码运行良好,并且(至少看起来)没有运行时错误。

4

1 回答 1

3

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

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 上通过 Mypy 0.910 和 attrs 21.2.0 我得到:

Success: no issues found in 1 source file

我的理论:

  • 旧的 Mypy(总是有很多变化,有时 attrs 插件需要时间来更新新功能)。
  • 旧的 attrs(我们试图跟上 attrs 的变化和 Mypy 提供的功能)。
  • Python 2(因为您使用的是旧语法)。kw_only曾经只有 Python 3,如果 mypy 有一些常驻逻辑,我不会感到惊讶?
于 2021-10-02T12:04:48.463 回答