避免Pylint警告E1101:'实例。。没有。。具有动态属性的类的成员

2024-05-15 03:53:07 发布

您现在位置:Python中文网/ 问答频道 /正文

想象一个函数,它使用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安静下来。


Tags: 对象dev警告属性objectvaluemy动态
3条回答

为了提供对我有效的答案-正如The Compiler建议的那样,您可以在项目中为有问题的类添加规则.pylintrc

[TYPECHECK]
ignored-classes=Fysom,MyClass

试试这个!我的问题解决了!

Pylint不理解Django的动态字段。因此,我们需要教Django是什么

*适用于Windows 10*中的vscode

$ pip install pylint-django
$ cd your_project_folder
$ code . // run vscode  

在vscode中安装Python扩展、Django片段、Django模板

在vscode中打开.vscode/settings.json,并添加:

{
   "python.linting.pylintEnabled": true,
   "python.linting.enabled": true,
   "python.pythonPath": "venv\\Scripts\\python.exe",
   "python.linting.pylintArgs": [
       "--load-plugins",
       "pylint_django"
   ],
}

This page描述了错误,并提供了一种在代码中直接解决错误的简单方法。tl;博士

在为不存在的成员访问对象(变量、函数等)时使用。

误报:此消息可能会报告动态创建但在访问时存在的对象成员。

注释者提到可以用# pylint: disable=no-member在文件顶部的一行禁用它。我还发现您可以使用基于this reddit entry# pylint: disable=E1101

相关问题 更多 >

    热门问题