webentwicklung-frage-antwort-db.com.de

Warum funktioniert Pylint Objekt einzelne Zeichen Variablennamen?

Ich gewöhne mich immer noch an python Konventionen und verwende pylint, um meinen Code pythonischer zu gestalten, aber ich bin verwirrt darüber, dass pylint keine Variablen mit einzelnen Zeichen mag Ich habe ein paar Schleifen wie diese:

for x in x_values:
   my_list.append(x)

und wenn ich pylint starte, erhalte 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.

Gibt es etwas, das mir in PEP8 fehlt, oder handelt es sich um einen Standard, der nur für Pylint gilt?

85
Amanda

PyLint überprüft nicht nur PEP8-Empfehlungen. Es hat auch seine eigenen Empfehlungen, von denen eine lautet, 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 ändern Sie PyLints Konfiguration , um PyLint mitzuteilen, welche Variablennamen gut sind.

47
warvariuc

Ein bisschen mehr Details zu dem, was gurney alex notiert hat: Sie können PyLint anweisen, Ausnahmen für Variablennamen zu machen, die (Sie schwören auf den kleinen Finger) trotz weniger als drei Zeichen vollkommen klar sind. Suchen Sie in Ihrer pylintrc -Datei unter dem [FORMAT] Header:

# 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.

95
mlncn

In stark typisierten Sprachen können 1-Buchstaben-Namensvariablen in Ordnung sein, da Sie in der Regel den Typ 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. Daher verwenden Sie in Python in der Regel 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 Doku hinzu, die erklärt, was das Zeug macht und welche Typen erwartet werden.

18
gurney alex

Der tiefere Grund ist, dass Sie sich vielleicht erinnern, was Sie beabsichtigt haben a, b, c, x, y und z bedeutet, wenn Sie Ihren Code geschrieben haben, aber wenn andere ihn lesen oder wenn Sie zu Ihrem Code zurückkehren, wird der Code viel besser lesbar, wenn Sie ihm einen semantischen Namen geben. Wir schreiben nichts an eine Tafel und löschen es dann. Wir schreiben Code, der vielleicht ein Jahrzehnt oder länger Bestand hat, und der viele, viele Male gelesen wird.

Verwenden Sie semantische Namen. Semantische Namen, die ich verwendet habe, waren wie ratio, denominator, obj_generator, path usw. Es kann eine oder zwei Sekunden dauern, bis Sie sie eingegeben haben, aber die Zeit, die Sie sparen, um herauszufinden, was Sie in einer halben Stunde geschrieben haben, ist es wert.

16
Aaron Hall

Heutzutage gibt es auch die Möglichkeit, reguläre Ausdrücke zu überschreiben. Das heißt Wenn Sie einzelne Zeichen als Variablen zulassen möchten:

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

Daher stimmt pylint mit PEP8 überein und bringt keine zusätzlichen Verstöße mit sich. Sie können es auch zu .pylintrc Hinzufügen.

14
Jimilian