Mypy returns 带有 attrs 包的修饰 class 的子 class 错误 "Unexpected keyword argument"

Mypy returns Error "Unexpected keyword argument" for subclass of a decorated class with attrs package

我有两个使用 attrs package 装饰的 classes 如下:

@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 知道我的父 class 的 __init__ 方法。我应该提到代码运行完美,并且(至少看起来)没有运行时错误。

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

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 插件需要时间来更新新功能)。
  • 旧属性(我们努力跟上属性的变化和 Mypy 提供的功能)。
  • Python 2(因为您使用的是旧语法)。 kw_only 曾经是 Python 3-only 如果 mypy 有一些常驻逻辑,我不会感到惊讶吗?