Perché pylint si oppone ai nomi di variabili a carattere singolo?


96

Mi sto ancora abituando alle convenzioni di Python e lo uso pylintper rendere il mio codice più pitonico, ma sono perplesso dal fatto che a pylint non piacciano i nomi delle variabili a carattere singolo. Ho alcuni loop come questo:

for x in x_values:
   my_list.append(x)

e quando eseguo pylint, ottengo Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- questo suggerisce che un nome di variabile valido deve essere lungo tra 3 e 31 caratteri, ma ho esaminato le convenzioni di denominazione PEP8 e non vedo nulla di esplicito riguardo alle singole lettere minuscole e vedo molti esempi che li usano.

C'è qualcosa che mi manca in PEP8 o è uno standard unico per pylint?

Risposte:


47

PyLint controlla non solo le raccomandazioni PEP8. Ha anche le sue raccomandazioni, una delle quali è che il nome di una variabile dovrebbe essere descrittivo e non troppo breve.

Puoi usarlo per evitare nomi così brevi:

my_list.extend(x_values)

Oppure modifica la configurazione di PyLint per dire a PyLint quale nome di variabile è buono.


10
Usare _per contenere valori temporanei è antipattern. Le variabili di sottolineatura indicano valori irrilevanti / scartati, non assegnazioni temporanee, come io x. Inoltre, nell'interprete ha un significato speciale contenere l'ultimo valore dell'ultima espressione.
James

121

Un po 'più di dettaglio su ciò che ha notato gurney alex: puoi dire a PyLint di fare eccezioni per i nomi di variabili che (giuri mignolo) sono perfettamente chiari anche se meno di tre caratteri. Trova o aggiungi al tuo file pylintrc , sotto l' [FORMAT]intestazione:

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

Qui pk (per la chiave primaria), x e y sono nomi di variabili che ho aggiunto.


7
Questa è la migliore risposta.
giorgiosironi

1
Non sembra funzionare pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James


2
Quello che mi piacerebbe davvero è che i pylint accettino (su richiesta) i vars brevi quando vengono utilizzati nelle comprensioni. Confronta return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] vs. Affermo return [a for a in thing.get_customer_addresses() if a.is_proper()] che quest'ultimo è più chiaro, poiché è ovvio dal contesto. In generale, la lunghezza variabile dovrebbe essere correlata all'ambito della variabile.
EdvardM

21

Nei linguaggi fortemente tipizzati, le variabili del nome di 1 lettera possono essere ok, perché generalmente ottieni il tipo accanto al nome nella dichiarazione della variabile o nel prototipo di funzione / metodo:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

In Python, non ottieni queste informazioni, quindi se scrivi:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

non lasci assolutamente alcun indizio al team di manutenzione su cosa potrebbe fare la funzione, come viene chiamata e cosa restituisce. Quindi in Python, tendi a usare nomi descrittivi:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

e aggiungi anche una docstring che spiega cosa fa il materiale e quali tipi sono previsti.


7
Invece di "linguaggi compilati", scriverei "digitato esplicitamente". Anche Haskell, ad esempio, è compilato, ma puoi scrivere dichiarazioni implicite come in Python.
Sebastian Mach

14
Anche se sono d'accordo con te in questi casi, forzare 3 o più caratteri in un nome di variabile non significa che sarà descrittivo. Attualmente sto usando, with open(FILE) as f: items = f.readlines()ad esempio, dove la variabile fè davvero ovvia, ma ricevo avvisi di pylint. Questo mi ha fatto passare a flake8.
Axel Örn Sigurðsson

3
puoi anche modificare le regole del pylint per consentire a 'f' un nome di variabile. Esistono già eccezioni per i, j AFAIR.
gurney alex

10
per le persone che hanno votato negativamente questa risposta: sono il ragazzo che ha introdotto la regola a Pylint, e il motivo è esattamente quello indicato. Potresti non essere d'accordo con questa decisione, ma questa è comunque la risposta alla domanda ...
gurney alex

1
Seguo totalmente il tuo ragionamento, tuttavia spesso negli algoritmi e nella programmazione matematica alcuni valori sono tipicamente denominati con una lettera. Penso che una funzione chiamata fsia totalmente diversa da una OptionListchiamata c. Soprattutto quando non posso rinominarlo functionperché ombreggia un built-in.
kap

19

Al giorno d'oggi c'è anche un'opzione per sovrascrivere regexp. Ad esempio, se vuoi consentire singoli caratteri come variabili:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

Quindi, pylintcorrisponderà a PEP8 e non porterà ulteriori violazioni in cima. Inoltre puoi aggiungerlo a .pylintrc.


3
Per la versione > 1.8.3questa sembra essere la risposta. Può mettere questo nel vostro .pylintrcanche per config permanente: variable-rgx=[a-z0-9_]{1,30}$.
James

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" potrebbe essere un po 'più appropriato, "9" non dovrebbe essere un nome di variabile valido.
Eric Le Fort,

16

La ragione più profonda è che si può ricordare quello che intendeva a, b, c, x, y, e zper dire quando hai scritto il codice, ma quando gli altri leggono, o anche quando si torna al codice, il codice diventa molto più leggibile quando si danno è un nome semantico. Non stiamo scrivendo roba una volta su una lavagna e poi cancellandola. Stiamo scrivendo codice che potrebbe rimanere in vigore per un decennio o più e che verrà letto molte, molte volte.

Usa nomi semantici. Nomi semantiche che ho usato sono stati come ratio, denominator, obj_generator, path, ecc Si può prendere un secondo in più o due per tipo fuori, ma il tempo si salva cercando di capire quello che hai scritto, anche a mezz'ora da allora è valsa la pena .


7
Grazie. Ecco il codice finale - gist.github.com/amandabee/8969833 - Vedo il tuo punto sul codice che io (o tu) possiamo leggere in un anno, ma in questo caso, penso che x e y siano veramente descrittivi.
Amanda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.