从mypy中删除Python类中动态设置的属性的错误

时间:2018-06-16 16:28:46

标签: python mypy

我正在使用ID检查我的Python代码。

我有一个类,我动态设置了一些属性,mypy继续抱怨它:

mypy

这是我的代码:

error:"Toto" has no attribute "age"

显然,可以有3种方法来解决问题

  1. 使用class Toto: def __init__(self, name:str) -> None: self.name = name for attr in ['age', 'height']: setattr(self, attr, 0) toto = Toto("Toto") toto.age = 10 # "Toto" has no attribute "age" :( 忽略此问题:# type: ignore
  2. 使用toto.age = 10 # type: ignore #...设置setattr的{​​{1}}:age
  3. 明确设置属性(toto ...)
  4. 然而,我正在寻找一种更优雅,更系统的课堂方式。

    有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我不能很好地关注mypy以了解这是否(仍然或曾经是)理想的工作,但this issuethis part of the cheatsheet表示类似:

from typing import Any

class Toto:
    def __init__(self, name:str) -> None:
        self.name = name
        for attr in ['age', 'height']:
            setattr(self, attr, 0)

    def __setattr__(self, name:str, value:Any):
        super().__setattr__(name, value)

toto = Toto("Toto")
toto.age = 10

允许你在没有mypy抱怨的情况下做你正在做的事情(它只做了测试)。

Any可能会更具限制性,但会在setattr()和"传统"上检查类型。 obj.attr = ...来电,所以抬头。