1. ホーム
  2. パイソン

[解決済み】Python 3.3+のパッケージには__init__.pyは必要ないのでしょうか?

2022-03-28 09:36:18

質問

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>

同様に、今度は home で、superfolder の 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 を選択すると、正常に動作します。

解決方法は?

Python 3.3+は 暗黙の名前空間パッケージ を使用せずにパッケージを作成することができます。 __init__.py ファイルを作成します。

<ブロッククオート

暗黙のうちに名前空間パッケージを許可するということは、そのために必要な __init__.py ファイル を完全に削除することができます。 と、影響を受ける......。

を使った旧来の方法 __init__.py ファイルは、Python 2のようにまだ動作します。