我如何让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
这是一个长期存在的pyflakes错误。修理它的人将得到由pyflakes作者亲自签名的啤酒。
菲尔·弗罗斯特

Answers:


215

如果您可以改用flake8-包裹pyflakes和pep8 checker-则以

# NOQA

(其中的空格非常大-代码末尾与之间的2个空格,在代码与文本#之间的一个空格NOQA)将告诉检查程序忽略该行上的任何错误。


如果只有一种方法可以从EL6的一些回购中获得此信息:)-我想我必须自己将其包装在rpm中。

13
不错,但不是pyflakes的解决方案
ezdazuzena

7
提示:添加此行将# flake8: noqa告诉flake8忽略整个文件的验证。
Reorx

3
# noqa仅忽略某些警告/错误,但不是全部-为了解决此问题,一种解决方法是在pypi.python.org/pypi/flake8-respect-noqa上
Mark

8
提示# noqa: F841意味着仅忽略F841该行的错误。
SangminKi​​m

47

我知道这是在不久前被质疑的,并且已经得到答复。

但是我想补充一下我通常使用的内容:

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

这实际上是我们最终要做的。(好吧,这分析pyflakes输出以忽略带有silence pyflakes注释的行中的错误。)谢谢!
2012年

我认为assert在这种情况下,声明足以使检查器静音。顺便说一句,好招。
Anton Strogonoff 2013年

这在任何地方都有记录吗?
哈肯·里德

7

是的,不幸的是dimod.org和所有好东西都一起倒了。

看一下pyflakes代码,在我看来pyflakes是经过设计的,因此可以很容易地将其用作“嵌入式快速检查器”。

为了实现忽略功能,您将需要编写自己的调用pyflakes检查器。

在这里您可以找到一个主意:http : //djangosnippets.org/snippets/1762/

请注意,以上代码段仅用于同一行中的注释位置。为了忽略整个块,您可能需要在块docstring中添加'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 2012年

6

引用github问题票证

尽管此修复程序仍在进行中,但是如果您想知道,可以通过以下方法解决:

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

用所需的实体(模块,函数,类)替换_unittest和_WritelnDecorator

- deemoowoor


并且_WritelnDecorator;绝对没有,对不对?因此,我可以通过在单独的行中列出变量,从而使pyflakes忽略在evalnumexpr字符串中实际使用的未使用变量?分号是否有必要?
endlith 2013年

1
实际上,使用dis.dis,这显然可以对一行上的每个变量单独执行a LOAD_FASTPOP_TOP(将其放入堆栈,然后将其从堆栈中删除?),因此它什么也不做。比更好assert
Endlith 2013年

不需要分号。可以通过优化开关忽略断言,因此并非完全没有用。
Gringo Suave

6

这是pyflakes的猴子补丁,添加了# bypass_pyflakes注释选项。

passive_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)

40
我正在寻找一种方法,使pyflakes忽略的错误,而不是一种方法来丑化我的代码:)
Kimvais

此外,在执行类似操作时,这不是解决方案from foo import bar
ezdazuzena 2014年

0

我创建了一个带有一些awk魔术的shell脚本来帮助我。有了这个的所有生产线import typingfrom 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 ...

基本上,它会记录行号并动态创建一个正则表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.