问题:我如何让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忽略这一点?
(通常我会去阅读文档,但是链接断开了。如果没有人回答,我只会阅读源代码。)
A lot of our modules start with:
try:
import json
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
…and it’s the only Pyflakes warning in the entire file:
foo/bar.py:14: redefinition of unused 'json' from line 12
How can I get Pyflakes to ignore this?
(Normally I’d go read the docs but the link is broken. If nobody has an answer, I’ll just read the source.)
回答 0
如果您可以改用flake8-包裹pyflakes和pep8 checker-则以
# NOQA
(其中的空格非常大-代码末尾与之间的2个空格,在代码与文本#
之间的一个空格NOQA
)将告诉检查程序忽略该行上的任何错误。
If you can use flake8 instead – which wraps pyflakes as well as the pep8 checker – a line ending with
# NOQA
(in which the space is significant – 2 spaces between the end of the code and the #
, one between it and the NOQA
text) will tell the checker to ignore any errors on that line.
回答 1
我知道这是在不久前被质疑的,并且已经得到答复。
但是我想补充一下我通常使用的内容:
try:
import json
assert json # silence pyflakes
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
I know this was questioned some time ago and is already answered.
But I wanted to add what I usually use:
try:
import json
assert json # silence pyflakes
except ImportError:
from django.utils import simplejson as json # Python 2.4 fallback.
回答 2
是的,不幸的是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
Yep, unfortunately dimod.org is down together with all goodies.
Looking at the pyflakes code, it seems to me that pyflakes is designed so that it will be easy to use it as an “embedded fast checker”.
For implementing ignore functionality you will need to write your own that calls the pyflakes checker.
Here you can find an idea: http://djangosnippets.org/snippets/1762/
Note that the above snippet only for for comments places on the same line.
For ignoring a whole block you might want to add ‘pyflakes:ignore’ in the block docstring and filter based on node.doc.
Good luck!
I am using pocket-lint for all kind of static code analysis. Here are the changes made in pocket-lint for ignoring pyflakes: https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882
回答 3
引用github问题票证:
尽管此修复程序仍在进行中,但是如果您想知道,可以通过以下方法解决:
try:
from unittest.runner import _WritelnDecorator
_WritelnDecorator; # workaround for pyflakes issue #13
except ImportError:
from unittest import _WritelnDecorator
用所需的实体(模块,函数,类)替换_unittest和_WritelnDecorator
– deemoowoor
To quote from the github issue ticket:
While the fix is still coming, this is how it can be worked around, if you’re wondering:
try:
from unittest.runner import _WritelnDecorator
_WritelnDecorator; # workaround for pyflakes issue #13
except ImportError:
from unittest import _WritelnDecorator
Substitude _unittest and _WritelnDecorator with the entities (modules, functions, classes) you need
— deemoowoor
回答 4
这是pyflakes的Monkey补丁,添加了# 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
Here is a monkey patch for pyflakes that adds a # bypass_pyflakes
comment option.
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()
If you save this as bypass_pyflakes.py
, then you can invoke it as python bypass_pyflakes.py myfile.py
.
http://chase-seibert.github.com/blog/2013/01/11/bypass_pyflakes.html
回答 5
您也可以使用导入__import__
。它不是pythonic,但是pyflakes不再警告您。请参阅的文档__import__
。
try:
import json
except ImportError:
__import__('django.utils', globals(), locals(), ['json'], -1)
You can also import with __import__
. It’s not pythonic, but pyflakes does not warn you anymore. See documentation for __import__
.
try:
import json
except ImportError:
__import__('django.utils', globals(), locals(), ['json'], -1)
回答 6
我创建了一个带有一些awk
魔术的shell脚本来帮助我。有了这个的所有生产线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 ...
基本上,它会记录行号并动态创建一个正则表达式。
I created a little shell script with some awk
magic to help me. With this all lines with import typing
, from typing import
or #$
(latter is a special comment I am using here) are excluded ($1
is the file name of the 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 ...
Basically it notes the line numbers and dynamically creates a regex out it.