2012-12-25 14 views
58

Używam pylint na jakimś kodzie i otrzymuję komunikat "Za mało publicznych metod (0/2)". Co oznacza ta wiadomość? pylint docs nie są pomocne:Co oznacza komunikat "Zbyt mało publicznych metod" pylinta?

Używane, gdy zajęcia mają zbyt mało publicznych metod, więc upewnij się, że naprawdę warto.

+1

Jak wygląda Twoja klasa? Czy klasa robi coś poza przechowywaniem danych? – Blender

+1

Cała klasa robi to przechowywanie danych. – monsur

+2

Cóż, jest twój problem. Klasy nie są przeznaczone do przechowywania danych. Do tego służą struktury danych, takie jak słowniki i listy. – Blender

Odpowiedz

77

Błąd w zasadzie mówi, że zajęcia nie mają zaledwie przechowywania danych, jak jesteś w zasadzie leczenia klasę postaci słownika. Klasy powinny mieć co najmniej kilka metod działania na danych, które posiadają.

Jeśli klasa wygląda następująco:

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

Rozważ używanie słownika lub namedtuple zamiast. Chociaż jeśli klasa wydaje się najlepszym wyborem, użyj jej. pylint nie zawsze wie, co jest najlepsze.

Należy pamiętać, że namedtuple jest niezmienny, a wartości przypisane podczas tworzenia instancji nie mogą być później modyfikowane.

+31

+1 dla "pylint nie wie, co jest najlepsze" - użyj własnego osądu, ale z reguły, jeśli potrzebujesz "struktury", użyj 'dict' lub' namedtuple'. Użyj klasy, aby dodać trochę logiki do obiektu (na przykład chcesz, aby coś się wydarzyło, gdy zostanie utworzone, potrzebujesz specjalnych rzeczy, które mają się wydarzyć, gdy zostanie dodany, chcesz wykonać niektóre operacje na nim, kontroluj jego wyświetlane, itp.) –

+0

Dzięki za szczegółowe odpowiedzi! Mój przypadek użycia jest podobny do tego, o czym wspomniał Burhan, robię pewne przetwarzanie danych po ich utworzeniu. – monsur

+5

Ten błąd nie ma sensu, jeśli masz Meta (metaclass) w twojej definicji klasy. – istinspring

23

Jeśli rozszerzenie klasy, a następnie moja propozycja jest systematycznie wyłączyć to ostrzeżenie i przejść dalej, na przykład, w przypadku zadań Seler:

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

    ...    

Nawet jeśli rozszerzenie tylko jedną funkcję, na pewno potrzebujesz klasy, aby ta technika działała, a jej rozszerzenie jest zdecydowanie lepsze niż hakowanie na zajęciach osób trzecich!

+0

Po tym diable, pre-commit daje mi teraz: Zła wartość opcji "too-few-public-method" (bad-option-value) – Mercury

+0

Czy uwzględniłeś "s" na metodach? Twoja wiadomość o złej opcji nie ma go. – sage

+0

Prawdopodobnie lepszym sposobem na wyłączenie tego jest ustawienie 'min-public-methods = 0' w sekcji" [BASIC] 'pliku konfiguracyjnego.Dzięki temu możesz umieścić go w oddzielnym wierszu od wszystkich plików 'disable =' (w "[MESSAGE CONTROL]"), co moim zdaniem ułatwia dodawanie szczegółowych komentarzy o tym, dlaczego włączałeś i wyłączałeś rzeczy wraz ze zmianą konfiguracji. –

Powiązane problemy