Как я могу заставить Pyflakes игнорировать утверждение?
Многие наши модули начинаются с:
try:
import json
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
... и это единственное предупреждение Pyflakes во всем файле:
foo/bar.py:14: redefinition of unused 'json' from line 12
Как я могу заставить Pyflakes игнорировать это?
(Обычно я бы прочитал документы, но ссылка не работает. Если никто не ответит, я просто прочитаю источник.)
9 ответов
Если вы можете использовать взамен flake8 - который включает в себя pyflakes и проверку pep8 - строку, заканчивающуюся на
# NOQA
(в котором пробел является значительным - 2 пробела между концом кода и #
, один между ним и NOQA
text) скажет контролеру игнорировать любые ошибки в этой строке.
Я знаю, что это было допрошено некоторое время назад и уже получен ответ.
Но я хотел добавить то, что я обычно использую:
try:
import json
assert json # silence pyflakes
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
Да, к сожалению, dimod.org не работает вместе со всеми вкусностями.
Глядя на код pyflakes, мне кажется, что pyflakes спроектирован так, что его будет легко использовать как "встроенную быструю проверку".
Для реализации функции игнорирования вам нужно написать свою собственную, которая вызывает проверку pyflakes.
Здесь вы можете найти идею: http://djangosnippets.org/snippets/1762/
Обратите внимание, что приведенный выше фрагмент только для комментариев размещается на одной строке. Для игнорирования целого блока вы можете добавить 'pyflakes:ignore' в строку документации блока и фильтр на основе node.doc.
Удачи!
Я использую Pocket-Lint для всех видов статического анализа кода. Вот изменения, внесенные в pocket-lint для игнорирования pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882
Чтобы процитировать билет GitHub:
Пока исправление еще не пришло, вот как это можно обойти, если вам интересно:
try: from unittest.runner import _WritelnDecorator _WritelnDecorator; # workaround for pyflakes issue #13 except ImportError: from unittest import _WritelnDecorator
Замените _unittest и _WritelnDecorator на нужные вам сущности (модули, функции, классы)
Вот патч обезьяны для pyflakes, который добавляет # bypass_pyflakes
опция комментария.
bypass_pyflakes.py
#!/usr/bin/env python
from pyflakes.scripts import pyflakes
from pyflakes.checker import Checker
def report_with_bypass(self, messageClass, *args, **kwargs):
text_lineno = args[0] - 1
with open(self.filename, 'r') as code:
if code.readlines()[text_lineno].find('bypass_pyflakes') >= 0:
return
self.messages.append(messageClass(self.filename, *args, **kwargs))
# monkey patch checker to support bypass
Checker.report = report_with_bypass
pyflakes.main()
Если вы сохраните это как bypass_pyflakes.py
тогда вы можете вызвать его как python bypass_pyflakes.py myfile.py
,
http://chase-seibert.github.com/blog/2013/01/11/bypass_pyflakes.html
Flake предлагает несколько вариантов игнорирования нарушений .
Мой любимый — сделать его явным и игнорировать конкретное встроенное нарушение:
my invalid code # noqa: WS03
А у вас есть другие уже приведенные варианты.
- Игнорировать все проверки в строке:
my invalid code # NOQA
- Игнорировать все проверки в файле. Поместите в его первую строку:
# flake8: noqa: E121, E131, E241, F403, F405
Или настройте игнорирование этого параметра в вашей конфигурации flake8.
Вы также можете импортировать с __import__
, Это не pythonic, но pyflakes больше не предупреждает вас. Смотрите документацию для__import__
,
try:
import json
except ImportError:
__import__('django.utils', globals(), locals(), ['json'], -1)
За
flake8
, который является рекомендуемой альтернативой (сравните flake8 и pyflakes здесь )
Добавьте первую строку, например:
# flake8: noqa: E121, E131, E241, F403, F405
в целом:
# flake8: noqa: <code>[, <code> ...]
Таким образом в одной строке вы можете замолчать
entire file
и сделай это для
many
игнорировать заявления
at once
, что часто бывает.
Я создал небольшой скрипт с некоторыми awk
магия, чтобы помочь мне. С этим все линии с import typing
, from typing import
или же #$
(последний специальный комментарий, который я использую здесь) исключены ($1
имя файла скрипта Python):
result=$(pyflakes -- "$1" 2>&1)
# check whether there is any output
if [ "$result" ]; then
# lines to exclude
excl=$(awk 'BEGIN { ORS="" } /(#\$)|(import +typing)|(from +typing +import )/ { print sep NR; sep="|" }' "$1")
# exclude lines if there are any (otherwise we get invalid regex)
[ "$excl" ] &&
result=$(awk "! /^[^:]+:(${excl}):/" <<< "$result")
fi
# now echo "$result" or such ...
В основном он записывает номера строк и динамически создает регулярные выражения.