Python 3.3以降のパッケージでは__init__.pyは必要ありませんか


193

私はPython 3.5.1を使用しています。私はここでドキュメントとパッケージセクションを読みました:https : //docs.python.org/3/tutorial/modules.html#packages

今、私は次の構造を持っています:

/home/wujek/Playground/a/b/module.py

module.py

class Foo:
    def __init__(self):
        print('initializing Foo')

今、中に/home/wujek/Playground

~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>

同様に、今は家にありPlaygroundます:

~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>

実際、私はあらゆることを行うことができます:

~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b

なぜこれが機能するのですか?私があることが必要なものの__init__.py、両方のファイル(空のものが動作します)abのためにmodule.pyインポート可能にするときにPythonのパスポイントPlaygroundフォルダ?

これはPython 2.7から変更されたようです:

~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module

__init__.py両方で~/Playground/a~/Playground/a/bそれが正常に動作します。

回答:


190

Python 3.3以降には、ファイルなしでパッケージを作成できるImplicit Namespace Packagesがあり__init__.pyます。

暗黙的な名前空間パッケージを許可するということは、__init__.pyファイルを提供する要件を完全削除して影響を受ける可能性があるということです。

__init__.pyファイルの古い方法は、Python 2と同様に機能します。


10
ドキュメントを読みますが、少し長いです。すばやく要約することは可能ですか?ただ教えてください:それはまだinit .pyをサポートしていますか、それとも完全に無視していますか?それらをサポートしている場合、機能の違いは何ですか?なぜこの二重性ですか?
wujek 2016年

3
したがって、チュートリアルはおそらく更新する必要があります。ドキュメントのバグが開かれていますか?
ミシェルサミア2017

4
これがZen Of Python ライン2に逆らうことにまだ動揺していExplicit is better than implicit.ます。....
JayRizzo

4
@JayRizzoしかし、「実用性は純粋さを上回りますが」
マイク・ミュラー

18
@JayRizzo IMOそれはより明示的です。でinitを実行する場合もあれば、実行し__init__.pyない場合もあります。Python 3では、これらを必要とするときに__init__.py特定のコードを使用して新しいコードを作成しますが、そうでない場合は作成しません。これは、どのパッケージにカスタム初期化があるかを視覚的に知るのに便利です。代わりにpython 2では常に__init__.py(多くの場合は空)を配置する必要があり、それらを多数作成し、最終的にinitコードを配置した場所を覚えるのが難しくなります。これは、「1つ、できれば1つだけ、明白にそれを行う方法があるはずです。」にも当てはまります。
パオロ

146

重要

@マイクの答えは正しいですが不正確です。Python 3.3以降は、ファイルなしでパッケージを作成できる暗黙的名前空間パッケージをサポートしていることは事実__init__.pyです。

ただし、これはEMPTY__init__.pyファイルにのみ適用されます。したがって、EMPTY__init__.pyファイルは不要になり、省略できます。パッケージまたはそのモジュールまたはサブパッケージのインポート時に特定の初期化スクリプトを実行する場合でも、__init__.pyファイルが必要です。これは、なぜこれが何らかの形で有用であるのか疑問に思った場合に備えて、ファイルを使用してさらに初期化を行う必要がある理由に対する優れたStack Overflow回答__init__.pyです。

ディレクトリ構造の例:

  parent_package/
     __init__.py            <- EMPTY, NOT NECESSARY in Python 3.3+
     child_package/
          __init__.py       <- STILL REQUIRED if you want to run an initialization script
          child1.py
          child2.py
          child3.py

parent_package/child_package/__init__.py

print("from parent")

以下の例は、child_packageまたはそのモジュールの1つがインポートされたときに初期化スクリプトがどのように実行されるかを示しています。

例1

from parent_package import child_package  # prints "from parent"

例2

from parent_package.child_package import child1  # prints "from parent"

2
私がrun_script.py同じディレクトリにいるとしましょう。そうせずにparent_packageインポートfrom parent_package.child_package import child1でき__init__.pyますか?
mrgloom 2018年

これの目的は、some_functionがchildX.pyで定義されている場合でも、child_package.some_functionを記述できるようにすることですか?言い換えると、ユーザーがchild_package内のさまざまなファイルについて知る必要がないようにしますか??
johnbakers

ええ、コードを直接.pyにまとめるのchild1.pyではchild2.pyなく、なぜを作成するのか__init__わかりません。
binki

のインポート文は__init__、相対的なインポートではありませんfrom . import child1か?絶対的なインポートによって私にModuleNotFoundError(Python 3.6で)
Halbeard

5
私の経験では、Python 3.3以降で__init__.pyあっても、サブフォルダーをパッケージとして参照する場合など、空が必要になる場合があります。たとえば、実行python -m test.fooした場合__init__.py、テストフォルダーの下に空を作成するまで機能しませんでした。そして私はここで3.6.6バージョンについて話しています!
Prahlad Yeri

6

あなたが持っている場合はsetup.py、プロジェクトに、あなたが使用しfind_packages()、その中で、持っていることが必要である__init__.pyパッケージを自動的に発見されるため、すべてのディレクトリ内のファイルを。

パッケージは、__init__.pyファイルが含まれている場合にのみ認識されます

UPD:暗黙的な名前空間パッケージを使用したい場合__init__.pyは、find_namespace_packages()代わりに使用する必要があります

文書


1

暗黙の名前空間パッケージ__init__.pyが必要な場合のみ、省略すべきだと私は言うでしょう。それが何を意味するのかわからない場合は、おそらくそれを望んでいないため、Python 3でも引き続き使用する必要があります。__init__.py

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