Dlaczego pylint obiektuje nazwy zmiennych składających się z jednego znaku?

100

Wciąż przyzwyczajam się do konwencji Pythona i używam, pylintaby uczynić mój kod bardziej pythonowym, ale zdziwi mnie fakt, że pylint nie lubi nazw zmiennych składających się z jednego znaku. Mam kilka takich pętli:

for x in x_values:
   my_list.append(x)

a kiedy uruchamiam pylint, otrzymuję Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- to sugeruje, że prawidłowa nazwa zmiennej musi mieć od 3 do 31 znaków, ale przejrzałem konwencje nazewnictwa PEP8 i nie widzę nic wyraźnego w odniesieniu do pojedynczych małych liter i widzę wiele przykładów, które ich używają.

Czy jest coś, czego brakuje mi w PEP8, czy jest to standard, który jest unikalny dla pylinta?

Amanda
źródło

Odpowiedzi:

48

PyLint sprawdza nie tylko zalecenia PEP8. Ma też swoje własne zalecenia, z których jednym jest to, że nazwa zmiennej powinna być opisowa i niezbyt krótka.

Możesz tego użyć, aby uniknąć takich krótkich nazw:

my_list.extend(x_values)

Lub dostosuj konfigurację PyLint, aby poinformować PyLint, jaka nazwa zmiennej jest dobra.

warvariuc
źródło
10
Używanie _do przechowywania wartości tymczasowych jest anty-wzór. Zmienne z podkreśleniem oznaczają nieistotne / odrzucone wartości, a nie tymczasowe przypisanie, takie jak ilub x. Ponadto w tłumaczu szczególne znaczenie ma przechowywanie ostatniej wartości ostatniego wyrażenia.
James
129

Trochę więcej szczegółów na temat tego, co zauważył gurney Alex: możesz powiedzieć PyLintowi, aby robił wyjątki dla nazw zmiennych, które (przysięgasz, mały ) są całkowicie jasne, nawet jeśli mniej niż trzy znaki. Znajdź lub dodaj do pliku pylintrc pod [FORMAT]nagłówkiem:

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

Tutaj pk (dla klucza podstawowego), x i y to nazwy zmiennych, które dodałem.

mlncn
źródło
7
To najlepsza odpowiedź.
giorgiosironi
1
Wydaje się, że nie działa pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James
2
Naprawdę chciałbym, aby pylint akceptował (na życzenie) krótkie zmienne, gdy są używane w zrozumieniach. Porównaj 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()] ja twierdzę, że to drugie jest bardziej jasne, ponieważ wynika to z kontekstu. Ogólnie zmienna długość powinna być skorelowana z zakresem zmiennej.
Edvard M.
22

W językach silnie wpisanych 1-literowe zmienne nazw mogą być w porządku, ponieważ zazwyczaj otrzymujesz typ obok nazwy w deklaracji zmiennej lub w prototypie funkcji / metody:

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

W Pythonie nie otrzymujesz tych informacji, więc jeśli napiszesz:

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

nie pozostawiasz absolutnie żadnej wskazówki zespołowi utrzymania ruchu, co ta funkcja może robić, jak się ją nazywa i co zwraca. Dlatego w Pythonie masz tendencję do używania nazw opisowych:

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

a nawet dodajesz dokumentację wyjaśniającą, co robi ten materiał i jakich typów się oczekuje.

gurney alex
źródło
7
Zamiast „języków kompilowanych” napisałbym „jawnie wpisane”. Na przykład Haskell też jest skompilowany, ale możesz pisać niejawne deklaracje, jak w Pythonie.
Sebastian Mach
14
Chociaż zgadzam się z tobą w tych przypadkach, wymuszenie 3 lub więcej znaków w nazwie zmiennej nie oznacza, że ​​będzie ona opisowa. Obecnie używam with open(FILE) as f: items = f.readlines()na przykład miejsca, w którym zmienna fjest naprawdę oczywista, ale otrzymuję ostrzeżenia o pylintach. To sprawiło, że zmieniłem się na flake8.
Axel Örn Sigurðsson
3
możesz także zmienić reguły pylint, aby zezwolić „f” na nazwę zmiennej. Istnieją już wyjątki dla i, j AFAIR.
gurney alex
10
dla ludzi, którzy odrzucili tę odpowiedź: jestem facetem, który wprowadził regułę w Pylincie, a powód jest dokładnie ten podany. Możesz nie zgodzić się z tą decyzją, ale to jest jednak odpowiedź na pytanie ...
gurney alex
1
Całkowicie podążam za twoim rozumowaniem, jednak często w algorytmach i programowaniu matematycznym niektóre wartości są zwykle nazywane jedną literą. Myślę, że wywołana funkcja fjest zupełnie inna niż OptionListwywołana c. Zwłaszcza, gdy nie mogę zmienić nazwy na, functionponieważ zasłania ona wbudowaną.
kap
19

Obecnie istnieje również możliwość zastąpienia wyrażenia regularnego. To znaczy, jeśli chcesz zezwolić na pojedyncze znaki jako zmienne:

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

Tak więc pylintbędzie pasować do PEP8 i nie spowoduje dodatkowych naruszeń. Możesz również dodać go do .pylintrc.

Jimilian
źródło
3
W przypadku wersji > 1.8.3to wydaje się być odpowiedzią. Można umieścić to w swoim .pylintrc, jak również do stałego config: variable-rgx=[a-z0-9_]{1,30}$.
James
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" może być trochę bardziej odpowiednie, "9" nie powinno być prawidłową nazwą zmiennej.
Eric Le Fort
16

Im głębiej Powodem jest to, że można sobie przypomnieć, co zamierzałeś a, b, c, x,y , i zdo myśli, kiedy pisał swój kod, ale gdy inni ją przeczytać, a nawet po powrocie do kodu, kod staje się bardziej czytelny, gdy dajesz to nazwa semantyczna. Nie piszemy rzeczy raz na tablicy, a potem nie usuwamy. Piszemy kod, który może pozostać przez dekadę lub dłużej i być czytany wiele, wiele razy.

Używaj nazw semantycznych. Semantyczne nazw Mam stosowane były podobne ratio, denominator, obj_generator, path, itd. To może podjąć dodatkową sekundę lub dwie, aby wpisać je na zewnątrz, ale Zaoszczędzony czas próbuje dowiedzieć się, co napisałeś nawet pół godziny od tej pory jest tego warte .

Aaron Hall
źródło
7
Dzięki. Oto ostateczny kod - gist.github.com/amandabee/8969833 - widzę twój punkt widzenia na temat kodu, który ja (lub ty) możemy przeczytać w ciągu roku, ale w tym przypadku myślę, że x i y są autentycznie opisowe.
Amanda,
OTOH, jeśli wyodrębniam element <dt /> z dokumentu XML, przechowywanie go w zmiennej „dt” wydaje się całkiem jasne, podczas gdy zapisywanie go jako „date” (co właśnie reprezentuje ten element) może być mylące, a wymyślenie czegoś takiego jak „the_dt_field” to po prostu głupia logorrhea. (Nie, nie mam kontroli nad nazwą elementu; to schemat kogoś innego). Musi być wiele takich wyjątków, które sprawdzają regułę.
Mark Wood