Як змусити 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 для цього!
Кімвайс


2
Це давній клоп піфлякс. Людина, яка виправить це, отримає пиво, особисто підписане автором піфляків.
Філ Мороз

Відповіді:


215

Якщо ви можете використовувати flake8 замість цього - який обгортає піфлаки, а також перевірку pep8 - рядок, що закінчується

# NOQA

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


Якби тільки був спосіб отримати це з якогось репо для EL6 :) - Я думаю, мені доведеться сам це обернути в оборотах.
Кімвай

13
приємно, але не рішення для піфляків
ezdazuzena

7
Поради: додавання цього рядка # flake8: noqaдозволить flake8 ігнорувати перевірку для всього файлу.
Reorx

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

Це насправді те, що ми закінчили. (Ну, це і аналіз синтаксичного піфлакеса для ігнорування помилок на рядках з silence pyflakesкоментарем.) Дякую!
платний ботанік

Я думаю, що assertтвердження достатньо, щоб замовкнути шашку в цьому випадку. Гарний трюк, до речі.
Антон Строгонов

Це десь задокументовано?
Håken Lid

7

Так, на жаль, dimod.org не працює разом із усіма смакотами.

Дивлячись на код pyflakes, мені здається, що pyflakes розроблений так, що його буде легко використовувати як "вбудовану швидку перевірку".

Для реалізації функцій ігнорування вам потрібно буде написати свій власний, який викликає перевірку піфлаків.

Тут ви можете знайти ідею: http://djangosnippets.org/snippets/1762/

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

Удачі!


Я використовую кишенькову підкладку для будь-якого аналізу статичного коду. Ось зміни, внесені в кишеньковому ворсі для ігнорування піфляків: 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

Substitude _unittest та _WritelnDecorator з потрібними вам сутностями (модулями, функціями, класами)

- демовуар


і _WritelnDecorator;абсолютно нічого не робить, правда? Тож я можу скористатися цим, щоб отримати pyflakes для ігнорування невикористаних змінних, які фактично використовуються у рядках eval або numexpr , перерахувавши змінні в окремий рядок? Чи потрібна крапка з комою?
ендоліт

1
Насправді, використовуючи dis.dis, це, мабуть, робить a LOAD_FASTі POP_TOPдля кожної змінної в рядку самостійно (ставить її в стек і потім видаляє зі стека?), Тому нічого не робить. Краще, ніж assert, хоча.
ендоліт

Напівколону не потрібно. Твердження можна ігнорувати через перемикач оптимізації, тому не зовсім марний.
Gringo Suave

6

Ось патч мавп для піфляків, який додає # 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. Я рекомендую оновити цю відповідь, щоб відобразити це.
Джон Lunzer

1

Ви також можете імпортувати за допомогою __import__. Це не пітонічно, але піфлаки вже не попереджають вас. Дивіться документацію для__import__ .

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

40
Я шукаю спосіб змусити піфляки ігнорувати помилки, а не спосіб знецінити свій код :)
Kimvais

Крім того, це не рішення, коли робити щось на кшталтfrom foo import bar
ezdazuzena

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

В основному він відзначає номери рядків і динамічно створює з нього регулярний вираз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.