web-dev-qa-db-ja.com

PyCharmの誤った未使用のインポートステートメント?

このシナリオの場合:

b.py:

import A
# A is unused here

c.py:

from b import A
# A is used here

PyCharmはb.pyで「import A」は未使用のインポートであると文句を言い、Optimize importsはそれを削除し、c.pyのインポートを壊します

これらのチェーンされたインポートは良い方法ではありませんが(ファサードモジュールの実装に使用することはできますが)、それは私ですか、それともPyCharmの失敗ですか?

47
Mihnea Simian

私が知る限り、この動作はnot検査またはその他の構成可能なオプションとして処理されます。つまり、インポートの前に配置できる#noinspection UnusedImport(または同等のもの)はありません。

これらの変数を使用する未使用のブロックを定義したくない場合は、目的を達成するための別の簡単でおそらくより良い方法があります。

#b.py code
import A

# [...] your code


__all__ = ['A', ...]  # *all* the names you want to export

PyCharmは__all__を見て、未使用のインポートとしてAを削除するのを避けるのに十分スマートです。ただし、__all__は単純なリストリテラルでなければならないという制限があります。あなたできません次のようなことをします:

__all__ = ['A'] + [name for name in iterable if condition(name)]

でもない:

x = 'b'
__all__ = ['A', x]

__all__を定義することは、モジュール*- importを安全にインポートするためのベストプラクティスです。

15
Bakuriu

実際にPyUnresolvedReferencesマーカーを使用して、インポートステートメントの検査を無効にできます。

# noinspection PyUnresolvedReferences
import A

参照: PyCharmバグPY-224

85
benselme
from C import A, B
assert A is not None and B is not None
# or:
_ = (A, B); del _

私のために働く。好きじゃない

# noinspection PyUnresolvedReferences

aをインポートできない場合に偽陰性を与えるためです。そして

__all__ = ['A', 'B', ...]

不可解であり、リファクタリングには不便です。

0