Як вимкнути попередження Pylint?


267

Я намагаюся вимкнути попередження C0321 ("більше одного твердження в одному рядку" - я часто кладу ifзаяви в одному рядку з короткими однорядними результатами), у Pylint 0.21.1 (якщо це має значення: з 0.20. 1, загальний 0,50,3, Python 2.6.6 (r266: 84292, 15 вересня 2010, 16:22:56)).

Я намагався додати disable=C0321файл конфігурації Pylint, але Pylint наполягає на тому, щоб повідомити про це все одно. Варіації на цій лінії (наприклад , disable=0321чи disable=C321) позначені як помилки, так Pylint робить розпізнавати можливість належним чином, це просто ігнорує його.

Це помилка Pylint, чи я щось роблю не так? Чи є спосіб обходити це? Мені б дуже хотілося позбутися від цього шуму.


1
Тут є хороше рішення, якщо ви хочете відключити один рядок коду, не всі види помилок.
Le Droid

Відповіді:


168

pylint --generate-rcfile показує це так:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Так виглядає, що у вас ~/.pylintrcмає бути disable=лінія / секція всередині розділу [MESSAGES CONTROL].


1
Дякуємо, але це вже є, у розділі [КОНТРОЛЬ ПОВІДОМЛЕННЯ], як показано вище. Досі проігноровано.
Head Geek

6
@Head Geek: ну, це працює на мене. ~/.pylintrcз двома рядками, [MESSAGES CONTROL]і disable=C0321. Це заважає цьому повідомленню.
Кріс Морган

Незвичайно ... точно таку ж версію PyLint?
Head Geek

@Head Geek: 0,21,3, начебто 0,20,3 і звичайно 0,52,1 насправді (останнє, коли я його встановив, останнім часом ніж ваш)
Кріс Морган

1
@Chris Morgan: Ага. Можливо, помилка, яка вже була виправлена, тоді - я використовую версію з сховища Ubuntu. Дякую!
Head Geek

165

У мене була проблема з використанням Eclipse, і я вирішив її наступним чином:

у папці pylint (наприклад C:\Python26\Lib\site-packages\pylint), утримуйте shift, клацніть правою кнопкою миші та виберіть, щоб відкрити команду Windows у цій папці. Тип:

lint.py --generate-rcfile > standard.rc

Це створює standard.rcфайл конфігурації. Відкрийте його в блокноті та під ним [MESSAGES CONTROL], коментуйте disable=та додайте ідентифікатор повідомлення, яке ви хочете відключити, наприклад:

disable=W0511, C0321

Збережіть файл та в полі Аргументи введіть: Eclipse-> window-> preferences-> PyDev-> pylint

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Тепер це має працювати ...


Ви також можете додати коментар у верхній частині коду, який буде інтерпретований пілінтом:

# pylint: disable=C0321

посилання на всі коди повідомлень про пілінт


Додавання, наприклад, --disable-ids=C0321у поле аргументів не працює. Усі доступні повідомлення пілінгу зберігаються у словнику _messages, атрибут екземпляра pylint.utils.MessagesHandlerMixInкласу. Під час запуску pylint з аргументом --disable-ids=...(принаймні, без конфігураційного файлу) цей словник спочатку порожній, піднімаючи виняток KeyError в межах pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). У Eclipse ви можете побачити це повідомлення про помилку в консолі Pylint (windows - show view - Console). , виберіть консоль Pylint з параметрів консолі, крім значка консолі.)


2
Ні, це насправді не повинно. 1) Він посилається на Eclipse, що не має відношення до заданого питання 2) Рекомендує вимкнути його через застарілі коди повідомлень. Я рекомендував би свою відповідь для найпростішого вирішення проблеми або відповідь Кріса Джонсона для отримання більш детальної інформації.
imolit

153

Починаючи з Pylint v. 0.25.3, ви можете використовувати символьні імена для відключення попереджень, а не запам'ятовувати всі ці кодові номери . Наприклад:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Цей стиль є більш повчальним, ніж криптичні коди помилок, а також більш практичним, оскільки новіші версії Pylint виводять лише символічне ім'я, а не код помилки.

Відповідність між символічними іменами та кодами можна знайти тут .

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

Якщо пілінт виводить Locally disablingповідомлення " ", ви можете позбутися від них, включивши locally-disabled спочатку вимкнення, як у наведеному вище прикладі.


20
Але введення # pylint: disable=fooінліне робить мене занадто довгим, тому тепер мені потрібно додати , line-too-long! Язик у щоці; саме це мені було потрібно і вирішує моє питання. Дякую!
dwanderson

