November 18, 2022
久しぶりに Python のセットアップした¶
表題のとおり、久しぶりに自分の Python のセットアップを見直してみた。
数えてみると、自分が真面目に Python を書いていたのは約 7 年前。 それから、多少手直しをすることはあったのだが、やはり色々と流行が変わっている。
今回 Python でコードを書くにあたり、便利なパッケージや設定についてまとめてみた。
flake8¶
現在は flake8 が Linter 兼 Formatter として主流のもよう。
自分は大きなこだわりは無い。 長いものには巻かれよの精神で flake8 に移行。
なお、flake8 は pycodestyle (旧 pep8), pyflakes, mccab のラッパー的存在。
pep8 や pyflakes を別途実行していた人は flake8 に移行することで不要になる。 また、pylint も役割がかぶるので不要になるだろう。
ただし、flake8 はチェックはしてくれるが自動で修正してくれる機能は無い。 また、flake8 に取り込まれていない Formatter も存在する。
必要に応じて他のツールも合わせて使うと良いかもしれない。
autopep8¶
flake8 内で実行している pycodestyle の警告について、自動で修正してくれる。
autoflake¶
flake8 内で実行している pyflakes の警告について、自動で修正してくれる。
black¶
black は flake8 で実行している pycodestyle や pyflakes より強く警告を出してくれる。 多くのプロジェクトで採用されているようなので、自分も使ってみる。
ただし、設定によっては他のツールと異なる結果になってしまうので注意が必用。
自分が体験した範囲だと、1 行あたりの最大長が問題になった。 現在の自分の使っているバージョンだと black はデフォルトで 1 行あたり 88 文字、flake8 や autopep8 が内部で実行している pycodestyle は 79 文字である。
black は --line-length で、flake8 や autopep8 は --max-line-length で 1 行あたりの最大文字数を指定できるので揃えておこう。
isort¶
import 文をアルファベット順にならべてくれる。 「他の言語の Formatter では当たり前の機能なのに、なんで無いんだろう?」と思っていたが、やっぱりあった。
doc8¶
Formatter と言うと語弊があるかもしれないが、doc8 は拡張子が '.rst' のファイル (reStructuredText のファイル) のフォーマットをチェックしてくれる。
pytest¶
Python では標準パッケージだけでもある程度の unittest を書くことも出来る。 しかし、相変わらず pytest の方が便利であることは変わらない模様。
tox¶
test や Formatter, Lint を一括して実行してくれる。
ライブラリ作成時などで複数の python のバージョンでテストしたい時等に便利。 反面、色々と設定する項目が多すぎて面倒でも有る。
使う時は、とりあえず "pip install tox" で tox をインストールしてからオプションも何も無しで実行すれば良い。 不足している設定と、公式ドキュメントの URL を教えてくれる。
mypy¶
今どきの Python コードには型ヒントを書き、mypy でそのチェックを行うのが当たり前らしい。
ところで、外部のライブラリを使用している場合は少し注意が必要。 使用しているライブラリが型ヒントを書いていない場合がある。
そのような時は、オプションとして "--ignore-missing-imports" をつけると良い。
蛇足だが、型チェックにすごく厳密なルールを設けているプロジェクトも存在する模様。 個人的には、必要な所だけ書けば良いと思うのだが。 そんなに型チェックが好きなら静的型付けの言語使えよ(笑)
pipenv¶
一言でいうと、pip と pyenv のラッパー。
個人的には仮想化とかコンテナとかが流行している昨今では重要では無いと思ってたりするのだが、「こういう物が有る」という事を知っておく事は重要かなと思う。
各種設定¶
Makefile¶
常識的には、上記のチェック等を一括して行える仕組みを用意しておく必要があるだろう。
tox を使ってもよいが前述の通り設定が面倒なので、今回は Make でやってみる。
なお、python のコードは src ディレクトリに、ドキュメントは docs ディレクトリに存在すると仮定している。 Makefile 内のインデントは半角スペースではなくタブである必要があるので注意
SOURCES = $(shell find src -type f -name '*.py')
.PHONY: check
check:
flake8 --max-line-length=79 src
black --check --line-length=79 src
isort -c src
mypy --ignore-missing-imports src
doc8 docs
format:
isort src
black src
autopep8 -i --max-line-length=79 $(SOURCES)
autoflake -i $(SOURCES)
VSCode¶
上記を踏まえて、VSCode の設定方法。
Extension, Python Path¶
VSCode で以下のように Extension のインストールと python の path を設定すれば良い。
VSCode を立ち上げる
Extension として Microsoft の "Python" をインストールする。
VSCode のコマンドパレットで "Python: Select Interpreter" を選択し、Python の Path を決める
settings.json¶
VSCode で上記の設定を使用するための最低限の settings.json は下記のようになる。
{
"python.linting.pylintEnabled": false,
"python.linting.mypyEnabled": true,
"python.linting.mypyEnabled": [
"--ignore-missing-imports"
],
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--max-line-length=79"
],
"python.formatting.provider": "black",
"python.formatting.blackArgs": [
"--line-length=79"
],
}
settings.json はコマンドパレットで "Preference: Open Workspace Settings (JSON)" とかすれば編集できる。 (もちろん、Workspace じゃなくても良い)