yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。
python

PythonのLintチェックツールのインストールと使い方例(flake8、black、isort、mypy)

2022-08-11

個人開発する際は、「動けばええやん」というスタンスであれば考慮不要だが、
複数人で共同開発する場合、ある程度ルールに沿って開発する必要がある

Pythonでは「pep8 」というルールが定められていて、大体これに沿って開発していれば、先輩に怒られない

ただ、目視で確認するのは辛いので、Lintチェックツールを使うのが一般的
また、pep8で定められていない細かな部分もルール化してLintチェックツールに設定しておくことで、共同開発で揉めずに済む

pep8公式ドキュメント:https://pep8-ja.readthedocs.io/ja/latest/

今回は、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)

以上。