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 を設定すれば良い。

  1. VSCode を立ち上げる

  2. Extension として Microsoft の "Python" をインストールする。

  3. 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 じゃなくても良い)