设想一个函数,其中 动态的使用 setattr
向对象添加属性。这样做的原因是我想把一些外部结构(例如给定的参数树)映射到一个对象:
my_object = SomeClass()
apply_structure(my_object, some_descriptor)
my_object.device1.enabled = True
从技术上讲,这是可行的,但是当然 Pylint 正确地抱怨了“ device1”不是 SomeClass
的成员。
我可以禁用这个警告,但这样做不好(因为我仍然希望在所有情况下获得这个警告,当属性由于拼写错误等原因不存在时)。
有没有一种通用的、合法的(Pylint-proof)方法来动态地向对象添加不会导致警告的成员?
或者: 我可以为一个 对象而不是一行/块/文件禁用 Pylint 吗?
解说 :
您可能想知道,当我计划以后以硬编码的方式访问这些属性时,为什么要动态地为对象配备成员属性。
原因是: 我有一个动态部分的程序(在哪里装饰发生)和一个静态部分是 专业的的某个 场景。所以我 可以也为这个场景创建了一个静态类,但是在很多情况下这样做有点过了。
下面的 专业的代码可能允许访问可能连接到某些总线的设备的某些参数:
class MyDeviceHandler:
on_get_some_subtree_element(self):
return _some_internal_value
on_set_some_subtree_element(self, value):
_some_internal_value = value
dev = MyDeviceHandler()
decorate_object_with_device_structure(dev, 'some/attached/device')
dev.some.subtree.element = 5 <--- will call the set-callback
x = dev.some.subtree.element <--- will call the get-callback
所以 'some/attached/device'
背后的结构可能是任意的,非常复杂的,我不想在类结构中重现它。
消除这种警告的一种方法是创建/访问一个基于 dict
的树:
dev['some']['subtree']['element'] = 5
但是这个更难写,也不好读——我这样做只是为了让 Pylint 安静下来。