我怎么让Pyflakes忽略一个陈述?

时间:2011-02-17 19:40:56

标签: python 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忽略这一点?

(通常情况下,我会阅读the docs,但链接已损坏。如果没有人有答案,我只会阅读来源。)

9 个答案:

答案 0 :(得分:200)

如果您可以使用flake8代替 - 包裹pyflakes以及pep8检查器 - 以

结尾的行

# NOQA

(其中空间很重要 - 代码末尾与#之间有2个空格,其中一个空格与NOQA文本之间)会告诉检查程序忽略该行上的任何错误

答案 1 :(得分:43)

我知道这是前一段时间受到质疑的,已经得到了解答。

但我想添加我通常使用的内容:

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

答案 2 :(得分:7)

是的,不幸的是,dimod.org与所有好吃的东西都在一起。

看看pyflakes代码,在我看来pyflakes的设计使它很容易被用作“嵌入式快速检查器”。

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

在这里你可以找到一个想法:http://djangosnippets.org/snippets/1762/

请注意,上面的代码段仅用于注释放在同一行。 要忽略整个块,您可能需要在块docstring中添加'pyflakes:ignore'并基于node.doc进行过滤。

祝你好运!


我正在使用pocket-lint进行各种静态代码分析。以下是用于忽略pyflakes的pocket-lint所做的更改:https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882

答案 3 :(得分:6)

这是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

答案 4 :(得分:5)

引用github issue ticket

  

虽然修复工作仍在进行中,但如果您想知道,可以解决这个问题:

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

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

     

- deemoowoor

答案 5 :(得分:2)

您也可以使用__import__导入。它不是pythonic,但pyflakes不再警告你了。请参阅documentation for __import__

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

答案 6 :(得分: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 ...

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

答案 7 :(得分:0)

对于flake8,这是推荐替代方案(比较 flake8 与 pyflakes here

添加第一行,如:

# flake8: noqa: E121, E131, E241, F403, F405

一般:

# flake8: noqa: <code>[, <code> ...]

通过这种方式,您可以在一行中静默 entire file 并为 many 忽略语句 at once 执行此操作,这通常是一种情况。

答案 8 :(得分:0)

Flake 给你 some options to ignore violations

我最喜欢的是明确表示并忽略内联的特定违规:

my invalid code # noqa: WS03

并且您已经引用了其他选项。

  1. 忽略行中的所有验证:
my invalid code # NOQA
  1. 忽略文件中的所有验证。放在第一行:
# flake8: noqa: E121, E131, E241, F403, F405

或者配置为在 flake8 配置中忽略它作为参数。