🐍

[Python]フォルダー構成を考える

2024/09/16に公開

はじめに

前回の記事でPython開発環境の構築を行った。
実際にPythonコードを書く前にフォルダー構成を検討しておく。
 ⇒フラットレイアウト or srcレイアウト
フォルダー構成に合わせてpyprojectの設定についても触れる。

featureブランチを切る。

今回フォルダー構成の検討とともにpyproject.tomlを追加するため、featureブランチを作成する。
ブランチ名はチケット管理ツールと紐づけておくと情報の一元化とブランチ名の統一化ができて綺麗。
現時点ではチケット管理ツールは使っていないので、暫定的に「feature/issueYYYYMMMDD_XXX」とした。

フォルダー構成の選択

Pythonのフォルダー構成には大きく2つ、

  • リポジトリ直下にパッケージディレクトリを配置する、フラットレイアウト(flat-layout)
  • ソースコードをsrcディレクトリ内に配置する、srcレイアウト(src-layout)

が存在する。
フラットレイアウトは小規模でシンプルなプロジェクトには適しているが、業務上で使うことを考えておくとsrcレイアウトを選択して慣れておくほうが良いかもしれない。

# src-layout
project-root-directory/
├── .venv
├── src/
│   └── my_package/
│       ├── __init__.py
│       ├── module1.py
│       └── module2.py
├── tests/
│   └── test_module1.py
├── .gitignore
├── pyproject.toml
├── README.md
└── requirements.txt

pyproject.tomlの設定

前回の記事ではpyproject-flake8をインストールしたが、blackも含めて設定などについては記載していなかったのでここで記載する。

[project]
name = "python_game"
description = "Let's make a game with Python"
readme = "README.md"
dynamic = ["version"]

[tool.black]
line-length = 89

[tool.isort]
profile = "black"

[tool.flake8]
max-line-length = 89
max-complexity = 18
ignore = "E203,E266,W503,"

[tool.mypy]
ignore_missing_imports = true
check_untyped_defs = true

featureブランチをコミット

pyproject.tomlを作成、追加した。
変更をfeatureブランチにステージング、コミット、プッシュする。

pull request作成 & merge実行

GitHub上でpull requestを作成し、developブランチとマージする。
(本来はTitle、Descriptionを書くのがレビュアーに優しいが今回はレビュアー/レビュイーともに自分なので楽しておく。)
マージ先のブランチが[main]ではなく、[develop]になっているかはレビュアー/レビューイー共に意識しておく必要ありそう。(というか[main]に簡単にプルリクが出せないような設定にする。)



※不要になったfeatureブランチは削除しておこう。

まとめ

フォルダー構成は、srcレイアウトで進める方針にした。
srcフォルダー内の細かいフォルダー分けは今後考える必要もあると思うがフォルダー構成を決めたことでどのファイルをどこに置くべきかは悩まなくてよい。
pyproject.tomlについても、一部オプションが不明瞭なところもあるがプロジェクトを進めていけば今後必要になる設定, 不要になる設定も理解できるようになればよい。

参考情報

https://qiita.com/ieiringoo/items/4bef4fc9975803b08671
https://caddi.tech/archives/4506

Discussion