Как отключить предупреждение 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. Какой из них использовать, имеет отношение к тому, как глобально или локально вы хотите применить отключение - важное дизайнерское решение.

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

  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 командная строка, как описано Абу и Кэрнарвон. Это выглядит как 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.

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

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"
    ],
}
Другие вопросы по тегам