2016-05-10 24 views
49

私はPython 3.5.1を使用しています。私はここで、文書やパッケージセクションをお読みください。/home/wujek/Playgroundにおけるながら、今Python 3のパッケージでは__init__.pyは不要ですか?

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

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

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

module.pyhttps://docs.python.org/3/tutorial/modules.html#packages

は今、私は次のような構造を持っています

同様に、家の中で012のスーパーフォルダ:実際

~ $ 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 

なぜこの仕事をしますか?私はとbの両方で__init__.pyのファイル(空のファイルが動作する)が必要でしたが、module.pyは、PythonのパスがPlaygroundフォルダを指しているときにインポートできますか?

これは、Python 2.7から変更されているようだ:~/Playground/a~/Playground/a/b両方で__init__.py

~ $ 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 

それが正常に動作します。

答えて

57

__init__.pyファイルのないパッケージを作成できるPython 3.3以降にはImplicit Namespace Packagesがあります。暗黙の名前空間のパッケージを許可

要件は... が完全滴下し、影響を受ける可能性が__init__.pyファイルを提供することを意味します。マイクの答えは正しいが、あまりにも不正確である@

__init__.pyファイルと古い方法はまだ

+4

私は、ドキュメントを読みますが、それは少し長いです。迅速に要約することは可能ですか?あなたはちょうど私に言うことができます:それはまだ__init__.pyをサポートしていますか、またはそれらを完全に無視しますか?それがサポートされている場合、機能の違いは何ですか?なぜこの二重性ですか? – wujek

+1

はい、それでも動作します。ですから、 '__init __。py'ファイルを持つあなたのPython 2パッケージはすべてインポートの点では機能します(ここでは考慮されていないPython 2とPython 3の違い)。 –

+1

チュートリアルはおそらく更新されるはずです。ドキュメントバグがオープンされていますか? –

2

Pythonの2のように動作します。 Python 3.3以降で暗黙の名前空間パッケージがサポートされており、__init__.pyファイルなしでパッケージを作成できることは事実です。

ただし、EMPTY __init__.pyファイルにのみ適用されます。したがってEMPTY __init__.pyファイルは必要なくなり、省略することができます。モジュールをパッケージにインポートする場合は、__init__.pyファイルにすべてのインポートがリストされている必要があります。

ディレクトリ構造の例:child_package

parent_package/ 
    __init__.py   <- EMPTY, NOT NECESSARY in Python 3.3+ 
    child_package/ 
      __init__.py  <- STILL REQUIRED to import all child modules 
      child1.py 
      child2.py 
      child3.py 

__init__ファイル:

import child1 
import child2 
import child3 
関連する問題