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

问题描述 投票:36回答:3

想象一个函数,它使用setattr动态地向对象添加属性。这样做的原因是我想将一些外部结构(例如给定的参数树)映射到对象:

my_object = SomeClass()
apply_structure(my_object, some_descriptor)
my_object.device1.enabled = True

从技术上讲这是有效的,但当然Pylint正确地抱怨'device1'不是SomeClass的成员。

我可以禁用警告,但这样会很糟糕(因为我仍然希望在因错误拼写等原因而不存在该属性的情况下获得警告)。

是否有一种通用且合法(Pylint证明)的方式来动态地将成员添加到不会导致警告的对象?

或者:我可以只为一个对象而不是行/块/文件禁用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安静下来。

python dynamic pylint
3个回答
42
投票

只是提供现在适用于我的答案 - 正如The Compiler建议你可以为你的项目.pylintrc中的有问题的类添加规则:

[TYPECHECK]
ignored-classes=Fysom,MyClass

5
投票

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

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

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

评论员提到可以使用# pylint: disable=no-member在文件顶部的单行上禁用它。我还发现你可以使用基于# pylint: disable=E1101this reddit entry


0
投票

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

Pylint不了解Django动态字段。因此,我们需要教授Django对Pylint的意义

*适用于Windows 10 *中的vscode

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

在vscode中安装Python,Django Snippets,Django Template的扩展

在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"
   ],
}
© www.soinside.com 2019 - 2024. All rights reserved.