2012-12-25 12 views
58

Sto eseguendo pylint su qualche codice e ricevendo l'errore "Troppi pochi metodi pubblici (0/2)". Cosa significa questo messaggio? Il pylint docs non è utile:Che cosa significa "Troppi pochi metodi pubblici" di pylint significa

Utilizzato quando la classe ha troppo pochi metodi pubblici, quindi assicuratevi che ne valga davvero la pena.

+1

Che aspetto ha la tua classe? La classe fa qualcosa di diverso dai dati del negozio? – Blender

+1

Tutto ciò che la classe fa è memorizzare i dati. – monsur

+2

Beh, c'è il tuo problema. Le classi non sono pensate per memorizzare i dati. Ecco a cosa servono le strutture dati come dizionari e liste. – Blender

risposta

77

L'errore in pratica dice che le classi non sono destinate ad solo memorizzare i dati, come si sta trattando fondamentalmente la classe come un dizionario. Le classi dovrebbero avere almeno alcuni metodi per operare sui dati in loro possesso.

Se la classe si presenta così:

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

considerare l'utilizzo di un dizionario o un namedtuple invece. Anche se una classe sembra la scelta migliore, usala. pylint non sempre sa cosa è meglio.

Si noti che namedtuple è immutabile e che i valori assegnati all'istanziazione non possono essere modificati in seguito.

+31

+1 per "pilore non sa cosa è meglio" - usa il tuo giudizio, ma di regola, se ciò che ti serve è una "struct", usa un 'dict' o' namedtuple'. Usa una classe quando vuoi aggiungere qualche logica al tuo oggetto (per esempio, vuoi che succeda qualcosa quando viene creata, hai bisogno di cose speciali che succedano quando è aggiunta, vuoi o esegui alcune operazioni su di essa, controlla come visualizzato, ecc.) –

+0

Grazie per le risposte dettagliate! Il mio caso d'uso è simile a quello che ha menzionato Burhan, sto facendo un po 'di elaborazione sui dati quando è stato creato. – monsur

+5

Questo errore non ha senso se si ha Meta (metaclasse) all'interno della definizione della classe. – istinspring

23

Se si estende una classe, allora il mio suggerimento è quello di disabilitare in modo sistematico questo avvertimento e andare avanti, per esempio, nel caso di operazioni di sedano:

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

    ...    

Anche se si sta estendendo solo una singola funzione, hai sicuramente bisogno di una classe per far funzionare questa tecnica, e l'estensione è decisamente migliore dell'hacking nelle classi di terze parti!

+0

Avendo questo diable, pre-commit ora mi dà: Valore opzione non valido 'too-few-public-method' (valore-opzione-non valido) – Mercury

+0

Hai inserito i metodi 's'? Il tuo messaggio di valore non valido non ce l'ha. – sage

+0

Probabilmente un modo migliore per disabilitare questo è impostare 'min-public-methods = 0' nella sezione' [BASIC] 'del file di configurazione.Questo ti permette di metterlo su una linea separata da tutto il tuo 'disable =' stuff (in '[MESSAGE CONTROL]') che trovo facilita l'aggiunta di commenti dettagliati sul motivo per cui hai abilitato e disabilitato le cose insieme al cambio di configurazione. –