名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

Pipenvとpre-commitを使ってみる

仕事でPythonを使っていることもあり、PyCharmにフォーマットを任せているが、実はFlake8通らないようなフォーマットパターンになっていたりする。

なので試しがてらやってみることとする。

またPythonの仮想環境としてはpyenv等があるが、pipでインストールしたライブラリ群が本当にそのリポジトリ内で必要なものなのか、判断がつかず実は不要…! とか、有り得そうだった。似たようなライブラリがぶつかって挙動が不安定になりそうな可能性もある。一方、Pipenvはそのリポジトリ、そのディレクトリ単位で仮想環境を作れるっぽいので( .venv フォルダがディレクトリ内にでき、そちらを参照するようだ)、これも試してみる。

Pipenvをためす

qiita.com

これを見ていれるところだけ真似する。

pipenv-ja.readthedocs.io

あとは公式ドキュメントのちょっと古い日本語版を参照してみる。結果的にこういうPipfileを書いてみた。

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = '*'

[dev-packages]
pytest = '*'
pytest-mock = '*'

[requires]
python_version = '3.7'

ここからPipfileのあるディレクトリに行って、 pipenv shell すると仮想環境がゴリゴリできた。すごい。

必要なパッケージのインストールは pipenv install とか pipenv install --dev とか出てきた。あとは python src/script.py で動いた。簡単やん。

とりあえず必要なコマンドをあまり理解できていないので、随時覚えていこうと思う。

pre-commit を使ってみる

qiita.com

ljvmiranda921.github.io

これを試してみただけ。 pre-commit は pyenv 側に入れたが、もしかしたらこれも Pipenv で管理したほうが良いのかも。

流れとしては Black でフォーマットされた後、 Flake8 でフォーマットの検査を行うという形になっている。

ほんとにフォーマットされてコミットされるが、差分が見えなかったり、うまくフォーマットされてないっぽい時もあり、原因がよくわかってない(おそらくこれは Black が何たるかのほうを理解できていない可能性が高い)

あとFlake8で落ちるとcommitが中断される。キビシイネ。まあフォーマットメチャクチャなコード投げ込まれても困るし、まあいいか。

まとめ

Pipenvは予想通り使いやすい感じだった。仮想環境がガンガンできるとローカルのディスク容量が気になるが、まあ大丈夫でしょう(私みたいにMBAの128GBとか使っていると、ちょっと意識してないといけないかも)。これまで pyenv ないし、 pyenv-virtualenv でやってきたけど、あれは高度に人間が開発環境を覚えていたりしなくてはいけなかったり、インストールしてるパッケージを覚えていないといけない問題があった。Pipenv はそのへんの人間の記憶の厳しさから開放されそうな感じがするので、良さそう。これからもう少しやってみよう。

あと pre-commit について。 1時間位でサクッとやってみて、新しいコードを書いたものに適用させてみたのだが、そんなに長いコードにかけていないので、あんまり実感がわかなかった。それと差分に対してだけ反応するのかなーとか、そういうのはちょっと気になる。途中から導入するのとか難しいとかはやだなーと。とはいえ、毎回自分がコードフォーマットかけなくても勝手にやってくれるのは良さそうだし、これももう少し設定にこだわってみてもよいのかも。うまーいこと設定できたら自分の Dot ファイルリポジトリ.pre-commit-config.yaml , .flake8 , pyproject.toml とかを追加してみてもよいのかも。(Blackの設定は pyproject.toml に書かれるけど、この辺の設定方法もコピペなのでよくわかってない)

これまで周辺ツールを使ってコード品質とか、開発環境とかの分析をサボってきましたが、なるほど~と思えることも多かったし、便利だなと感じたのでもう少し模索していきたいところです。