2016-10-19 5 views
11

ディレクトリがパッケージとして認識されるように、__init__.pyno longer requiredになったので、可能な限り完全に避けることをお勧めしますか?または、Python 3.3以降でよく受け入れられている__init__.pyのユースケースはありますか?Python 3.3以降の__init__.pyの使用例

__init__.pyは、モジュールのインポート時にコードを実行するためによく使用されていました(for example、パッケージの内部ファイル構造をカプセル化する、または初期化の手順を実行するために)。これらのユースケースは、Python 3.3+とまだ関連していますか?

+1

「__init __。py」を使用し続ける本当の理由は、下位互換性のためです。 –

+0

@leafそう、私が言及した[example](http://stackoverflow.com/a/29509611/336527)はどうですか? Python 3.3以降でこれを行う正規の方法は何ですか? – max

答えて

2

あり、この非常に良い議論がthis answerでだ、とあなたはおそらく(ない)間と通常のパッケージ__init__.pyを使用)と名前空間のパッケージの違いを明確にするPEP 420に精通している必要があります。

私が答えとして提供するのは、読書、参考文献、および意見の組み合わせです。ここでは「標準的」または「ピジョンソニック」であるという主張はありません。

[初期化]ユースケースはまだPython 3.3+と関連がありますか?

はいexampleをユースケースとしてください。パッケージの作成者は、ルートパッケージの名前空間にいくつかのものを持ち込み、ユーザーが内部構造を気にする必要がないようにします。

別のケースでは、モジュールのhierarchyが作成されています。その参照(オライリー)は、実際に言う:

__init__.pyファイルの目的は、パッケージのように異なるレベルが遭遇している実行し、オプションの初期化コードを含めることです。

彼らはその議論の中で、名前空間のパッケージを検討しますが、継続ん:あなただけの新しいパッケージの作成を始めている場合

をすべてのものが等しい場合、__init__.pyファイルが含まれています。

だから、あなたの2番目の質問のために、

は可能であれば完全に__init__.pyを回避するための最善の方法ですか?ノー

、あなたの目的は、通常のパッケージではなく名前空間パッケージを作成することである場合を除き、その場合、あなたなければならない使用__init__.py

なぜあなたはそれを望みますか?

foo-package/ 
    spam/ 
     blah.py 

bar-package/ 
    spam/ 
     grok.py 

>>> import sys 
>>> sys.path.extend(['foo-package', 'bar-package']) 
>>> import spam.blah 
>>> import spam.grok 
>>> 
することができます:オライリー・リファレンスは別の、独立して維持されたパッケージから崩壊名前空間にできることです私は名前空間のパッケージがクールである理由について見てきた明確なexampleを、持っています

誰もが独自のコードで名前空間を拡張できます。クール。

+0

可能であれば、_packages_を回避し、代わりに_namespaces_を使用するのがベストプラクティスですか?あるいは、そのアプローチに何か問題がありますか? – max

+0

名前空間の利点は、それらが拡張可能であるということです。彼らの欠点は、あなたが '__init __。py'をそれらの中に持つことができず、したがってファイル構造のカプセル化、初期化の実行などいくつかのことができないことです。それは正しいと思いますか? – max

関連する問題