Как отключить предупреждение Pylint?


267

Я пытаюсь отключить предупреждение C0321 («более одного оператора в одной строке» - я часто помещаю ifоператоры с короткими однострочными результатами в одну строку) в Pylint 0.21.1 (если это имеет значение: astng 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=строки / s внутри раздела [MESSAGES CONTROL].


1
Спасибо, но это уже так, в разделе [УПРАВЛЕНИЕ СООБЩЕНИЯМИ], как показано выше. Все еще игнорируется.
Глава Geek

6
@ Голова Geek: ну, это работает для меня. ~/.pylintrcс двумя строками [MESSAGES CONTROL]и disable=C0321. Это предотвращает это сообщение.
Крис Морган

Странно ... точно такая же версия PyLint?
Глава Geek

@Head Geek: 0.21.3, 0.20.3 и 0.52.1 на самом деле (последний раз, когда я его установил, более поздний, чем ваш)
Крис Морган,

1
@ Крис Морган: Ах. Вероятно, ошибка, которая уже была исправлена, - я использую версию из репозитория Ubuntu. Спасибо!
Глава 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-> settings-> PyDev-> pylint в поле аргументов введите:

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

Теперь это должно работать ...


Вы также можете добавить комментарий в верхней части своего кода, который будет интерпретироваться Pylint:

# pylint: disable=C0321

ссылка на все коды сообщений Pylint


Добавление, например, --disable-ids=C0321в поле аргументов не работает. Все доступные сообщения Pylint хранятся в словаре _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 выводится только символическое имя, а не код ошибки.

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

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

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


20
Но использование # pylint: disable=fooInlyne делает мою линию слишком длинной, поэтому теперь мне нужно добавить , line-too-long! Язык в щеку; это было то, что мне было нужно и решает мою проблему. Спасибо!
dwanderson

Список с фактическими строками использовать: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
Мази

81

Чтобы отключить предупреждение локально в блоке, добавьте

# pylint: disable=C0321

в этот блок.


5
Это устаревшая техника и больше не рекомендуется. Смотрите другие ответы.
Acumenus

1
Вы имеете в виду, что нужно использовать символическое имя вместо кодового номера, да?
Thakis

5
Да. Ответ на imolit охватывает именно это.
Acumenus

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

@AdamParkin Я нашел мои сообщения здесь: pylint-messages.wikidot.com/all-messages
Жан-Франсуа Т.

81

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

Несколько подходов

  1. В одном или нескольких pylintrcфайлах.

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

  • pylintrcФайл в текущем рабочем каталоге; или

  • Если текущий рабочий каталог находится в модуле Python (то есть содержит __init__.pyфайл), ищите иерархию модулей Python до тех пор, пока pylintrcфайл не будет найден; или

  • Файл с именем переменной среды PYLINTRC; или

  • Если у вас есть домашний каталог, которого нет /root:

    • ~/.pylintrc; или

    • ~/.config/pylintrc; или

    • /etc/pylintrc

Обратите внимание, что большинство этих файлов имеют имена pylintrc- только файл в ~имеет начальную точку.

В свой pylintrcфайл добавьте строки, чтобы отключить определенные сообщения Pylint. Например:

[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. ИМХО, конфигурация обычно должна быть привязана к проекту, и поэтому она должна быть где-то внутри проекта. Только тогда он может быть контролируемым по версии и предоставлен в распоряжение проекта. В противном случае клону может не хватить настроек, необходимых для выхода Pylint без печати сообщений.
Acumenus

@ABB Я думаю, что это мудро
Крис Джонсон

3
@ChrisJohnson Префикс pragma кажется совершенно ненужным. Например, у меня есть # pylint: disable=missing-docstringв верхней части моего файла, и это относится ко всей оставшейся части файла. Пожалуйста, проверьте и удалите pragmaпрефикс из вашего ответа.
Acumenus

Pylint FAQ не пишет ни о какой прагме. ( pylint.pycqa.org/en/latest/… ): вы можете отключить или включить (глобально отключить) сообщения на уровне модуля, добавив соответствующую опцию в комментарии в верхней части файла: # pylint: disable = wildcard- import, method-hidden # pylint: enable = too-many-lines
Ярослав Никитенко

19

Вы также можете использовать следующую команду:

pylint --disable=C0321  test.py

Моя версия Pylint 0.25.1.


Теперь это устаревшая техника. Вместо этого рекомендуется использовать символическое имя отключенного предупреждения. Смотрите этот ответ .
Acumenus

Похоже, это не работает с --py3kфлагом :(
DylanYoung

Интересно, что он работает нормально, если rcон содержится в файле, и (что более неприятно) он действительно генерирует правильный rcфайл с --generate-rcfile. Должен любить код с несколькими ветками, которые делают одно и то же :(
DylanYoung

18

Это часто задаваемые вопросы :

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


0

Согласно pylint документации, проще всего использовать эту схему :

  • С конвенции, связанные проверки
  • R рефакторинг связанных проверок
  • W различные предупреждения
  • E ошибки, для возможных ошибок в коде
  • F фатально, если произошла ошибка, которая помешала Pylint выполнить дальнейшую обработку.

Так что можно использовать:

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

-1

Синтаксис Python допускает использование нескольких операторов в строке, разделенных точкой с запятой (;). Тем не менее, ограничение каждой строки одним оператором облегчает человеку следовать логике программы при ее чтении.

Итак, еще один способ решения этой проблемы - это понять, почему там есть сообщение lint, а не помещать в строку более одного утверждения.

Да, вам может быть проще написать несколько операторов в строке, однако pylint для любого другого читателя вашего кода, а не только для вас.


-1

Вы можете попробовать это:

Отредактируйте «C: \ Users \ Your User \ AppData \ Roaming \ Code \ User \ settings.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.