3

Python マニュアルの 6.4 Packages セクションを調べているときに、次の行に出くわしました。

これらの__init__.pyファイルは、Python がディレクトリをパッケージを含むものとして扱うために必要です。これは、文字列などの共通名を持つディレクトリが、モジュール検索パスで後で発生する有効なモジュールを意図せず隠してしまうのを防ぐために行われます。

ディレクトリをパッケージを含むものとしてマークするには が必要であることは理解して__init__.pyいますが、 の意味がわかりませんprevent directories with a common name...from unintentionally hiding valid modules...

が必要な理由を誰かが説明でき__init__.pyますか?

4

2 に答える 2

10

math数値データを含むという名前のディレクトリを含むプロジェクトがあるとします。no__init__.pyが必要な場合import mathは、実際のmathモジュールの代わりにそのディレクトリをインポートしようとします。しかし、ディレクトリには実際の Python コードではなくデータが含まれているだけなので、インポートは失敗します。したがって、ディレクトリに Python コードがまったく含まれていなくても、ディレクトリは標準ライブラリからmath実際のモジュールをインポートすることをブロックします。mathmath

これ__init__.pyは確認のようなもので、ディレクトリは「はい、私は本当にPythonパッケージであり、単なるファイルでいっぱいのディレクトリではありません。私をインポートするのは理にかなっています.」と言っています。Python はインポートできないことを認識しているため、この方法で自分自身を "アナウンス" しないディレクトリはスキップされます。Python 標準ライブラリには、多くの一般的な名前 (os、math、time、symbol、resource など) を持つモジュールがあるため、これは良いことです。この要件がなければ、Python パス上のどの__init__.pyディレクトリにもこれらの名前を使用することはできません。Python に関係のないデータやファイルを格納することさえできません。

stringこの場合、実際には最良の例ではありません。と呼ばれるモジュールがありますがstring、その関数のほとんどが型のメソッドとして利用できるため、最近ではあまり役に立ちませんstr。しかし、前述したように、一般的な名前のモジュールは他にもたくさんあります。

于 2013-01-03T22:05:35.627 に答える
3

ローカリゼーション データを含む string/ という名前のソース ツリーにフォルダーがある場合がありますがimport string、コード内で を使用しようとする__init__.pyと、Python は標準ライブラリ モジュールの代わりにこのディレクトリをインポートしようとします。標準ライブラリ モジュールをシャドーしたい場合もありますが、たまたま http/、string/、os/ などの名前のディレクトリを使用した場合に、シャドーが発生してしまうと問題が発生します。

于 2013-01-03T22:06:29.707 に答える