Pythonでツールや小さなアプリを作っていると、「また同じ処理を書いている」と感じる場面があります。
ログ設定、設定ファイルの読み込み、エラー処理、パス操作などは、どのプロジェクトでもほぼ必ず必要になります。
そのたびに実装を考えるのは時間がかかり、開発のテンポも落ちてしまいます。
この記事では、そうしたよく使う処理をPythonの共通機能としてまとめ、ChatGPTとCodexを使って実際に作成した流れを紹介します。
この記事で分かること
Pythonで共通機能を作ろうと思った理由
Pythonでツールやアプリを作っていく中で、よく使用する処理が毎回似通っていることに気づきました。
今後もツールやいろいろなアプリを作る予定があるため、これらを都度実装するのではなく、最初に共通機能としてまとめておいた方が効率的だと考えました。
共通機能を用意しておけば、新しいプロジェクトを始める際に基盤部分を考える時間を減らすことができます。
その結果、本来取り組みたい機能の実装に集中できるようになると考えました。
今回作ったPython共通機能の一覧
今回作成した共通機能は、次のGitHubに公開しているREADMEに一覧としてまとめています。
README(GitHub)
作成した機能は次の一覧の通りです。
| 機能名 | 概要 |
|---|---|
| Logging | logging設定を外部ファイルで管理するための共通機能 |
| Config | YAML、JSON、TOMLなどの設定ファイル読み込み |
| Errors | 共通で使う例外クラスの定義 |
| Messages | メッセージをIDで管理し取得する仕組み |
| Codes | CSVで管理するコード定義の読み込み |
| Paths | pathlibを使ったパス操作ユーティリティ |
| YAML Store | YAML形式でのデータ保存ユーティリティ |
| IO Utils | テキストやCSVの入出力処理 |
| Datetime | 日付や時刻を扱う共通ユーティリティ |
| Validation | pydanticを使った入力・設定の検証 |
これらは、Pythonでツールやアプリを作る際によく使う共通機能です。
共通機能としてまとめることで、プロジェクトごとの初期作業を大幅に減らすことができます。
ChatGPTとCodexの役割分担
今回の開発では、ChatGPTとCodexを明確に役割分担して使いました。
設計と実装を分けることで、作業内容が整理され、進めやすくなりました。
役割分担は次のとおりです。
| ツール | 担当内容 |
|---|---|
| ChatGPT | 共通ルールの整理、AGENTS.mdとPLANS.mdの作成、specs配下の仕様書作成 |
| Codex | 仕様書をもとにしたコード作成、テストコード作成、README作成 |
共通機能を作る設計の考え方
最初、共通機能をAGENTS.mdに全て設定して開発しようと考えていました。
ChatGPTに依頼したら、数百行の仕様書が出力した内容を見て、各機能の仕様書を修正する場合にAGENTS.mdを毎回修正するのは大変と考え、次のように個別の機能はspecs配下に仕様書を分ける方針にしました。
samples/python-common-sample/
├── specs/ # 各共通機能の仕様書
│ ├── codes.md # コード管理仕様
│ ├── config.md # 設定ファイル読み込み仕様
│ └── logging.md # logging 仕様
├── AGENTS.md # 共通の仕様と行動指針
└── PLANS.md # 実装計画最初に行ったのは、共通機能全体のルールと作業の進め方を決めるため、AGENTS.mdとPLANS.mdを次のような考えでChatGPTに依頼して作成しました。
これにより、後から機能を追加しても方針がぶれにくくなります。
- AGENTS.mdはsrcレイアウト、日本語のコメント、ストにはpytestを使うことなどの全体にかかわるる^るを定義する
- PLANS.mdは仕様作成から実装、テストまでの作業手順を定義する
個別の機能は、specs配下に仕様書を分けて作成していきます。
仕様書を作成するのはChatGPTに依頼しています。
oggingやpathsなど、1つの機能につき1つの仕様書を用意しています。
プロジェクト作成手順
仕様書の準備ができたら、GitHubリポジトリをクローンしてプロジェクトを作成します。
Codexを使用するため、WindowsでWSLを使っています。
WSLでCodexを使用する手順は次の記事が参考になります。
リポジトリのクローン後、作業用のブランチを作成します。
git switch -c feature/python-common-sample次にuvを使ってプロジェクトを初期化します。
cd samples/
uv init python-common-sample --python 3.13テストを実行するためにpytestを追加します。
これでプロジェクトの準備は完了です。
cd python-common-sample
uv add --group test pytestCodexに依頼した内容
ChatGPTで作成した仕様書は次のように格納します。
samples/python-common-sample/
├── specs/ # 各共通機能の仕様書
│ ├── codes.md # コード管理仕様
│ ├── config.md # 設定ファイル読み込み仕様
│ └── logging.md # logging 仕様
├── AGENTS.md # 共通の仕様と行動指針
└── PLANS.md # 実装計画仕様書を格納した後、次のようにspec配下の仕様書を指定してCodexにコードの作成を依頼します。
依頼後、コード作成、pytestによるテストコード作成・実行まで自動的に行ってくれます。
コードやテストコードで問題があればCodexに追加で依頼して修正させます。
下記の仕様に従って、メッセージ取得のコードを実装してください。
samples/python-common-sample/specs/messages.mdCodexのコードやテストコードの作成が完了したら、次のように手動でテストを実行して仕様通りに動作するのか確認します。
以下はloggingのテストを実行する手順です。
cd samples/python-common-sample
uv run python -m pytest tests/test_logging.py -v手動のテストが完了したら、READMEの作成を依頼します。
これを共通機能の作成数分繰り返します。
繰り返しの作業が増えるのは手間ですが、個別の機能をひとつずつ確認していくので、手戻りがなくて効率的でです。
作成したリポジトリとプロジェクト
今回作成したコードは、次のリポジトリで公開しています。
興味がある方は参考にしてください。
リポジトリ
https://github.com/ojichiku/public-python-samples
共通機能のプロジェクトフォルダ
https://github.com/ojichiku/public-python-samples/tree/main/samples/python-common-sample
まとめ
Pythonでよく使う処理を共通機能として先に作っておくことで、その後の開発が進めやすくなります。
今回、共通機能とspecを分けて管理することで、仕様が整理されて生成AIへの指示も明確になり、開発が効率的に進められたと思います。
また、ChatGPTで設計を行い、Codexで実装を進めるという役割分担は、実務でも取り入れやすい方法のため、今後の開発はこの方法を使っています。
今後もツールやアプリを作る際には、今回作成した共通機能をベースとして活用していく予定です。