2012-12-25 6 views
58

Ich leite pylint auf etwas Code, und erhalten den Fehler "Zu wenige öffentliche Methoden (0/2)". Was bedeutet diese Nachricht? Die sind nicht hilfreich:Was bedeutet pylints "Zu wenige öffentliche Methoden" Nachricht

Verwendet, wenn Klasse zu wenige öffentliche Methoden hat, so stellen Sie sicher, es ist es wirklich wert.

+1

Wie sieht Ihre Klasse aus? Führt die Klasse etwas anderes als Daten speichern? – Blender

+1

Die ganze Klasse speichert Daten. – monsur

+2

Nun, da ist dein Problem. Klassen sind nicht zum Speichern von Daten gedacht. Dafür gibt es Datenstrukturen wie Wörterbücher und Listen. – Blender

Antwort

77

Der Fehler im Grunde sagt, dass Klassen nicht zu nur speichern Daten gemeint, wie Sie im Grunde die Klasse als ein Wörterbuch zu behandeln. Klassen sollten mindestens einige Methoden haben, um mit den Daten, die sie enthalten, zu arbeiten.

Wenn Ihre Klasse sieht wie folgt aus:

class MyClass(object): 
    def __init__(self, foo, bar): 
     self.foo = foo 
     self.bar = bar 

Betrachten wir ein Wörterbuch oder ein namedtuple stattdessen verwenden. Wenn eine Klasse die beste Wahl zu sein scheint, verwenden Sie sie. pylint weiß nicht immer, was am besten ist.

Beachten Sie, dass namedtuple unveränderlich ist und die bei Instanziierung zugewiesenen Werte später nicht geändert werden können.

+31

+1 für "pylint weiß nicht, was am besten ist" - verwenden Sie Ihr eigenes Urteil, aber in der Regel, wenn Sie eine "struct" benötigen, verwenden Sie ein "dict" oder "namedtuple". Verwenden Sie eine Klasse, wenn Sie Ihrem Objekt Logik hinzufügen möchten (beispielsweise möchten Sie, dass Dinge bei der Erstellung passieren, Sie müssen einige spezielle Dinge tun, wenn sie hinzugefügt werden, Sie möchten einige Operationen ausführen, steuern, wie diese ausgeführt werden angezeigt, etc.) –

+0

Danke für die detaillierten Antworten! Mein Anwendungsfall ist ähnlich dem, was Burhan erwähnt hat, ich mache eine Datenverarbeitung, wenn die Daten erstellt werden. – monsur

+5

Dieser Fehler macht keinen Sinn, wenn Sie innerhalb Ihrer Klassendefinition Meta (Metaklasse) haben. – istinspring

23

Wenn Sie eine Klasse erweitern, dann ist mein Vorschlag, diese Warnung systematisch deaktivieren und weiterziehen, zum Beispiel im Fall von Sellerie Aufgaben:

class MyTask(celery.Task): # pylint: disable=too-few-public-methods                     
    """base for My Celery tasks with common behaviors; extends celery.Task 

    ...    

Auch wenn Sie nur eine einzige Funktion erstreckt, Du brauchst definitiv eine Klasse, um diese Technik zu funktionieren, und das Erweitern ist definitiv besser als das Hacken von Drittklassen!

+0

Mit diesem Diable, Pre-Commit jetzt gibt mir: Bad Option Wert 'too-then-public-Methode' (bad-option-Wert) – Mercury

+0

Haben Sie das 's' auf Methoden? Ihre Nachricht mit dem Wert für eine ungültige Option enthält sie nicht. – sage

+0

Wahrscheinlich eine bessere Möglichkeit, dies zu deaktivieren, ist 'min-public-methods = 0' im Abschnitt' [BASIC] 'der Konfigurationsdatei zu setzen.Dies ermöglicht es Ihnen, es in eine separate Zeile von all Ihren 'disable =' stuff (in '[MESSAGE CONTROL]') zu setzen, was es einfacher macht, detaillierte Kommentare darüber hinzuzufügen, warum Sie Dinge zusammen mit der Konfigurationsänderung aktiviert und deaktiviert haben. –