想象一下一个函数,该函数使用来向对象 动态 添加属性setattr。这样做的原因是我想将一些外部结构(例如给定的参数树)映射到对象:
setattr
my_object = SomeClass() apply_structure(my_object, some_descriptor) my_object.device1.enabled = True
从技术上讲这是可行的,但是Pylint当然正确地抱怨’device1’不是的成员SomeClass。
SomeClass
我可以禁用该警告,但是那会很糟糕(因为在所有情况下由于拼写错误等原因导致该属性不存在时,我仍然希望获得警告)。
是否有一种通用且合法的方式(防印字)将成员动态添加到不会导致警告的对象?
或者:我可以仅对一个 对象 而不对行/块/文件禁用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'可能是任意的并且非常复杂,我不想在类结构中重现它。
'some/attached/device'
消除此警告的一种方法是创建/访问dict基于树的树:
dict
dev['some']['subtree']['element'] = 5
但这很难写,而且不好看-我只能这样做是为了使Pylint安静下来。
只是为了提供现在对我有用的答案-正如编译器建议的那样,您可以在项目中为有问题的类添加规则.pylintrc:
.pylintrc
[TYPECHECK] ignored-classes=Fysom,MyClass