Список з фактичними рядками використовувати: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
Мазі

81

Щоб вимкнути локальне попередження в блоці, додайте

# pylint: disable=C0321

до цього блоку.


5
Це застаріла техніка і більше не рекомендується. Дивіться інші відповіді.
Акумен

1
Ви маєте на увазі, що замість кодового номера слід використовувати символічну назву, так?
thakis

5
Так. Відповідь на imolit охоплює саме це.
Acumenus

2
Як можна знайти символічну назву? Мій редактор виплюне [pylint] C0111: Missing method docstring, тому знайти номер коду легко, але знайти символічну назву означає, що я повинен його шукати.
Адам Паркін

@AdamParkin Я знайшов свої повідомлення тут: pylint-messages.wikidot.com/all-messages
Жан-Франсуа Т.

80

Існує кілька способів відключення попереджень та помилок від Pylint. Який з них стосується того, наскільки глобально чи локально ви хочете застосувати відключення - важливе дизайнерське рішення.

Кілька підходів

  1. В одному або декількох pylintrcфайлах.

Це включає більше ~/.pylintrcфайлу (у вашому каталозі $ HOME), як описав Кріс Морган. Pylint буде шукати rc-файли з пріоритетом, який більш "значить" файли:

  • pylintrcФайл в поточному робочому каталозі; або

  • Якщо поточний робочий каталог знаходиться в модулі Python (тобто він містить __init__.pyфайл), виконайте пошук ієрархії модулів Python, поки pylintrcфайл не буде знайдений; або

  • Файл, названий змінною середовища PYLINTRC; або

  • Якщо у вас є домашній каталог, який не є /root:

    • ~/.pylintrc; або

    • ~/.config/pylintrc; або

    • /etc/pylintrc

Зауважте, що більшість із цих файлів названі pylintrc- лише цей файл ~має провідну крапку.

До свого pylintrcфайлу додайте рядки, щоб відключити певні повідомлення про пілінг. Наприклад:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Далі відключається з pylintкомандного рядка, як описано Aboo та Cairnarvon. Це схоже pylint --disable=bad-builtin. Повторіть, --disableщоб придушити додаткові елементи.

  2. Далі відключається від окремих кодових рядків Python, як описано в Imolit. Вони виглядають як some statement # pylint: disable=broad-except(додатковий коментар до кінця початкового рядка) та стосуються лише поточного рядка . Мій підхід полягає у тому, щоб завжди ставити їх на кінці інших рядків коду, щоб вони не плуталися зі стилем блоку, див. Нижче.

  3. Далі відключається, визначений для великих блоків коду Python, аж до повних вихідних файлів.

    • Вони схожі на # pragma pylint: disable=bad-whitespace(зверніть увагу на pragmaключове слово).

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

    • Коли придушення має застосовуватися лише в межах коду, використовуйте # pragma pylint: enable=bad-whitespace(тепер enableне використовуючи disable), щоб припинити придушення.

Зауважте, що для відключення для одного рядка використовується # pylintсинтаксис, а для відключення для цього рядка далі використовується # pragma pylintсинтаксис. Їх легко сплутати, особливо при копіюванні та вставці.

Збираємо це все разом

Зазвичай я використовую суміш цих підходів.

  • Я використовую ~/.pylintrcдля абсолютно глобальних стандартів - їх дуже мало.

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

  • Я використовую прагми стилю блоку у верхній частині файлів з одним вихідним кодом. Мені подобається вимикати прагми (припиняти придушення повідомлень) у розпалі розвитку навіть для стандартів Pylint, з якими я не згоден (на кшталт "занадто мало публічних методів" - я завжди отримую це попередження про спеціальні класи винятків) - але корисно побачити більше / можливо, всі повідомлення Pylint під час розробки. Таким чином, ви можете знайти випадки, з якими потрібно вирішити однорядкові прагми (див. Нижче), або просто додати коментарі наступному розробнику, щоб пояснити, чому це попередження в порядку.

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

  • Я використовую стиль одиночного коментування для вирішення особливо сильних помилок. Наприклад, якщо є місце, де це насправді має сенс робити except Exception as exc, я ставлю # pylint: disable=broad-exceptцю лінію замість більш глобального підходу, тому що це дивний виняток і його потрібно назвати, в основному, як форму документації.


