我有两个使用 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__
方法。我应该提到的是,代码运行完美,并且(至少看起来)没有运行时错误。
您的代码是正确的并且应该可以工作。如果我运行以下简化版本:
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
我的理论:
kw_only
曾经仅支持 Python 3,如果 mypy 有一些驻留逻辑,我不会感到惊讶?对于从
TypedDict
转换为 attr.s
的类,我遇到了相同的错误。就我而言,旧版本可能已缓存,我通过发出以下命令解决了问题:
rm -r .tox/