wake-up-neo.net

Wie gehe ich mit Pylints Meldung "too many instance attributes" um?

Ich habe gerade versucht, Code mit Pylint zu fusseln, und der letzte verbleibende Fehler ist

R0902: too-many-instance-attributes (8/7)

Ich verstehe die Gründe für die Begrenzung der Anzahl der Instanzattribute, aber sieben scheint ein bisschen niedrig. Mir ist auch klar, dass der Linter nicht das letzte Wort haben sollte. Ich würde jedoch gerne wissen, was ich tun soll, anstatt:

def __init__(self, output_file=None, output_dir=None):
    """
    Set the frobnicator up, along with default geometries
    """

    self.margin = 30

    self.pos = [0, 0]
    self.sep = [5, 5]

    self.cell = [20, 20]

    self.frobbr = library.Frobbr()

    page = self.frobbr.get_settings('page')

    self.lim = [page.get_width() - self.margin,
                page.get_height() - self.margin]

    self.filename = output_file
    self.moddir = output_dir

Soll ich die Geometrien zu einem Diktat zusammenfassen, etwas anderes tun, um Pylint davon abzuhalten, sich zu beschweren, oder es einfach ignorieren (was ich eigentlich nicht tun möchte)?

45
Inductiveload

Die Aufgabe eines Linters ist es, Sie auf potenzielle Probleme mit Ihrem Code aufmerksam zu machen, und wie Sie in Ihrer Frage sagen, sollte es nicht das letzte Wort enthalten.

Wenn Sie überlegt haben, was Pylint zu sagen hat, und festgestellt haben, dass die Attribute, die Sie haben, für diese Klasse geeignet sind (was mir vernünftig erscheint), können Sie sowohl den Fehler unterdrücken als auch angeben, dass Sie das Problem berücksichtigt haben, indem Sie ein Deaktivierungselement hinzufügen Kommentar zu deiner Klasse:

class Frobnicator:

    """All frobnication, all the time."""

    # pylint: disable=too-many-instance-attributes
    # Eight is reasonable in this case.

    def __init__(self):
        self.one = 1
        self.two = 2
        self.three = 3
        self.four = 4
        self.five = 5
        self.six = 6
        self.seven = 7
        self.eight = 8

Auf diese Weise ignorieren Sie weder Pylint noch einen Sklaven dafür. Sie verwenden es als hilfreiches, aber fehlbares Werkzeug.

Standardmäßig erzeugt Pylint eine Informationsmeldung, wenn Sie eine Prüfung lokal deaktivieren:

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)

Sie können verhindern, dass dass auf zwei Arten angezeigt wird:

  1. Füge hinzu ein disable= flag beim laufen von pylint:

    $ pylint --disable=locally-disabled frob.py 
    
  2. Fügen Sie einer pylintrc Konfigurationsdatei eine Direktive hinzu:

    [MESSAGES CONTROL]
    disable = locally-disabled
    
57
Zero Piraeus

Dies ist ein ideologischer Einwand, aber ich persönlich neige dazu, diese Art von Änderungen so universell wie möglich zu gestalten. Wenn 7 nicht genug Instanzen in einer Datei sind und ich sie hier zulasse, warum nicht überall? Ich ändere nicht immer die Flusenregeln auf der ganzen Linie, aber ich denke zumindest darüber nach. Zu diesem Zweck können Sie in Ihrer .pylintrc-Datei change max-attributes=7 im Abschnitt DESIGN.

Da ich denke, dass 7 auf der ganzen Linie etwas niedrig ist, habe ich Folgendes geändert:

[DESIGN]
max-attributes=7

zu

max-attributes=12
17
Ian

Die Antwort von Zero Piraeus ist gut. Das heißt, da Sie Ihrer init -Methode wenig Kontext geben, nicht einmal einen echten Klassennamen, ist es schwierig, positiv zu sein, aber ich würde sagen, dass Dateiname und moddir nichts zu tun haben, abgesehen von Rand, Position, etc.

E/A-Vorgänge lassen sich häufig am besten in Funktionen und nicht in Methoden isolieren. Es gibt oft viele verschiedene Formate und Serialisierungsoptionen, und die meiste Zeit möchten Sie diese nicht mit Ihrer Objektlogik (Methoden) mischen. Es ist einfacher, eine neue IO - Funktion hinzuzufügen, die eine Datei, eine Zeichenfolge, einen Blob oder was auch immer verwendet und das darin codierte Objekt zurückgibt, als ein Objekt zu verwalten, das über viele Methoden verfügt, die viele verschiedene verarbeiten IO Operationen.

5
NChauvat