PythonのLintチェックツールのインストールと使い方例(flake8、black、isort、mypy)
個人開発する際は、「動けばええやん」というスタンスであれば考慮不要だが、
複数人で共同開発する場合、ある程度ルールに沿って開発する必要がある
Pythonでは「pep8 」というルールが定められていて、大体これに沿って開発していれば、先輩に怒られない
ただ、目視で確認するのは辛いので、Lintチェックツールを使うのが一般的
また、pep8で定められていない細かな部分もルール化してLintチェックツールに設定しておくことで、共同開発で揉めずに済む
今回は、Pythonで開発する場合のLintチェックツールの導入と使い方についてまとめる
前提
pythonはversion3.9.1を使用する
% python -V Python 3.9.1
flake8:pep8に準拠しているかまるっとチェック
まずは、flake8
pep8に準拠しているか、論理エラーなどをチェックするツール
チェックだけで自動修正はしない
flake8のインストール
pipでインストールする
% pip install flake8 Collecting flake8 Downloading flake8-5.0.4-py2.py3-none-any.whl (61 kB) |████████████████████████████████| 61 kB 824 kB/s Collecting mccabe<0.8.0,>=0.7.0 Downloading mccabe-0.7.0-py2.py3-none-any.whl (7.3 kB) Collecting pycodestyle<2.10.0,>=2.9.0 Downloading pycodestyle-2.9.1-py2.py3-none-any.whl (41 kB) |████████████████████████████████| 41 kB 761 kB/s Collecting pyflakes<2.6.0,>=2.5.0 Downloading pyflakes-2.5.0-py2.py3-none-any.whl (66 kB) |████████████████████████████████| 66 kB 5.2 MB/s Installing collected packages: mccabe, pycodestyle, pyflakes, flake8 Successfully installed flake8-5.0.4 mccabe-0.7.0 pycodestyle-2.9.1 pyflakes-2.5.0
% pip freeze flake8==5.0.4 mccabe==0.7.0 pycodestyle==2.9.1 pyflakes==2.5.0
これでインストール完了
flake8を使ってみる
例として、以下のような、不備があるpythonファイルを準備
% cat flake8_test.py import time message = "hoge" print(messagee)
flake8コマンドでチェックすると、以下のように、「importしているのに使ってないぞ」とか「定義されていない変数を使おうとしているぞ(スペルミス)」とか、エラーを教えてくれる
% flake8 flake8_test.py flake8_test.py:1:1: F401 'time' imported but unused flake8_test.py:5:7: F821 undefined name 'messagee'
black:フォーマットチェック
次は、black
blackは、pep8に準拠しているフォーマットかをチェックしてくれるツール
自動修正までしてくれる
blackのインストール
blackも、pipでインストール
% pip install black Collecting black Using cached black-22.6.0-py3-none-any.whl (156 kB) Collecting tomli>=1.1.0; python_full_version < "3.11.0a7" Using cached tomli-2.0.1-py3-none-any.whl (12 kB) Collecting platformdirs>=2 Using cached platformdirs-2.5.2-py3-none-any.whl (14 kB) Collecting typing-extensions>=3.10.0.0; python_version < "3.10" Using cached typing_extensions-4.3.0-py3-none-any.whl (25 kB) Collecting mypy-extensions>=0.4.3 Using cached mypy_extensions-0.4.3-py2.py3-none-any.whl (4.5 kB) Collecting click>=8.0.0 Using cached click-8.1.3-py3-none-any.whl (96 kB) Collecting pathspec>=0.9.0 Using cached pathspec-0.9.0-py2.py3-none-any.whl (31 kB) Installing collected packages: tomli, platformdirs, typing-extensions, mypy-extensions, click, pathspec, black Successfully installed black-22.6.0 click-8.1.3 mypy-extensions-0.4.3 pathspec-0.9.0 platformdirs-2.5.2 tomli-2.0.1 typing-extensions-4.3.0
% pip freeze black==22.6.0 click==8.1.3 mypy-extensions==0.4.3 pathspec==0.9.0 platformdirs==2.5.2 tomli==2.0.1 typing-extensions==4.3.0
これでインストール完了
blackを使ってみる
例として、以下のような、フォーマットがめちゃくちゃな、pythonファイルを準備
% cat black_test.py print('hello') string_one_hogehoge = "hogehoge" string_two_fugafuga = "fugafuga" string_three_gerogero = "gerogero" string_four_guwaguwa = "guwaguwa" def black_test (string_one_hogehoge, string_two_fugafuga, string_three_gerogero, string_four_guwaguwa): string_list = [ string_one_hogehoge, string_two_fugafuga, string_three_gerogero, string_four_guwaguwa ] print(string_list)
blackコマンドでチェックにかけると、自動でフォーマットしてくれる
% black black_test.py reformatted black_test.py All done! 1 file reformatted.
ファイルを確認すると、綺麗にフォーマットされている
% cat black_test.py print("hello") string_one_hogehoge = "hogehoge" string_two_fugafuga = "fugafuga" string_three_gerogero = "gerogero" string_four_guwaguwa = "guwaguwa" def black_test( string_one_hogehoge, string_two_fugafuga, string_three_gerogero, string_four_guwaguwa, ): string_list = [ string_one_hogehoge, string_two_fugafuga, string_three_gerogero, string_four_guwaguwa, ] print(string_list)
isort:import文を綺麗にしてくれる
isortは、import文をpep8に準拠した形に、自動で並び替えてくれるツール
isortのインストール
isortも、pipでインストールする
% pip install isort Collecting isort Downloading isort-5.10.1-py3-none-any.whl (103 kB) |████████████████████████████████| 103 kB 2.8 MB/s Installing collected packages: isort Successfully installed isort-5.10.1
% pip freeze isort==5.10.1
これでインストール完了
isortを使ってみる
例として、以下のような、import文がめちゃくちゃなpythonファイルを準備
% cat isort_test.py import os import sys from my_lib import Object import sys from my_lib import Object3 from my_lib import Object2 print("hello")
isortコマンドでチェックすると、自動で並び替えをしてくれる
% isort isort_test.py Fixing $HOME/work_dir/isort_test.py %
ファイルを確認すると、綺麗に並び替えされている
% cat isort_test.py import os import sys from my_lib import Object, Object2, Object3 print("hello")
mypy:型チェック
mypyは、 型チェックしてくれるツール
pythonでは型ヒントを記載するのは必須ではないが、指定しておくとmypyで、指定した型通りにコーディングされているかをチェックしてくれる
mypyのインストール
こちらもpipでインストール
% pip install mypy Collecting mypy Downloading mypy-0.971-py3-none-any.whl (2.6 MB) |████████████████████████████████| 2.6 MB 2.5 MB/s Collecting tomli>=1.1.0; python_version < "3.11" Using cached tomli-2.0.1-py3-none-any.whl (12 kB) Collecting typing-extensions>=3.10 Using cached typing_extensions-4.3.0-py3-none-any.whl (25 kB) Collecting mypy-extensions>=0.4.3 Using cached mypy_extensions-0.4.3-py2.py3-none-any.whl (4.5 kB) Installing collected packages: tomli, typing-extensions, mypy-extensions, mypy Successfully installed mypy-0.971 mypy-extensions-0.4.3 tomli-2.0.1 typing-extensions-4.3.0
% pip freeze mypy==0.971 mypy-extensions==0.4.3 tomli==2.0.1 typing-extensions==4.3.0
これでインストール完了
mypyを使ってみる
例として、以下のような、不備があるpythonファイルを準備
% cat mypy_test.py fruit: str = "apple" def mypy_test(fruit: str) -> list: return f"{fruit}, banana, grape" print(mypy_test(fruit))
mypyコマンドでチェックすると、以下のように、型がおかしい箇所を教えてくれる(返り値はList型のはずがStr型になっている)
% mypy mypy_test.py mypy_test.py:5: error: Incompatible return value type (got "str", expected "List[Any]") Found 1 error in 1 file (checked 1 source file)
以上。