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のパッチが欲しいです。
Kimvais


2
これは、長年のpyflakesバグです。それを修正する人は、pyflakes作者によって個人的に署名されたビールを手に入れます。
Phil Frost

回答:


215

代わりにflake8を使用できる場合-これはpyflakesとpep8チェッカーをラップします-次で終わる行

# NOQA

(スペースが重要です-コードの終わりとの間に2つのスペース、コードとテキストの#間に1つのスペースNOQA)は、チェッカーにその行のエラーを無視するように指示します。


EL6のいくつかのリポジトリからこれを取得する方法があった場合のみ:)-私はこれを自分でrpmでラップする必要があると思います。
Kimvais

13
素晴らしいですが、pyflakesのソリューションではありません
ezdazuzena '31

7
ヒント:この行# flake8: noqaを追加すると、flake8はファイル全体の検証を無視します。
Reorx 2015

3
# noqaだけではなく、すべて、特定の警告/エラーを無視-この問題に対処するためには、回避策はでパッケージを使用して/インストールする必要がpypi.python.org/pypi/flake8-respect-noqa
マーク

8
ヒント# noqa: F841F841、その行のエラーのみを無視することを意味します。
サンミンキム

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この場合、文はチェッカーを沈黙させるのに十分だと思います。ちなみにいいトリックです。
アントンストロゴノフ2013

これはどこかに文書化されていますか?
派遣蓋

7

はい、残念ながらdimod.orgはすべての機能と共にダウンしています。

pyflakesのコードを見ると、pyflakesは「組み込みの高速チェッカー」として簡単に使用できるように設計されているように思えます。

無視機能を実装するには、pyflakesチェッカーを呼び出す独自の機能を作成する必要があります。

ここでアイデアを見つけることができます:http : //djangosnippets.org/snippets/1762/

上記のスニペットは、同じ行にコメントを配置する場合にのみ使用してください。ブロック全体を無視するには、ブロックのdocstringに「pyflakes:ignore」を追加し、node.docに基づいてフィルタリングすることができます。

幸運を!


私はあらゆる種類の静的コード分析にポケットリントを使用しています。pyflakesを無視するためにpocket-lintで行われた変更は次のとおりです。https://code.launchpad.net/~adiroiban/pocket-lint/907742/+merge/102882


1
divmod.orgはダウンしていますが、良い点はLaunchpadcode.launchpad.net/divmod.org)にあります。
12

6

github発行チケットから引用するには:

修正はまだ行われていますが、疑問に思っている場合は、この方法で回避できます。

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文字列内で使用されている未使用の変数を別の行にリストすることで無視することができますか?セミコロンも必要ですか?
内部石2013年

1
実際、を使用するとdis.dis、これはa LOAD_FASTPOP_TOPの行の各変数に対してそれ自体を実行し(スタックに配置してからスタックから削除しますか?)、そのため何もしません。assertしかし、より良いです。
内部石2013年

セミコロンは必要ありません。アサートは最適化スイッチを介して無視できるため、まったく役に立たない。
Gringo Suave

6

これは、# bypass_pyflakesコメントオプションを追加する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。これを反映するために、この回答を更新することをお勧めします。
John Lunzer、2018年

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 '31

0

私は私awkを助けるためにいくつかの魔法で小さなシェルスクリプトを作成しました。これで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 ...

基本的には行番号を記録し、動的に正規表現を作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.