Как отключить предупреждение Pylint?
Я пытаюсь отключить предупреждение C0321 ("более одного оператора в одной строке" - я часто ставлю if
операторы с короткими однострочными результатами в одной строке), в Pylint 0.21.1 (если это имеет значение: astng 0.20.1, common 0.50.3, Python 2.6.6 (r266:84292, 15 сентября 2010 г., 16:22):56)).
Я пытался добавить disable=C0321
в файле конфигурации Pylint, но Pylint настаивает на том, чтобы сообщить об этом в любом случае. Вариации на этой линии (как disable=0321
или же disable=C321
) помечены как ошибки, поэтому Pylint правильно распознает эту опцию, просто игнорирует ее.
Это ошибка Pylint, или я делаю что-то не так? Есть ли способ обойти это? Я бы очень хотел избавиться от этого шума.
14 ответов
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]
,
Начиная с Pylint v. 0.25.3, вы можете использовать символические имена для отключения предупреждений вместо того, чтобы запоминать все эти кодовые номера. Например:
# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long
Этот стиль более поучителен, чем загадочные коды ошибок, а также более практичен, поскольку в новых версиях Pylint выводится только символическое имя, а не код ошибки.
Соответствие между символическими именами и кодами можно найти здесь.
Комментарий об отключении можно вставить в отдельной строке, применив отключение ко всему, что последует в том же блоке. Кроме того, он может быть вставлен в конце строки, для которой он предназначен.
Если пилинт выводит "Locally disabling
сообщения, вы можете избавиться от них, в том числе отключить locally-disabled
сначала как в примере выше.
У меня была эта проблема с использованием 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
учебный класс. При запуске пилинта с аргументом --disable-ids=...
(по крайней мере, без файла конфигурации), этот словарь изначально пуст, вызывая исключение KeyError в pylint (pylint.utils.MessagesHandlerMixIn.check_message_id()
, В Eclipse вы можете увидеть это сообщение об ошибке в консоли Pylint (окна - показать представление - консоль, выберите консоль Pylint в опциях консоли, кроме значка консоли).
Чтобы отключить предупреждение локально в блоке, добавьте
# pylint: disable=C0321
в этот блок.
Есть несколько способов отключить предупреждения и ошибки от Pylint. Какой из них использовать, имеет отношение к тому, как глобально или локально вы хотите применить отключение - важное дизайнерское решение.
Несколько подходов
- В одном или нескольких
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
Дальнейшее отключение от
pylint
командная строка, как описано Абу и Кэрнарвон. Это выглядит какpylint --disable=bad-builtin
, Повторение--disable
подавить дополнительные предметы.Далее отключает из отдельных строк кода Python, как описано Imolit. Это выглядит как
some statement # pylint: disable=broad-except
(дополнительный комментарий в конце строки исходного кода) и применяется только к текущей строке. Мой подход заключается в том, чтобы всегда помещать их в конце других строк кода, чтобы их не перепутать со стилем блоков, см. Ниже.Далее отключает определенные для больших блоков кода 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.
4.1 Можно ли локально отключить конкретное сообщение?
Да, эта функция была добавлена в Pylint 0.11. Это может быть сделано путем добавления
"#Pylint: disable=some-message,another-one" на желаемом уровне блока или в конце нужной строки кода.
Вы можете отключить сообщения либо по коду, либо по символическому имени. Посмотреть документы (или запустить pylint --list-msgs
в терминале) для получения полного списка сообщений Пилинта.
Документы также предоставляют хороший пример того, как использовать эту функцию.
Вы также можете использовать следующую команду:
pylint --disable=C0321 test.py
Моя версия Pylint 0.25.1.
Вам просто нужно добавить одну строку, чтобы отключить то, что вы хотите отключить. Например
#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order
Добавьте это в #1 в свой модуль
Если это кому-то поможет, если вы используете код Visual Studio, он ожидает, что файл будет в кодировке UTF8. Чтобы сгенерировать файл, я запустил pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
в PowerShell.
Извините за небольшое отклонение от первоначального вопроса об общих предпочтениях постера, которые лучше решить с помощью глобального файла конфигурации. Но, как и во многих популярных ответах, я предпочитаю видеть в своем коде то, что может вызывать предупреждения , и, в конечном итоге, также информировать участников .
Мой комментарий к ответу от @imolit должен быть кратким, вот некоторые подробности.
Для
multiple-statements
сообщение, вероятно, лучше отключить его на уровне блока или модуля, например
# pylint: disable=multiple-statements
Мой вариант использования сейчас
attribute-defined-outside-init
в unittest setup() я выбрал отключение сообщения в линейной области , используя код сообщения, чтобы избежать
line-too-long
проблема.
class ParserTest(unittest.TestCase):
def setUp(self):
self.parser = create_parser() # pylint: disable=W0201
Соответствие можно найти локально с помощью команды вида
$ pylint --list-msgs | grep 'outside-init'
:attribute-defined-outside-init (W0201): *Attribute %r defined outside __init__*
Конечно, вы аналогичным образом извлекаете символическое имя из кода.
Согласно pylint документации, проще всего использовать эту схему:
- Проверки, связанные с соглашением C
- Проверки, связанные с рефакторингом R
- W различные предупреждения
- E-ошибки, возможные ошибки в коде
- F фатален, если произошла ошибка, из-за которой pylint не смог выполнить дальнейшую обработку.
Итак, можно использовать:
pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Синтаксис Python допускает использование нескольких операторов в строке, разделенных точкой с запятой (;). Тем не менее, ограничение каждой строки одним оператором облегчает человеку следовать логике программы при ее чтении.
Итак, еще один способ решения этой проблемы - это понять, почему сообщение lint присутствует, а не помещать в строку более одного утверждения.
Да, вам может быть проще написать несколько операторов в строке, однако, pylint для любого другого читателя вашего кода, а не только для вас.
Мойpylint
продолжал игнорировать список в моем . Наконец, я понял, что выполняю:
pylint --disable=all --enable=F,E,W
который преобладал надdisable
список в моем.pylintrc
.
Правильная команда для отображения только Fatal, Errors, Warnings:
pylint --disable=C,R
Отредактируйте "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"
],
}