Ich führe pylint für einen Code aus und erhalte die Fehlermeldung "Zu wenige öffentliche Methoden (0/2)". Was bedeutet diese Nachricht? Die Pylint-Dokumente sind nicht hilfreich:
Wird verwendet, wenn die Klasse zu wenige öffentliche Methoden hat. Stellen Sie also sicher, dass es sich wirklich lohnt.
Antworten:
Der Fehler besagt im Grunde, dass Klassen nicht nur zum Speichern von Daten gedacht sind , da Sie die Klasse im Grunde genommen als Wörterbuch behandeln. Klassen sollten mindestens einige Methoden haben, um mit den Daten zu arbeiten, die sie enthalten.
Wenn Ihre Klasse so aussieht:
Verwenden Sie stattdessen ein Wörterbuch oder ein
namedtuple
. Wenn eine Klasse die beste Wahl zu sein scheint, verwenden Sie sie. Pylint weiß nicht immer, was am besten ist.Beachten Sie, dass dies
namedtuple
unveränderlich ist und die bei der Instanziierung zugewiesenen Werte später nicht mehr geändert werden können.quelle
dict
odernamedtuple
. Verwenden Sie eine Klasse, wenn Sie Ihrem Objekt eine Logik hinzufügen möchten (z. B. wenn beim Erstellen etwas passieren soll, wenn es hinzugefügt wird, müssen einige spezielle Dinge geschehen, wenn Sie einige Operationen daran ausführen und steuern möchten, wie es erstellt wird angezeigt, etc.)namedtuple
scheiße - zusätzlich zu der hässlichen Syntax können Sie sie nicht einfach dokumentieren oder Standardwerte bereitstellen.namedtuple
habe ich die Entscheidung bereut. Es ist inkonsistent, sowohl benannte als auch indizierte Zugriffsattribute zuzulassen.Wenn Sie eine Klasse erweitern, ist mein Vorschlag, diese Warnung systematisch zu deaktivieren und fortzufahren, z. B. bei Sellerie-Aufgaben:
Selbst wenn Sie nur eine einzelne Funktion erweitern, benötigen Sie definitiv eine Klasse, damit diese Technik funktioniert, und das Erweitern ist definitiv besser als das Hacken von Klassen von Drittanbietern!
quelle
min-public-methods=0
im[BASIC]
Abschnitt der Konfigurationsdatei. Auf diese Weise können Sie es in eine separate Zeile von all Ihren Dingendisable=
(in[MESSAGE CONTROL]
) einfügen, was meiner Meinung nach das Hinzufügen detaillierter Kommentare darüber, warum Sie Dinge zusammen mit der Konfigurationsänderung aktiviert und deaktiviert haben, erleichtert.Dies ist ein weiterer Fall von
pylint
Blindregeln."Klassen sollen keine Daten speichern" - dies ist eine falsche Aussage. Wörterbücher sind nicht für alles gut. Ein Datenelement einer Klasse ist etwas Sinnvolles, ein Wörterbuchelement ist etwas Optionales. Beweis: Sie können tun
dictionary.get('key', DEFAULT_VALUE)
, um ein zu verhindernKeyError
, aber es gibt keine einfache__getattr__
mit Standard.BEARBEITEN - empfohlene Methoden zur Verwendung von Strukturen
Ich muss meine Antwort aktualisieren. Im Moment - wenn Sie eine benötigen
struct
, haben Sie zwei großartige Möglichkeiten:a) Einfach benutzen
attrs
Dies ist eine Bibliothek dafür:
https://www.attrs.org/en/stable/
Was Sie zusätzlich erhalten: Schreiben von Konstruktoren, Standardwerten, Validierung,
__repr__
schreibgeschützten Objekten (zu ersetzennamedtuples
, auch in Python 2) und mehr.b) Verwenden Sie
dataclasses
(Py 3.7+)Nach dem Kommentar von hwjp empfehle ich außerdem
dataclasses
:https://docs.python.org/3/library/dataclasses.html
Dies ist fast so gut wie
attrs
und ist ein Standardbibliotheksmechanismus ("Batterien enthalten") ohne zusätzliche Abhängigkeiten, außer Python 3.7+.Rest der vorherigen Antwort
NamedTuple
ist nicht großartig - besonders vor Python 3typing.NamedTuple
: https://docs.python.org/3/library/typing.html#typing.NamedTuple - Sie sollten auf jeden Fall dasNamedTuple
Muster "Klasse abgeleitet von " überprüfen . Python 2 -namedtuples
erstellt aus String-Beschreibungen - ist hässlich, schlecht und "Programmieren in String-Literalen" dumm.Ich stimme den beiden aktuellen Antworten zu ("Überlegen Sie, etwas anderes zu verwenden, aber Pylint ist nicht immer richtig" - die akzeptierte und "Verwenden Sie einen Kommentar zur Unterdrückung von Pylint"), aber ich habe meinen eigenen Vorschlag.
Lassen Sie mich noch einmal darauf hinweisen: Einige Klassen dienen nur zum Speichern von Daten.
Jetzt die Option auch zu berücksichtigen - use
property
-ies.Oben haben Sie schreibgeschützte Eigenschaften, die für Value Object in Ordnung sind (z. B. wie bei Domain Driven Design), aber Sie können auch Setter bereitstellen. Auf diese Weise kann Ihre Klasse beispielsweise die Verantwortung für die Felder übernehmen, über die Sie verfügen Um eine Validierung usw. durchzuführen (wenn Sie Setter haben, können Sie diese im Konstruktor zuweisen, dh
self.foo = foo
anstatt direktself._foo = foo
, aber vorsichtig, die Setter können davon ausgehen, dass andere Felder bereits initialisiert sind, und dann benötigen Sie eine benutzerdefinierte Validierung im Konstruktor). .quelle
attrs
Bibliothek verwenden, die eigentlich die Blaupause für die Erstellung desdataclasses
Moduls war.namedtuples
haben eine seltsame Syntax für die Vererbung ... jede Klasse, die eine verwendet, muss wissen, dass es sich um ein benanntes Tupel handelt, und__new__
stattdessen verwenden__init__
.dataclasses
habe diese Einschränkung nichtEs ist schwer, wenn Ihr Chef das Prinzip der Einzelverantwortung erwartet, aber Pylint sagt nein. Fügen Sie Ihrer Klasse also eine zweite Methode hinzu, damit Ihre Klasse gegen das Prinzip der Einzelverantwortung verstößt. Wie weit Sie mit dem Prinzip der Einzelverantwortung gehen sollen, liegt im Auge des Betrachters.
Mein Fix,
Ich habe meiner Klasse eine zusätzliche Methode hinzugefügt, sodass sie jetzt zwei Dinge erledigt.
Ich frage mich nur, ob ich meine Klasse jetzt in zwei separate Dateien und möglicherweise auch in Module aufteilen muss.
Problem gelöst, aber nicht mit meinen Kollegen, die den ganzen Tag damit verbringen, über die Spezifikation zu streiten, anstatt damit weiterzumachen, als wäre es Leben und Tod.
quelle