我正在使用ID
检查我的Python代码。
我有一个类,我动态设置了一些属性,mypy
继续抱怨它:
mypy
这是我的代码:
error:"Toto" has no attribute "age"
显然,可以有3种方法来解决问题
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
toto.age = 10 # type: ignore #...
设置setattr
的{{1}}:age
toto
...)然而,我正在寻找一种更优雅,更系统的课堂方式。
有什么建议吗?
答案 0 :(得分:3)
我不能很好地关注mypy以了解这是否(仍然或曾经是)理想的工作,但this issue和this 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 = ...
来电,所以抬头。