Як і все в Python, ви можете діяти на різних рівнях непрямості. Моя порада - подумати про те, що належить на якому рівні, щоб ви не закінчилися надто поблажливим підходом до Pylint.


1
Найкраща відповідь, схожа на stackoverflow.com/questions/16266452/…
Крістоф Руссі

1
Здебільшого я не можу виступати за використання глобального непустого ~/.pylintrc. IMHO, конфігурація зазвичай повинна бути прив’язана до проекту, і тому вона повинна бути десь у межах проекту. Тільки тоді його можна контролювати та обмінювати версії з проектом. Якщо цього не зробити, клону може не вистачити налаштувань, необхідних для виходу пілінта без друку повідомлень.
Acumenus

@ABB Я думаю, що це мудро
Кріс Джонсон

3
@ChrisJohnson Префікс pragma здається абсолютно непотрібним. Наприклад, у мене # pylint: disable=missing-docstringвгорі файл, і він стосується всієї залишки файлу. Перевірте та видаліть pragmaпрефікс зі своєї відповіді.
Акумен

Пилінт FAQ не пише про будь-яку прагму. ( pylint.pycqa.org/en/latest/… ): ви можете відключити або включити (глобально відключені) повідомлення на рівні модуля, додавши відповідний параметр у коментарі у верхній частині файлу: # pylint: ones = wildcard- імпорт, прихований метод # pylint: enable = занадто багато рядків
Ярослав Нікітенко

18

Ви також можете використовувати таку команду:

pylint --disable=C0321  test.py

Моя версія пілінта 0,25,1.


Це тепер застаріла техніка. Натомість рекомендується використовувати символічне ім'я попередження про відключення. Дивіться цю відповідь .
Акумен

Схоже, це не працює і з --py3kпрапором :(
DylanYoung

Цікаво, що він добре працює, якщо він надається у rcфайлі, і (що більше хвилює) він фактично створює правильний rcфайл із --generate-rcfile. Маю кодовий код із кількома гілками, які роблять те саме :(
DylanYoung

18

Це FAQ :

4.1 Чи можна локально відключити певне повідомлення?

Так, ця функція була додана в Pylint 0,11. Це можна зробити, додавши
# pylint: disable=some-message,another-oneна потрібний рівень блоку або в кінці потрібного рядка коду.

4.2 Чи існує спосіб відключення повідомлення лише для певного модуля?

Так, ви можете відключити або включити (глобально відключені) повідомлення на рівні модуля, додавши відповідну опцію в коментарі вгорі файлу:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Ви можете відключити повідомлення:

  • числовий ідентифікатор: E1101, і E1102т.д.
  • символічне послання: no-member, і undefined-variableт.д.
  • назва групи перевірок. Ви можете схопити їх pylint --list-groups.
  • категорія перевірок: C, R, Wі т.д.
  • всі чеки с all.

Повний список повідомлень ' див. У документах (або запустіть pylint --list-msgsу терміналі) pylint. Документи також надають хороший приклад використання цієї функції.


5

Вам просто потрібно додати один рядок, щоб вимкнути те, що ви хочете відключити. Напр

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Додайте це за №1 у своєму модулі


4

Якщо це допомагає комусь, якщо ви використовуєте код Visual Studio, він очікує, що файл буде в кодуванні UTF8. Щоб створити файл, я побіг pylint --generate-rcfile | out-file -encoding utf8 .pylintrcу PowerShell.


0

Згідно з документацією на пілінт , найпростіше використовувати цю діаграму :

  • Перевірки, пов'язані з конвенцією
  • R рефакторинг пов'язаних перевірок
  • W різні попередження
  • E помилки для ймовірних помилок у коді
  • F фатально, якщо сталася помилка, яка заважала пілінту робити подальшу обробку.

Отже, можна використовувати:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC

-1

Синтаксис Python дозволяє допускати більше одного оператора на рядку, розділеного крапкою з комою (;). Однак обмеження кожного рядка одним висловлюванням полегшує людину дотримуватися логіки програми під час її читання.

Отже, ще один спосіб вирішення цього питання - це зрозуміти, чому повідомлення про пані є там, а не розміщувати більше одного твердження на рядку.

Так, вам може бути простіше писати кілька заяв на рядок, однак, pylint є для кожного іншого читача вашого коду, а не лише для вас.


-1

Ви можете спробувати це:

Відредагуйте "C: \ Користувачі \ Ваш Користувач \ AppData \ Роумінг \ Код \ Користувач \ налаштування.json" та додайте python.linting.pylintArgsрядки в кінці, як показано нижче:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.