Как отключить предупреждение Pylint? - PullRequest
214 голосов
/ 03 декабря 2010

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

Ответы [ 10 ]

142 голосов
/ 16 июля 2011

У меня была эта проблема с использованием 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 (окна - показать представление - консоль, выберите консоль Pylint из параметров консоли, кроме значка консоли).

136 голосов
/ 03 декабря 2010

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

128 голосов
/ 08 мая 2014

Начиная с версии Pylint v. 0.25.3, вы можете использовать символические имена для отключения предупреждений вместо того, чтобы запоминать все эти кодовые номера . E.g.:

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

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

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

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

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

71 голосов
/ 26 декабря 2013

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

# pylint: disable=C0321

к этому блоку.

67 голосов
/ 19 сентября 2015

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

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

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

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

  • A 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.

12 голосов
/ 18 июня 2013

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

pylint --disable=C0321  test.py

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

8 голосов
/ 01 июля 2016

Это FAQ :

4.1 Можно ли локально отключить конкретное сообщение?

Да, эта функция была добавлена ​​в Pylint 0.11,Это можно сделать, добавив
«#pylint: disable = some-message, another-one» на желаемом уровне блока или в конце нужной строки кода.

Вы можетеотключить сообщения либо по коду, либо по символическому имени.См. документы (или запустите pylint --list-msgs в терминале) для получения полного списка сообщений Pylint.
Документы также предоставляют хороший пример о том, как использовать эту функцию.

2 голосов
/ 22 июня 2019

Вам просто нужно добавить одну строку, чтобы отключить то, что вы хотите отключить.Например,

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

Добавьте это на # 1 в вашем модуле

2 голосов
/ 19 июля 2017

Если это кому-то поможет, если вы используете код Visual Studio, он ожидает, что файл будет в кодировке UTF8. Для создания файла я запустил pylint --generate-rcfile | out-file -encoding utf8 .pylintrc в PowerShell.

0 голосов
/ 13 февраля 2018

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

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

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

...