名前空間パッケージ
二つの名前空間パッケージ手法がある。
暗黙の名前空間パッケージ(Implicit namespace package)
ネイティブサポートされた名前空間パッケージ
PEP420で定義された方法
レガシー名前空間パッケージ(Legacy 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
参考
名前空間パッケージをパッケージする
https://packaging.python.org/ja/latest/guides/packaging-namespace-packages/
Python 3.3b1 の名前空間パッケージを試してみた
https://www.freia.jp/taka/blog/2012/07/hello-python-3.3b1/index.html
__init__.py を省略してはいけない
https://qiita.com/methane/items/ed1e5b74747f3ffe9324