Чому pylint об’єктує одноіменні імена змінних?


96

Я все ще звикаю до домовленостей python і використовую, pylintщоб зробити свій код більш пітонічним, але мене бентежить той факт, що pylint не любить імена змінних з одним символом. У мене є кілька таких петель:

for x in x_values:
   my_list.append(x)

і коли я запускаю pylint, я отримую Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- це говорить про те, що дійсне ім’я змінної має бути довжиною від 3 до 31 символів, але я переглянув правила іменування PEP8, і я не бачу нічого явного щодо окремих малих літер , і я бачу багато прикладів, які їх використовують.

Щось мені не вистачає у PEP8 чи це стандарт, який є унікальним для пілінта?

Відповіді:


47

PyLint перевіряє не тільки рекомендації PEP8. Він також має свої власні рекомендації, одна з яких полягає в тому, що ім'я змінної має бути описовим та не надто коротким.

Ви можете використовувати це, щоб уникнути таких коротких назв:

my_list.extend(x_values)

Або налаштуйте конфігурацію PyLint, щоб сказати PyLint, які імена змінних є добрими.


10
Використання _для утримання тимчасових значень є антипатерном. Змінні підкреслення вказують на нерелевантні / відкинуті значення, а не на тимчасове призначення, наприклад iабо x. Крім того, в інтерпретаторі має особливе значення утримувати останнє значення останнього виразу.
Джеймс

121

Трохи детальніше про те, що зауважив Герні Алекс: ви можете сказати PyLint робити винятки для імен змінних, які (ви, клянуся), абсолютно чіткі, хоча і менше трьох символів. Знайдіть у своєму файлі pylintrc або додайте його до [FORMAT]заголовка:

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

Тут pk (для первинного ключа), x та y - це імена змінних, які я додав.


7
Це найкраща відповідь.
giorgiosironi

1
Здається, не працює pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
Джеймс


2
Я б дуже хотів, щоб пілінт приймав (за запитом) короткі варіації, коли вони використовуються для розуміння. Порівняйте return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] проти return [a for a in thing.get_customer_addresses() if a.is_proper()] Я стверджую, що останнє є більш зрозумілим, оскільки це очевидно з контексту. Загалом, довжина змінної повинна корелювати із сферою дії змінної.
EdvardM

21

У сильно набраних мовах змінні імені з 1 літерою можуть бути нормальними, оскільки ти зазвичай отримуєш тип поруч із іменем у оголошенні змінної або в прототипі функції / методу:

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

У Python ви не отримуєте цієї інформації, тому, якщо ви пишете:

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

Ви не залишаєте абсолютно жодної підказки для команди технічного обслуговування щодо того, що функція може робити, і як вона називається, і що вона повертає. Отже, у Python ви, як правило, використовуєте описові імена:

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

і ви навіть додаєте документ, що пояснює, чим займаються матеріали та які типи очікуються.


7
Замість "компільованих мов" я б написав "явно набраний". Наприклад, Haskell також компілюється, але ви можете писати неявні декларації, як у Python.
Себастьян Мах

14
Хоча в цих випадках я погоджуюсь з вами, примусовування 3 або більше символів в назві змінної не означає, що вона буде описовою. В даний час я використовую, with open(FILE) as f: items = f.readlines()наприклад, де змінна fнасправді очевидна, але я отримую попередження pylint. Це змусило мене перейти на flake8.
Аксель Örn Sigurðsson

3
Ви також можете змінити правила пілінта, щоб дозволити 'f' ім'я змінної. Уже існують винятки для i, j AFAIR.
gurney alex

10
для людей, які підтримали цю відповідь: я хлопець, який запровадив правило в Pylint, і причина саме в тому, що подано. Ви можете не погодитися з цим рішенням, але це, тим не менше, відповідь на питання ...
Герні Алекс

1
Я повністю слідую вашим міркуванням, однак часто в алгоритмах та математичному програмуванні деякі значення зазвичай називаються однією літерою. Я думаю, що функція, що називається f, абсолютно відрізняється від OptionListвикликаної c. Особливо, коли я не можу перейменувати його на, functionоскільки це затінює вбудований.
кап

19

На сьогоднішній день існує також можливість замінити регулярний вираз. Тобто, якщо ви хочете дозволити окремі символи як змінні:

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

Отже, pylintбуде відповідати PEP8 і не призведе до додаткових порушень. Також ви можете додати його до .pylintrc.


3
Для версії > 1.8.3це, здається, відповідь. Може це в вашому , .pylintrcа також для постійної конфігурації: variable-rgx=[a-z0-9_]{1,30}$.
Джеймс

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" може бути трохи більш підходящим, "9" не повинно бути дійсним ім'ям змінної.
Ерік Ле Фор

16

Глибинна причина в тому , що ви , можливо , пам'ятаєте , що ви хотіли a, b, c, x, y, і zмати на увазі , коли ви писали код, але коли інші читають його, або навіть коли ви повернетеся в свій код, код стає набагато зручнішим для читання , коли ви даєте це семантична назва. Ми не пишемо речі один раз на дошці, а потім стираємо їх. Ми пишемо код, який може тривати десять років і більше, і його буде прочитано багато-багато разів.

Використовуйте семантичні назви. Семантичні імена , які я використовував, були , як ratio, denominator, obj_generator, pathі т.д. Це може зайняти додаткове друге або два типи їх, але час ви заощадити , намагаючись з'ясувати , що ви написали , навіть півгодини з тих пір так і стоїть .


7
Дякую. Ось остаточний код - gist.github.com/amandabee/8969833 - Я бачу вашу думку щодо коду, який я (або ви) можу прочитати за рік, але в цьому випадку я думаю, що x та y справді описові.
Аманда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.