pythonモジュールのずぼらな開発
まだ、自分しか使っていなくていないモジュールの開発がある。
それに対して、最初のうちのズボラな開発のしかたをメモする。
あくまで、個人用の初期の段階でのスタイルです。
まっとうなやりかた
- github で管理しているリポジトリがある。
- パッケージ化するフォルダ
- scripts/ フォルダ
- test/ フォルダ
の3つのフォルダを区別する。
pip install .
でパッケージがインストールできるようにする。
(pyproject.toml もしくは、setup.cfg を書く)
スクリプトを書いたら、
pip install .
を繰り返し、
cd scripts; python {スクリプト}
cd test; pytest test_*.py
を繰り返しながら、開発を進めていく。
まっとうなやり方での気になる点
pip intall . を繰り返すのが手間である。
- (docker 環境の場合には docker build をすることになるだろう。)
- pip をしないまま、古い版のモジュールのライブラリを使って動作させてしまう。
そういう失敗をしてしまいうる。 - 古い版のライブラリで pytest してしまっていることもおこりうる。
(GitHub Actions をすれば、心配はないんだけどね。)
最初のうちは、何をモジュール化すればいいのかを知らない。
- 開発をすすめていくうちに、こういう機能が必要だというのが、山ほどでてくる。
ずぼらな開発スタイル
- 最初はscripts/ フォルダにパッケージ化するライブラリ、 pytest用のtest_*.py も含めて、保存する。
利点
- pip install . をすることなしに、最新のコードを利用して、スクリプト、testスクリプトが実行できる。
- scripts/ フォルダにあっても, pytest test_*.py はふつうに動く。
- そのような状況で、コードの修正、実行を繰り返す。
- まず、目的の作業を達成できることが大事。
- 次に、再利用性がある部分と、残す必要のなくなっていくコードを分離していく。
順を追って改良していくこと
- パッケージ化するであろう機能を、意味ごとのモジュール用のファイルにする。
- 機能のまとまりを、classに実装した方がいい部分を見極めて class化していく。
- モジュール内の関数のうち、スコープを狭めていいものは、private化する。
- "_" で始まる名前に変更する。
- パッケージ化する部分と、実行用のスクリプトを分離していく
- あとで、パッケージ化する部分のファイルの置き場所を変えれば十分なようにしておく。
開発が進んで、設計が安定してきたら
- パッケージ化するモジュール用のフォルダを作り、
__init__.py
を置く。 - pyproject.toml もしくは setup.cfg にパッケージ化のために必要な記述をする。
- パッケージ前提のファイル構成に移行する。
すぼらな開発スタイルその2
独立性が高いリポジトリを、既存のリポジトリから抜き出す
まっとうな開発スタイル
開発プロジェクトで、独立性が高いはずであり、他の開発の中でも再利用したいものは、初めから別リポジトリで別パッケージとして開発させる。
すぼらなスタイル
- いずれ、別のリポジトリで管理したいものでも、開発の時点では、モジュールファイルを別にする程度で、同じ開発プロジェクトのリポジトリの中で開発する。
利点
- 開発当初のまだ安定していない時点では、別リポジトリにおいて別パッケージとする利点が存在しない。
十分に使い込まれて、testを増やしていったあとに、
以下のように作っていく。
適切なリポジトリ名・パッケージ名を定めて、別のリポジトリを作成し、そこにパッケージのモジュール、scritps/, test/ のディレクトリを作る。
1. 新規リポジトリを作る
2.そこにパッケージのモジュール、scritps/, test/ のディレクトリを作る。
3. 今まで開発していたリポジトリから、対応のファイルをそれぞれのディレクトリにコピーする。
4.パッケージにモジュールには__init__.py
を置く。
5.pyproject.toml を書く。
6. pip install . でインストールする。
7. scriptsにあるスクリプトが期待する動作をすることを確認する。
8. cd test; pytest test_*.py の動作を確認する。
9. READEME.mdをそのリポジトリの内容に合わせて書く。
付記:
python でpyproject.tomlを使った環境設定のツールには
poetry、rye などのツールがでています。
勉強していかなくちゃ。
Python パッケージ管理ツール比較: Poetry vs Pipenv vs Rye
--
editable モードについて
おまけ A: editable mode でのインストール