如何让 Pyflakes 忽略一条语句?

Posted

技术标签:

【中文标题】如何让 Pyflakes 忽略一条语句?【英文标题】:How do I get Pyflakes to ignore a statement? 【发布时间】:2011-06-29 08:33:36 【问题描述】:

我们的很多模块都以:

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,但链接已损坏。如果没有人有答案,我会阅读源代码。)

【问题讨论】:

我希望看到 PyFlakes 的补丁! 参考:github.com/kevinw/pyflakes/issues/13 这是一个长期存在的 pyflakes 错误。修复它的人将获得 pyflakes 作者亲自签名的啤酒。 【参考方案1】:

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

结尾的行

# NOQA

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

【讨论】:

如果只有一种方法可以从 EL6 的某个 repo 中获取它:) - 我想我必须自己将它包装在一个 rpm 中。 不错,但不是 pyflakes 的解决方案 提示:添加这一行 # flake8: noqa 将告诉 flake8 忽略整个文件的验证。 # noqa 只忽略某些警告/错误,但不是全部——为了解决这个问题,解决方法是在pypi.python.org/pypi/flake8-respect-noqa 安装/使用包 提示# noqa: F841 表示仅忽略行中的F841 错误。【参考方案2】:

我知道这是不久前有人质疑过的,并且已经回答了。

但我想添加我常用的:

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

【讨论】:

这实际上是我们最终做的。 (好吧,这个 and 解析 pyflakes 输出以忽略带有 silence pyflakes 注释的行上的错误。)谢谢! 我认为assert 声明足以在这种情况下使检查器静音。顺便说一句,这招不错。 这是否记录在任何地方? 找不到它的任何文档,但这似乎是一个已知的技巧,参考:groups.google.com/g/comp.lang.python/c/nryFbibthpo/m/…【参考方案3】:

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

查看 pyflakes 代码,在我看来 pyflakes 的设计目的是使其易于用作“嵌入式快速检查器”。

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

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

请注意,上面的 sn-p 仅适用于 cmets 放在同一行。 要忽略整个块,您可能需要在块文档字符串中添加 'pyflakes:ignore' 并根据 node.doc 进行过滤。

祝你好运!


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

【讨论】:

divmod.org 已关闭,但可以在启动板 (code.launchpad.net/divmod.org) 找到好东西。【参考方案4】:

引用github issue ticket:

虽然修复仍在进行中,但如果您想知道,可以通过以下方式解决它:

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

Substitude _unittest 和 _WritelnDecorator 以及您需要的实体(模块、函数、类)

-- deemoowoor

【讨论】:

_WritelnDecorator; 绝对什么都不做,对吧?所以我可以使用它来让 pyflakes 通过在单独的行上列出变量来忽略 eval 或 numexpr 字符串中实际使用的未使用变量?分号还有必要吗? 实际上,使用dis.dis,这显然会为一行上的每个变量单独执行LOAD_FASTPOP_TOP(将其放入堆栈然后将其从堆栈中删除?),所以它不是什么都不做。不过比assert 好。 不需要分号。可以通过优化开关忽略断言,因此并非完全没用。【参考方案5】:

这是一个用于 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

【讨论】:

我不确定发生了什么变化或者原始代码中是否有错误,但我的 pyflakes (0.9.2) 版本要求将 text_lineno = args[0] - 1 更改为 text_lineno = args[0].lineno - 1。我建议更新此答案以反映这一点。【参考方案6】:

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

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

【讨论】:

我正在寻找一种让 pyflakes 忽略错误的方法,而不是一种 uglify 我的代码的方法 :) 此外,这不是解决方案,例如from foo import bar【参考方案7】:

Flake 给你some options to ignore violations。

我最喜欢的是让它显式并忽略内联的特定违规:

my invalid code # noqa: WS03

你还有其他已经引用的选项。

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

或配置为在您的 flake8 配置中将其作为参数忽略。

【讨论】:

【参考方案8】:

我创建了一个带有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 ...

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

【讨论】:

【参考方案9】:

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

添加第一行,如:

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

一般:

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

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

【讨论】:

以上是关于如何让 Pyflakes 忽略一条语句?的主要内容,如果未能解决你的问题,请参考以下文章

android 开发中如何实现让程序执行一条语句后延时一段时间后再执行下面的语句

由于 continue 而忽略了数组 for 循环中的基本 else 语句

游标循环和继续语句:意外行为

一条 update 语句引起的事故,这回让开发长长记性!!

如何修复此“忽略 SQL 语句”错误?

如何在 eslint/tslint 中配置忽略单行语句?