Как я могу заставить Pyflakes игнорировать утверждение?

137

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

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

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

платный ботаник
источник
4
Я хотел бы увидеть патч для PyFlakes для этого!
Кимваис
Ссылка: github.com/kevinw/pyflakes/issues/13
Дейнит,
2
Это давняя ошибка Pyflakes. Человек, чтобы исправить это, получит пиво, лично подписанное автором pyflakes.
Фил Фрост

Ответы:

215

Если вы можете использовать взамен flake8 - который переносит pyflakes, а также средство проверки pep8 - строка заканчивается

# NOQA

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

yrstruly
источник
Если бы только был способ получить это из репозитория для EL6 :) - я думаю, мне придется самому обернуть это в обороты.
Кимваис
13
приятно, но не решение для
псифлексов
7
Советы: добавьте эту строку # flake8: noqa, чтобы flake8 проигнорировал проверку всего файла.
Reorx
3
# noqaигнорирует только некоторые предупреждения / ошибки, но не все - для решения этой проблемы обходной путь включает установку / использование пакета по адресу pypi.python.org/pypi/flake8-respect-noqa
Отметьте
8
Советы # noqa: F841означает игнорирование только F841ошибки в строке.
SangminKim
47

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

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

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.
mfussenegger
источник
Это на самом деле то, что мы в итоге сделали. (Ну, это и парсинг вывода pyflakes, чтобы игнорировать ошибки в строках с silence pyflakesкомментариями.) Спасибо!
платный ботаник
Я думаю, что assertзаявления достаточно, чтобы заставить замолчать контролера в этом случае. Хороший трюк, кстати.
Антон Строгонов
Это где-нибудь задокументировано?
Хокен Лид
7

Да, к сожалению, 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

Ади Ройбан
источник
1
divmod.org не работает, но полезности можно найти на панели запуска ( code.launchpad.net/divmod.org ).
Thebjorn
6

Чтобы процитировать билет GitHub :

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

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

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

- deemoowoor

Daenyth
источник
и _WritelnDecorator;абсолютно ничего не делает, верно? Поэтому я могу использовать это, чтобы заставить pyflakes игнорировать неиспользуемые переменные, которые фактически используются внутри строк eval или Numberxpr , перечисляя переменные в отдельной строке? Точка с запятой вообще необходима?
эндолит
1
На самом деле, используя dis.dis, это, по-видимому, делает a LOAD_FASTи POP_TOPдля каждой переменной в строке отдельно (помещает ее в стек, а затем удаляет ее из стека?), Так что это ничего не делает. assertХотя лучше, чем .
эндолит
Точка с запятой не нужна. Утверждения можно игнорировать с помощью переключателя оптимизации, поэтому они не являются абсолютно бесполезными.
Гринго Суаве
6

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

Чейз Сейберт
источник
Я не уверен, что изменилось или произошла ошибка в исходном коде, но моя версия pyflakes (0.9.2) требует, чтобы text_lineno = args[0] - 1ее изменили на text_lineno = args[0].lineno - 1. Я рекомендую обновить этот ответ, чтобы отразить это.
Джон Ланцер
1

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

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)
mrijken
источник
40
Я ищу способ заставить pyflakes игнорировать ошибки, а не способ унизить мой код :)
Kimvais
Кроме того, это не решение проблемы, когда делаешь что-то вродеfrom foo import bar
ездазузена
0

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

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

PHK
источник