web-dev-qa-db-ja.com

単一pythonファイル配布:モジュールまたはパッケージ?

単一のファイルに存在するuseful_thingと呼ばれる便利なpython関数またはクラス(または何でも))があるとします。ソースツリーを編成するには、本質的に2つの方法があります。単一のモジュール:

- setup.py
- README.rst
- ...etc...
- foo.py

ここで、useful_thingfoo.pyで定義されています。 2番目の戦略は、パッケージを作成することです。

- setup.py
- README.rst
- ...etc...
- foo
|-module.py
|-__init__.py

ここで、useful_thingmodule.pyで定義されています。パッケージの場合、__init__.pyは次のようになります。

from foo.module import useful_thing

どちらの場合でもfrom foo import useful_thingを実行できます。

質問:どちらの方法が推奨されますか、それはなぜですか?

編集:ユーザーgnatはこの質問の形式が悪いと言っているので、公式のpythonパッケージングチュートリアルでは、上記の方法のどれが好ましい方法であるかについてコメントしていないようです。私は明示的にnot長所と短所の個人的なリストを提供する私は、コミュニティが好む方法があるかどうかに興味があるので、長所/短所の議論を生成しない:)

25
DanielSank

あなたはあなたのために働く最も単純なことをします

1つの汎用モジュールの場合、パッケージを作成してもまったく意味がありません。パッケージは、追加の名前空間の作成や、複数のモジュールにまたがるコードの編成に役立ちます。

Python標準ライブラリのjsonおよびunittestモジュールは、たとえばコード編成の目的で実際にパッケージです。しかし、現在のコードをそのままにしておくのはまったく問題ありません。 1つのpythonファイル、1つのモジュールとして。

例が必要な場合:

パッケージを本当にうまく活用しているプロジェクトの良い例については、以下を見てください。

「公式」の勧告はありません。どちらのオプションも完全に有効です。

20
Martijn Pieters