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 有一些常驻逻辑,我不会感到惊讶吗?
我有两个使用 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 有一些常驻逻辑,我不会感到惊讶吗?