TL;DR
Pythonコードをクラス・関数ごとに分割し、自動でGitコミットするツールを作りました。
背景
開発現場では、1つのPythonファイルに数千行のコードが詰め込まれ、複数のクラスや関数が混在していることがよくあります。特にDjangoプロジェクトでは数千行のmodels.pyをよく見かけます。
このような巨大なファイルでは、目的のクラス定義を探すのが大変です。
課題
クラスごとにファイルを分割すれば可読性は向上しますが、既存の長大なコードを手作業で整理するのは非常に手間がかかります。クラス定義や関数定義を移動した時に、参照が壊れないようにする対応も求められます。
また、ファイル分割後にPRを出す際、数千行のコードをリファクタしたとは言え、ただ定義箇所を移動しただけなのでレビューコストは極力下げたいです。
ツールの紹介
そこで開発したのが python-code-splitter です。
インストール
pip install python-code-splitter
使い方
分割したいPythonファイルを指定するだけです。
python-code-splitter path/to/file.py
実行すると、path/to/file/ ディレクトリが作成され、各クラスは個別のファイルに分割されます。
例えば、SampleClass というクラスが含まれていた場合、fileディレクトリ下にsample_class.pyというファイルが作成され、そこにクラスの定義が移動します。
実行前
└── path
└── to
└── file.py
実行後
└── path
└── to
└── file
├── __init__.py
└── sample_class.py
また、移動後も元のコードが正しく動作するよう、
__init__.py に SampleClass の import が自動で追加されます。
Gitとの連携
--git オプションを付けると、分割ごとにGitコミットを自動作成し、
ファイルパスに応じて適切なブランチも作成されます。
python-code-splitter path/to/file.py --git
特定のターゲットのみ移動
--targets オプションを使用すると、クラス定義のみを分割できます。
python-code-splitter path/to/file.py --targets class
まとめ
python-code-splitter を使えば、
大規模なPythonコードを効率的に分割し、Gitのコミット履歴もレビューしやすい単位にできます。
ぜひ試してみてください!