Avoid Pylint warning E1101: 'Instance of .. has no .. member' for class with dynamic attributes

帅比萌擦擦* 提交于 2019-11-26 09:09:25

问题


Imagine a function which dynamically adds attributes to an object using setattr. The reason for doing so is that I want to map some external structure (e.g. a given parameter tree) to an object:

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

Technically this works but of course Pylint rightly complains about \'device1\' being not a member of SomeClass.

I could disable the warning but that would be bad (because I still want to get the warning in all cases when the attribute does not exist because of misspelling, etc).

Is there a common and legal (Pylint-proof) way to dynamically add members to an object that not leads to warnings?

Alternatively: Can I disable Pylint for just one object rather than a line/block/file?

Explanation:

You might wonder why I should equip an object with member attributes dynamically when I plan to access these attributes in a hard-coded way later.

The reason is: I have a dynamic part of the program (where the decoration happens) and a static part which is specialized for a certain scenario. So I could also create a static class for this scenario but that would be overkill in a lot of situations.

The following specialized code might allow access to some parameter of a device which might be attached to some bus:

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

So the structure behind \'some/attached/device\' might be arbitrary and very complex and I don\'t want to reproduce it in a class structure.

One way to get rid of this warning would be to create/access a dict based tree:

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

But this is harder to write and not nice to read - I would only do this to quieten Pylint.


回答1:


Just to provide the answer that works for me now - as The Compiler suggested you can add a rule for the problematic class in your projects .pylintrc:

[TYPECHECK]
ignored-classes=Fysom,MyClass



回答2:


This page describes the error and gives an easy way to address it directly in the code. tl;dr

Used when an object (variable, function, …) is accessed for a non-existent member.

False positives: This message may report object members that are created dynamically, but exist at the time they are accessed.

A commentor mentions that it can be disabled on a single line at the top of the file with # pylint: disable=no-member. I also found that you can use # pylint: disable=E1101 based on this reddit entry.




回答3:


Try this! My problem solved!

Pylint doesn't understand the Django's dynamic filed. Thus, we need to teach what the Django is to Pylint

*for vscode in Windows 10 *

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

Install extension for Python, Django Snippets, Django Template in vscode

Open .vscode/settings.json in vscode and add:

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


来源:https://stackoverflow.com/questions/35990313/avoid-pylint-warning-e1101-instance-of-has-no-member-for-class-with-dyn

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!