名前空間パッケージ
二つの名前空間パッケージ手法がある。
暗黙の名前空間パッケージ(Implicit namespace package)
ネイティブサポートされた名前空間パッケージ
旧来の方法
なぜ名前空間パッケージが必要なのか?
パッケージの完全修飾名として、例えば以下のようにしたいことはよくある。
名前空間名.パッケージ名
mynamespace.mypackage_a
mynamespace.mypackage_b
この時、通常のパッケージでは、mynamespace を同じディレクトリにする必要がある。 つまり、以下のような構造にするしかない。
code:txt
mynamespace/
+ __init__.py
+ mymodule.py
+ mypackage_a/
+ __init__.py
+ mymodule_a.py
+ mypackage_b/
+ __init__.py
+ mymodule_b.py
pyproject.toml
ここで、mypackage_a と mypackage_b をバラバラに配布しようとすると、mynamespace で結合しているために、できなくなってしまう。
配布物を分けるために、以下のように分解する。
code:txt
mynamespace-mypackage-a/
+ pyproject.toml
+ src/
+ mynamespace/
+ mypackage_a/
+ __init__.py
+ mymodule_a.py
mynamespace-mypackage-b/
+ pyproject.toml
+ src/
+ mynamespace/
+ mypackage_b/
+ __init__.py
+ mymodule_b.py
これにより、同じ名前空間名の複数のパッケージをそれぞれに分けて管理することができるようになる。
代理の方法
そもそもパッケージ名に名前空間を含めてしまう方法
「名前空間名-パッケージ名」とする。
(この方式が納得できない場合に名前空間パッケージを使うことになる)
mynamespace-mypackage-a
code:txt
mynamespace-mypackage-a/
+ pyproject.toml
+ src/
+ mypackage_a/
+ __init__.py
+ mymodule_a.py
mynamespace-mypackage-b/
+ pyproject.toml
+ src/
+ mypackage_b/
+ __init__.py
+ mymodule_b.py
参考
名前空間パッケージをパッケージする
Python 3.3b1 の名前空間パッケージを試してみた
__init__.py を省略してはいけない