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?

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.


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.


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.


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.


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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.