it-swarm.com.de

Pylint-Warnung E1101 vermeiden: 'Instanz von .. hat kein .. Member' für Klassen mit dynamischen Attributen

Stellen Sie sich eine Funktion vor, die dynamisch mit setattr einem Objekt Attribute hinzufügt. Der Grund dafür ist, dass ich einem Objekt eine externe Struktur (z. B. einen bestimmten Parameterbaum) zuordnen möchte:

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

Technisch funktioniert das, aber natürlich klagt Pylint zu Recht, dass 'device1' kein Mitglied von SomeClass ist.

Ich könnte die Warnung deaktivieren, aber das wäre schlecht (weil ich immer noch in allen Fällen die Warnung erhalten möchte, wenn das Attribut aufgrund von Rechtschreibfehler usw. nicht vorhanden ist).

Gibt es eine übliche und rechtliche (Pylint-sichere) Möglichkeit, Mitglieder dynamisch zu einem Objekt hinzuzufügen, das nicht zu Warnungen führt?

Alternativ: Kann ich Pylint für nur ein object anstelle einer Zeile/Block/Datei deaktivieren?

Erklärung:

Sie fragen sich vielleicht, warum ich ein Objekt dynamisch mit Memberattributen ausstatten soll, wenn ich später auf diese Attribute hartcodiert zugreifen möchte.

Der Grund ist: Ich habe einen dynamischen Teil des Programms (wo die Dekoration stattfindet) und einen statischen Teil, der specialized für ein bestimmtes Szenario ist. Also habe ich könnte auch eine statische Klasse für dieses Szenario erstellen, aber das wäre in vielen Situationen ein Overkill. 

Der folgende specialized - Code ermöglicht möglicherweise den Zugriff auf Parameter eines Geräts, die an einen Bus angeschlossen sind:

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

Die Struktur hinter 'some/attached/device' ist also beliebig und sehr komplex und ich möchte sie nicht in einer Klassenstruktur reproduzieren.

Eine Möglichkeit, diese Warnung loszuwerden, besteht darin, einen auf dict basierenden Baum zu erstellen/darauf zuzugreifen:

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

Dies ist jedoch schwieriger zu schreiben und nicht schön zu lesen - ich würde das nur tun, um Pylint zu beruhigen.

29
frans

Um nur die Antwort zu geben, die jetzt für mich funktioniert - als Der Compiler vorgeschlagen, können Sie eine Regel für die problematische Klasse in Ihren Projekten hinzufügen .pylintrc:

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

Diese Seite beschreibt den Fehler und bietet eine einfache Möglichkeit, ihn direkt im Code zu beheben. tl; dr

Wird verwendet, wenn auf ein Objekt (Variable, Funktion,…) für ein nicht vorhandenes Member zugegriffen wird.

False positive: Diese Nachricht kann Objektelemente melden, die dynamisch erstellt werden, jedoch zum Zeitpunkt des Zugriffs vorhanden sind.

Ein Kommentar erwähnt, dass er mit # pylint: disable=no-member in einer Zeile am Anfang der Datei deaktiviert werden kann. Ich fand auch, dass Sie # pylint: disable=E1101 basierend auf diesem reddit-Eintrag verwenden können.

0
user2577

Versuche dies! Mein Problem ist gelöst!

Pylint versteht die Dynamik des Django nicht. Daher müssen wir Pylint beibringen, was der Django ist

* für vscode in Windows 10 *

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

Installieren Sie die Erweiterung für Python, Django Snippets, Django Template in vscode

Öffne .vscode/settings.json in vscode und füge hinzu:

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

Sie könnten eine Unterklasse verwenden:

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

Hinweis: Python3

0
Maresh