web-dev-qa-db-ja.com

__init__.pyで参照 'xxx'が見つかりません-Python / Pycharm

私は次のように組織されたプロジェクトをPycharmに持っています:

-- Sources
   |--__init__.py
   |--Calculators
      |--__init__.py
      |--Filters.py
   |--Controllers
      |--__init__.py
      |--FiltersController.py
   |--Viewers
      |--__init__.py
      |--DataVisualization.py
   |--Models
      |--__init__.py
      |--Data

すぐ上のSourcesを除くすべての__init__.pyは空のファイルです。私はこの種の多くの警告を受けています:

__init__.pyで参照 'xxx'が見つかりません

たとえば、私のFiltersController。pyには次のコードが含まれています。

import numpy.random as npr

bootstrap = npr.choice(image_base.data[max(0, x-2):x+3, max(0, y-2):y+3].flatten(), size=(3, 3), replace=True)

そして、私はこの警告を受け取ります:

__init__.pyに参照 'choice'が見つかりません

私はこれが何を意味し、Pythonで適切にコーディングするにはどうすればよいのか疑問に思っています。

前もって感謝します。

55
pceccon

これは、pycharmのバグです。 PyCharmは、参照モジュールが__all__ = []ステートメントに含まれることを期待しているようです。

適切なコーディングエチケットのために、モジュールからの__all__ステートメントを含める必要がありますか? ..これは実際に、テスト中に若いスポックが答えるのを聞いた質問であり、彼はそれに答えました:「それは道徳的に称賛に値するが、道徳的に義務ではない」。

それを回避するには、単にそれを無効にすることができます (極めて重要ではない) (非常に有用)グローバルに検査するか、特定の機能またはステートメントに対して検査を抑制します。

そうするために:

  • エラーテキストの上にキャレットを置きます(上記の例の「選択」)
  • 意図メニューを表示します(デフォルトではalt-enter、鉱山はalt-backspaceに設定されています)
  • 右矢印を押してサブメニューを開き、関連するアクションを選択します

PyCharmにはこのような小さなバグがありますが、私の意見では、その利点は欠点をはるかに上回ります。別の優れたIDEを試してみたい場合は、Spyder/Spyderlibもあります。

あなたが質問をした後、これはかなりの時間がかかることを知っていますが、これがあなたやあなたの誰かに役立つことを願っています。

編集:もともと、これは__all__のチェックに固有のものだと思っていましたが、より一般的な「未解決の参照」チェックのように見え、非常に便利です。上記のメニューを使用するか、ステートメントの前の行に# noinspection PyUnresolvedReferencesを指定して、ステートメントレベルの機能の無効化を使用することをお勧めします。

74
Mr. B

最初に this を見てください。これは、パッケージをインポートするとどうなるかを説明しています。便宜上:

Importステートメントは次の規則を使用します。パッケージの__init__.pyコードが__all__という名前のリストを定義している場合、from package import *が検出されたときにインポートされるモジュール名のリストになります。パッケージの新しいバージョンがリリースされたときにこのリストを最新の状態に保つのはパッケージの作成者次第です。また、パッケージの作成者は、パッケージから*をインポートする使用法が見つからない場合、サポートしないことを決定する場合があります。

したがって、PyCharmは警告メッセージを表示することでこれを尊重し、パッケージから*をインポートするときに作成者がインポートするモジュールを決定できるようにします。したがって、これはPyCharmの便利な機能のようです(これをバグと呼ぶことは決してできません)。この警告は、リストの__all__変数にパッケージをインポートするときにインポートするモジュールの名前を追加することで簡単に削除できます。

__init__.py

from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]

これを追加した後、プロジェクトの他の部分で使用されているこれらのモジュール名をctrl+clickすると、宣言に直接ジャンプできます。

16

私はこれが古いことを知っていますが、グーグルがここに私を送ったので、他の人も私と同じように来るでしょう。

2018年の答えはここで選択されたものです Pycharm:作業中のプロジェクトを開くときのIDEの「未解決の参照」エラー

追加できるのは1つのContent Rootだけですが、複数のSource Foldersを追加できることに注意してください。 init。pyファイルに触れる必要はありません

6
edilio

パッケージにinit。pyを追加するのを忘れましたか?

1
Kai Wang