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

5 浏览
0 Comments

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

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

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

\n从技术上讲,这样可以工作,但当然Pylint会正确地抱怨\'device1\'不是SomeClass的成员。\n我可以禁用警告,但这样做是不好的(因为我仍然希望在由于拼写错误等原因导致属性不存在时收到警告)。\n有没有一种普遍且合法(不会引发Pylint警告)的方法来动态地向对象添加成员?\n或者:我可以仅针对一个对象而不是一行/块/文件禁用Pylint吗?\n解释:\n你可能会想为什么我应该在计划以硬编码方式访问这些属性的对象上动态添加成员属性。\n原因是:我有一个动态部分的程序(装饰发生的地方)和一个静态部分,后者专门针对某种特定情况。所以在很多情况下,我也可以为这种情况创建一个静态类,但那样做会过度复杂。\n下面的专门代码可能允许访问连接到某个总线的设备的某个参数:\n

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       <--- 将调用set回调函数
x = dev.some.subtree.element       <--- 将调用get回调函数

\n因此,\'some/attached/device\'后面的结构可能是任意的且非常复杂,我不想在类结构中重新复制它。\n摆脱这个警告的一种方法是创建/访问一个基于dict的树:\n

dev['some']['subtree']['element'] = 5

\n但这样写起来更麻烦,阅读起来也不美观 - 我只会为了安抚Pylint而这样做。

0
0 Comments

PyLint错误E1101:'Instance of .. has no .. member' for class with dynamic attributes的出现原因是在两种情况下会出现这种错误:

  • 当访问一个不存在的成员时,会出现这种错误。
  • 误报:这个错误可能会报告在访问时动态创建的对象成员,但是它们在被访问的时候已经存在了。

由于这个错误被标识为E1101错误。你可以通过在你的代码中添加以下行来解决这个问题。

# pylint: disable=E1101

原文链接:https://stackoverflow.com/a/54156144/131160

0
0 Comments

避免Pylint警告E1101: 'Instance of .. has no .. member' for class with dynamic attributes的问题出现是因为Pylint在检查代码时无法识别动态属性。为了解决这个问题,可以在项目的.pylintrc文件中为有问题的类添加一个规则。具体方法是在[TYPECHECK]部分添加ignored-classes选项,并将有问题的类名以逗号分隔的形式添加进去。例如:

[TYPECHECK]

ignored-classes=Fysom,MyClass

需要注意的是,如果不将`str`添加进去,这个方法将无效。虽然这种方法更像是一个hack而不是真正的解决方案,因为它只是忽略了问题而没有解决它,但是它似乎有效。

0
0 Comments

避免Pylint警告E1101: 'Instance of .. has no .. member' for class with dynamic attributes的问题是因为访问了一个不存在的成员。但这个警告可能会误报一些动态创建的对象成员,尽管这些成员在访问时已经存在。

为了解决这个问题,可以在文件顶部的单行上禁用该警告,使用# pylint: disable=no-member。根据这个Reddit帖子,也可以使用# pylint: disable=E1101

这是一个简洁而全面的解决方法,应该被接受的答案。然而,这并不是一个理想的解决方法,因为你会禁用文件中的所有代码的检查。这个检查非常有价值,可以捕获很多真正的问题。而且你需要在使用该类的每个文件中都进行禁用。理想的解决方法是让Pylint只忽略那个类的这个错误。

你可以将禁用指令添加到错误所在行的末尾,这样只有该行的错误被禁用。这样你就不需要为代码的其余部分禁用它。

0