想象一个使用动态向对象添加属性的函数setattr.这样做的原因是我想将一些外部结构(例如给定的参数树)映射到对象:
my_object = SomeClass()
apply_structure(my_object, some_descriptor)
my_object.device1.enabled = True
Run Code Online (Sandbox Code Playgroud)
从技术上讲这是有效的,但当然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
Run Code Online (Sandbox Code Playgroud)
所以后面的结构'some/attached/device'可能是任意的,非常复杂,我不想在类结构中重现它.
摆脱此警告的一种方法是创建/访问dict基于树的方法:
dev['some']['subtree']['element'] = 5
Run Code Online (Sandbox Code Playgroud)
但是这写起来比较难写,而且阅读起来也不好 - 我只会这样做才能让Pylint安静下来.