Как я могу заставить Pyflakes игнорировать утверждение? - PullRequest
128 голосов
/ 17 февраля 2011

Многие наши модули начинаются с:

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 игнорировать это?

(Обычно я бы прочитал документы , но ссылка не работает. Если никто не ответит, я просто прочитаю источник.)

Ответы [ 7 ]

204 голосов
/ 09 мая 2012

Если вы можете использовать flake8 вместо этого - который оборачивает псифлекс, а также проверку pep8 - строку, заканчивающуюся

# NOQA

(в которой пробелимеет важное значение - 2 пробела между концом кода и #, один между ним и текстом NOQA) сообщат контролеру, чтобы он игнорировал любые ошибки в этой строке.

44 голосов
/ 25 августа 2012

Я знаю, что это было задано некоторое время назад и уже получен ответ.

Но я хотел добавить то, что я обычно использую:

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
7 голосов
/ 15 марта 2011

Да, к сожалению, dimod.org не работает вместе со всеми вкусностями.

Глядя на код pyflakes, мне кажется, что pyflakes спроектирован так, что его будет легко использовать как «встроенную быструю проверку».

Для реализации функции игнорирования вам нужно написать свой собственный, который вызывает проверку pyflakes.

Здесь вы можете найти идею: http://djangosnippets.org/snippets/1762/

Обратите внимание, что приведенный выше фрагмент только для комментариев размещается на одной строке. Для игнорирования целого блока вы можете добавить 'pyflakes: ignore' в строку документации блока и выполнить фильтр на основе node.doc.

Удачи!


Я использую pocket-lint для всех видов статического анализа кода. Вот изменения, внесенные в карман-линт для игнорирования пайфлексов: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

6 голосов
/ 12 января 2013

Вот патч обезьяны для 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

5 голосов
/ 08 мая 2012

Цитировать из билета github :

Пока исправление еще не пришло, вот как его можно обойти, если вам интересно:

try:
    from unittest.runner import _WritelnDecorator
    _WritelnDecorator; # workaround for pyflakes issue #13
except ImportError:
    from unittest import _WritelnDecorator

Замените _unittest и _WritelnDecorator на нужные вам сущности (модули, функции, классы)

- deemoowoor

2 голосов
/ 08 мая 2012

Вы также можете импортировать с __import__. Это не pythonic, но pyflakes вас больше не предупреждает. См. документацию для __import__.

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
0 голосов
/ 21 октября 2016

Я создал небольшой сценарий оболочки с некоторой магией 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 ...

По сути, он записывает номера строк и динамически создает регулярное выражение.

...