Как я могу заставить 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 на нужные вам сущности (модули, функции, классы)

- deemoowoor

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

А у вас есть другие уже приведенные варианты.

  1. Игнорировать все проверки в строке:
      my invalid code # NOQA
  1. Игнорировать все проверки в файле. Поместите в его первую строку:
      # 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 ...

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

Другие вопросы по тегам