Warum widerspricht Pylint den Namen einzelner Zeichenvariablen?

96

Ich pylintgewöhne mich immer noch an Python-Konventionen und verwende es , um meinen Code pythonischer zu gestalten, aber ich bin verwirrt darüber, dass pylint keine Variablennamen für einzelne Zeichen mag. Ich habe ein paar Schleifen wie diese:

for x in x_values:
   my_list.append(x)

und wenn ich laufe pylint, bekomme ich Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- das deutet darauf hin, dass ein gültiger Variablenname zwischen 3 und 31 Zeichen lang sein muss, aber ich habe die PEP8-Namenskonventionen durchgesehen und sehe nichts Explizites in Bezug auf einzelne Kleinbuchstaben und ich sehe viele Beispiele, die sie verwenden.

Fehlt mir etwas in PEP8 oder ist dies ein Standard, der nur für Pylint gilt?

Amanda
quelle

Antworten:

47

PyLint überprüft nicht nur die PEP8-Empfehlungen. Es hat auch seine eigenen Empfehlungen, von denen eine ist, dass ein Variablenname beschreibend und nicht zu kurz sein sollte.

Sie können dies verwenden, um solche Kurznamen zu vermeiden:

my_list.extend(x_values)

Oder optimieren Sie die Konfiguration von PyLint, um PyLint mitzuteilen, welche Variablennamen gut sind.

warvariuc
quelle
10
Das _Halten temporärer Werte ist ein Antimuster. Unterstrichvariablen geben irrelevante / verworfene Werte an, keine temporäre Zuweisung wie ioder x. Darüber hinaus hat es im Interpreter eine besondere Bedeutung, den letzten Wert des letzten Ausdrucks zu halten.
James
121

Ein bisschen mehr Details zu dem, was gurney alex bemerkt hat: Sie können PyLint anweisen, Ausnahmen für Variablennamen zu machen, die (Sie schwören , kleiner Finger ) vollkommen klar sind, obwohl sie weniger als drei Zeichen enthalten. Suchen Sie in Ihrer pylintrc- Datei unter der [FORMAT]Überschrift:

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

Hier sind pk (für Primärschlüssel), x und y Variablennamen, die ich hinzugefügt habe.

mlncn
quelle
7
Dies ist die beste Antwort.
Giorgiosironi
1
Scheint nicht zu funktionieren pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James
2
Was ich wirklich möchte, ist, dass Pylint (auf Anfrage) kurze Vars akzeptiert, wenn sie für das Verständnis verwendet werden. Vergleiche return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] vs return [a for a in thing.get_customer_addresses() if a.is_proper()] Ich behaupte, letzteres ist klarer, wie aus dem Kontext ersichtlich ist. Im Allgemeinen sollte die variable Länge mit dem Umfang der Variablen korrelieren.
EdvardM
21

In stark typisierten Sprachen können 1-Buchstaben-Namensvariablen in Ordnung sein, da Sie den Typ in der Regel neben dem Namen in der Deklaration der Variablen oder im Funktions- / Methodenprototyp erhalten:

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

In Python erhalten Sie diese Informationen nicht. Wenn Sie also schreiben:

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

Sie lassen dem Wartungsteam absolut keine Ahnung, was die Funktion tun könnte, wie sie aufgerufen wird und was sie zurückgibt. In Python verwenden Sie daher häufig beschreibende Namen:

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

und Sie fügen sogar eine Dokumentzeichenfolge hinzu, die erklärt, was das Zeug tut und welche Typen erwartet werden.

Trage Alex
quelle
7
Anstelle von "kompilierten Sprachen" würde ich "explizit getippt" schreiben. Haskell, z. B., wird ebenfalls kompiliert, Sie können jedoch implizite Deklarationen wie in Python schreiben.
Sebastian Mach
14
Obwohl ich Ihnen in diesen Fällen zustimme, bedeutet das Erzwingen von 3 oder mehr Zeichen in einem Variablennamen nicht, dass es beschreibend ist. Ich verwende derzeit with open(FILE) as f: items = f.readlines()zum Beispiel, wo die Variable fwirklich offensichtlich ist, aber ich bekomme Pylint-Warnungen. Dies brachte mich dazu, zu flake8 zu wechseln.
Axel Örn Sigurðsson
3
Sie können auch die Pylint-Regeln ändern, um 'f' einen Variablennamen zu ermöglichen. Es gibt bereits Ausnahmen für i, j AFAIR.
Gurney Alex
10
Für die Leute, die diese Antwort abgelehnt haben: Ich bin der Typ, der die Regel in Pylint eingeführt hat, und der Grund ist genau der angegebene. Sie können mit dieser Entscheidung nicht einverstanden sein, aber dies ist dennoch die Antwort auf die Frage ...
Gurney Alex
1
Ich folge Ihrer Argumentation voll und ganz, jedoch werden in Algorithmen und mathematischer Programmierung einige Werte häufig mit einem Buchstaben benannt. Ich denke, eine aufgerufene Funktion fist völlig anders als eine OptionListaufgerufene c. Besonders wenn ich es nicht umbenennen kann, functionweil es einen eingebauten Schatten hat.
Kap
19

Heutzutage gibt es auch eine Option, um regulären Ausdruck zu überschreiben. Dh wenn Sie einzelne Zeichen als Variablen zulassen möchten:

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

So pylintwird PEP8 entsprechen und wird nicht bringen zusätzliche Verletzungen an der Spitze. Sie können es auch hinzufügen .pylintrc.

Jimilian
quelle
3
Für die Version > 1.8.3scheint dies die Antwort zu sein. Kann dies auch in deine .pylintrcpermanente Konfiguration einfügen : variable-rgx=[a-z0-9_]{1,30}$.
James
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" ist möglicherweise etwas geeigneter, "9" sollte kein gültiger Variablenname sein.
Eric Le Fort
16

Der tiefere Grund ist , dass Sie sich vielleicht erinnern , was Sie beabsichtigt a, b, c, x, y, undz zu meinen , wenn Sie Ihren Code geschrieben, aber wenn andere es lesen, oder sogar , wenn Sie zurückkommen , um Ihren Code, wird der Code viel besser lesbar , wenn Sie geben es ist ein semantischer Name. Wir schreiben keine Sachen einmal an eine Tafel und löschen sie dann. Wir schreiben Code, der möglicherweise ein Jahrzehnt oder länger anhält und viele, viele Male gelesen wird.

Verwenden Sie semantische Namen. Semantische Namen, die ich verwendet habe, waren wieratio , denominator, obj_generator, pathusw. Es kann eine zusätzliche oder zwei Sekunden dauern , sie zu geben, aber die Zeit sparen Sie versuchen, herauszufinden , was Sie geschrieben haben sogar eine halbe Stunde von da ist es wert .

Aaron Hall
quelle
7
Vielen Dank. Hier ist der endgültige Code - gist.github.com/amandabee/8969833 - Ich sehe Ihren Standpunkt zu Code, den ich (oder Sie) in einem Jahr lesen kann, aber in diesem Fall denke ich, dass x und y wirklich beschreibend sind.
Amanda