web-dev-qa-db-fra.com

Eviter l'avertissement Pylint E1101: 'L'instance de .. n'a pas de membre' pour la classe avec attributs dynamiques

Imaginez une fonction qui dynamiquement ajoute des attributs à un objet en utilisant setattr. La raison en est que je veux mapper une structure externe (une arborescence de paramètres donnée, par exemple) sur un objet:

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

Techniquement, cela fonctionne mais bien sûr, Pylint se plaint à juste titre que 'device1' ne soit pas membre de SomeClass.

Je pourrais désactiver l'avertissement, mais ce serait mauvais (parce que je veux toujours l'avoir dans tous les cas où l'attribut n'existe pas à cause d'une faute d'orthographe, etc.).

Existe-t-il un moyen commun et légal (protégé contre Pylint) d’ajouter dynamiquement des membres à un objet qui ne génère pas d’avertissements?

Autre solution: Puis-je désactiver Pylint pour un seul objet plutôt que pour une ligne/un bloc/un fichier?

Explication:

Vous pourriez vous demander pourquoi je devrais équiper un objet avec des attributs de membre de manière dynamique lorsque je prévois d'accéder à ces attributs de manière codée en dur ultérieurement.

La raison en est: j'ai une partie dynamique du programme (où se trouve la décoration) et une partie statique qui est spécialisée pour un certain scénario. Donc, je pourrais créer également une classe statique pour ce scénario, mais ce serait excessif dans de nombreuses situations. 

Le code spécialisé suivant peut autoriser l'accès à certains paramètres d'un périphérique pouvant être attachés à un 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

Donc, la structure derrière 'some/attached/device' pourrait être arbitraire et très complexe et je ne veux pas la reproduire dans une structure de classe.

Une façon de se débarrasser de cet avertissement serait de créer/d'accéder à une arborescence basée sur dict:

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

Mais c’est plus difficile à écrire et ce n’est pas agréable à lire - je ne le ferais que pour calmer Pylint.

29
frans

Juste pour fournir la réponse qui fonctionne pour moi maintenant - en tant que Le compilateur vous a suggéré d'ajouter une règle pour la classe problématique dans vos projets .pylintrc:

[TYPECHECK]
ignored-classes=Fysom,MyClass
31
frans

Cette page décrit l’erreur et permet de l’adresser directement dans le code. tl; dr

Utilisé lorsqu'un objet (variable, fonction,…) est accédé pour un membre inexistant.

False positifs: ce message peut signaler des membres d'objet créés de manière dynamique, mais existant au moment de leur accès.

Un commentateur précise qu'il peut être désactivé sur une seule ligne en haut du fichier avec # pylint: disable=no-member. J'ai également constaté que vous pouvez utiliser # pylint: disable=E1101 en fonction de cette entrée reddit .

0
user2577

Essaye ça! Mon problème résolu!

Pylint ne comprend pas la dynamique de Django classée. Ainsi, nous devons enseigner ce que le Django est à Pylint

* pour vscode dans Windows 10 *

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

Extension d'installation pour Python, Django Extraits de code, Django Modèle dans vscode

Ouvrez .vscode/settings.json dans vscode et ajoutez:

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

Vous pouvez utiliser une sous-classe:

class MyClass(Someclass):
    def init(self):
       super().__init__()
       self.device1 = WhateverDevice1Is()

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

Note: Python3

0
Maresh