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

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

Ответ 1

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

# NOQA

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

Ответ 2

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

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

try:
    import json
    assert json  # silence pyflakes
except ImportError:
    from django.utils import simplejson as json  # Python 2.4 fallback.

Ответ 3

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

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

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

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

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

Удачи!


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

Ответ 4

Чтобы процитировать сообщение github issue:

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

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

Подпись _unittest и _WritelnDecorator с объектами (модулями, функциями, классами), которые вам нужны

- deemoowoor

Ответ 5

Вот патч обезьяны для pyflakes, который добавляет параметр комментария # bypass_pylakes.

#!/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

Ответ 6

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

try:
    import json
except ImportError:
    __import__('django.utils', globals(), locals(), ['json'], -1)

Ответ 7

Я создал небольшую оболочку script с некоторой магией awk, чтобы помочь мне. При этом все строки с import typing, from typing import или #$ (последний является специальным комментарием, который я использую здесь) исключаются ($1 - это имя файла Python script):

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

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