点群・空間群の既約表現ライブラリを作った+私的Python開発環境2022

既約表現は結晶の対称性を扱うときに強力なツールだが、自分の用途に使えそうなライブラリを見つけられなかった1。 ということで作った:

github.com

実装したアルゴリズムや使い方はドキュメントに書いたので、ここでは実装(python)の環境を忘れないうちに書き残しておく。

Pythonパッケージ開発環境

以下、最近使っているPythonのパッケージング周りのライブラリのリンクと雑感

setuptools

pyproject.toml だけで設定できるらしいと聞きつつもsetup.pyを併用している。 Optional dependency (setup.pyならextra_require)を設定しておくと

pip install -e .[dev,doc]

みたいな感じで必須ではない依存ライブラリを管理できてよい。

setuptools.pypa.io

setuptools-scm

git tag からversion stringを生成してくれる。

github.com

pre-commit

https://github.com/spglib/spgrep/blob/14ba9c01931e5da24ff5943d5c162fc3fb1acc45/.pre-commit-config.yaml

black, flake8, mypy, isort など有名なやつは最低限入れている。

今回はjupyter notebook にリンターをかけるためにnbQAを使ってみたがかなり便利だった github.com

pre-commit.ci も設定しておいて損はない。 pre-commit.ci

テスト

pytest一択

ドキュメント

定式化がバックグラウンドにあるときは、まず実装メモを書いてそれを読みながら実装するのがベストプラクティスだと思っている。 このときメモと実装が近ければ近いほどstaleしづらいので、自分は実装メモも実装と同じレポジトリで管理している。

ドキュメント自体はsphinxで生成しているが、rstはつらいのでmarkdown っぽく書ける拡張を使っている。 myst-parser.readthedocs.io

素のmarkdownだと論文の引用を書くのが面倒だが、sphinxの拡張を入れるとbibtexを読めるようになる。

github.com

Sphinxのテーマはsphinx-book-themeを使っている。前はfuroを使っていた。ここらへんは好みで。

github.com

github.com

Github actions

spgrep/deploy.yml at 14ba9c01931e5da24ff5943d5c162fc3fb1acc45 · spglib/spgrep · GitHub

Sphinxで生成したドキュメントをgh-pagesにデプロイするのはactions-gh-pagesで自動化している。

github.com

PyPIにアップロードするのもgh-action-pypi-publishで自動化している。

github.com

これらのリリース時のworkflowはgit push origin --tag したときだけ走るように設定している。


  1. 電子状態の既約表現を求める前提で書かれていたり、MITなどのライセンスと組み合わせられないものだったり。