13
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonプログラムの静的解析

Posted at

はじめに

Pythonで利用できる以下の便利なツールの簡単な使い方をまとめました。

  • pipenv
  • black
  • flake8
  • isort
  • mypy

pipenvとは

Pythonで開発するときにパッケージの管理や仮想環境の構築を簡単にやってくれます。
Node.jsのnpmのような感じです。

準備

  1. pipenvのインストール

    pip install pipenv
    
  2. pipfileの作成

    pipenv --python 3.8 # 3.8の部分は使用したいPythonのバージョンに変更可能
    

    Pipfileが作成されます。

  3. 開発用パッケージのインストール
    開発時にしか使用しない静的解析ツールをインストールします。

    pipenv install --dev black --pre
    pipenv install --dev flake8 --pre
    pipenv install --dev isort --pre
    pipenv install --dev mypy --pre
    

    Pipfileの[dev-packages]に各パッケージが追加され、Pipfile.lockが作成/更新されます。

  4. 本番利用のパッケージのインストール
    本番に利用するパッケージをインストールします。

    pipenv install requests --pre
    

    Pipfileの[packages]に各パッケージが追加され、Pipfile.lockが作成/更新されます。

環境構築

  1. 仮想環境の構築
    Pipfile.lockの情報をもとに構築します。

    1. 開発環境の場合

      pipenv sync --dev
      
    2. 本番環境の場合

      pipenv sync
      
  2. Pipfile.lockの更新(必要になった時でOK)

    pipenv install
    
  3. 仮想環境に入る

    pipenv shell
    
  4. インストールパッケージの確認

    pip list
    
    開発環境の結果(ここをクリック)
    Package           Version
    ----------------- ---------
    appdirs           1.4.4
    black             20.8b1
    certifi           2020.6.20
    chardet           3.0.4
    click             7.1.2
    flake8            3.8.3
    idna              2.10
    isort             5.5.3
    mccabe            0.6.1
    mypy              0.782
    mypy-extensions   0.4.3
    pathspec          0.8.0
    pip               20.1.1
    pycodestyle       2.6.0
    pyflakes          2.2.0
    regex             2020.9.27
    requests          2.24.0
    setuptools        49.6.0
    toml              0.10.1
    typed-ast         1.4.1
    typing-extensions 3.7.4.3
    urllib3           1.25.10
    wheel             0.35.1
    
    本番環境の結果(ここをクリック)
    Package    Version
    ---------- ---------
    certifi    2020.6.20
    chardet    3.0.4
    idna       2.10
    pip        20.1.1
    requests   2.24.0
    setuptools 49.6.0
    urllib3    1.25.10
    wheel      0.35.1
    

    ※本番環境は開発用のパッケージ及びその依存パッケージがインストールされていないことがわかります。

  5. 仮想環境から出る

    exit
    
  6. 仮想環境の削除

    pipenv --rm
    

blackとは

blackはPythonのコードフォーマッターで自動でプログラムの書き方を修正してくれます。
Python標準のコーディング規約であるPEP8にも準拠しています。

設定

  1. blackの設定
    pyproject.tomlで設定を定義できます。
    以下は一行の長さを120行までにして、フォーマットしないフォルダを指定しています。
    もっといろいろ設定したい場合は調べると出てくると思います。

    pyproject.toml
    [tool.black]
    line-length=120
    exclude = '''
    /(
        .eggs
    | .git
    | .hg
    | .pytest_cache
    | .mypy_cache
    | .tox
    | .venv
    | build
    | dist
    )/
    '''
    
  2. pipenvのスクリプトの設定
    Pipfileにscriptsを追加します。

    Pipfile
    [scripts]
    black = "black ."  # --checkをつけるとフォーマットせずにチェックのみになります
    

実行

pipenv run black

pythonコードが自動でフォーマットされます

flake8とは

flake8は下記コードチェックツールのラッパーとなります。

  • PyFlakes(pyflakes : コードのエラーチェック)
  • pycodestyle(pycodestyle : PEP8に準拠しているかチェック)
  • Ned Batchelder’s McCabe script(mccabe : 循環的複雑度のチェック)

※flake8はチェックのみでフォーマットはできません。

設定

  1. flake8の設定
    setup.cfgで設定を定義できます。
    以下は一行の長さを120行までにして、チェックしないフォルダを指定しています。
    また、blackとの兼ね合いでE203,W503,W504は無視します。
    もっといろいろ設定したい場合は調べると出てくると思います。

    setup.cfg
    [flake8]
    exclude = .git, .tox, .venv, .eggs, build, dist, docs, tests
    max-line-length = 120
    ignore = E203,W503,W504
    
  2. pipenvのスクリプトの設定
    Pipfileにscriptsを追加する。

    Pipfile
    [scripts]
    flake8 = "flake8 ."
    

実行

pipenv run flake8

pythonコードのチェックが行われます。

isortとは

isortはインポートをアルファベット順にソートし、自動的にセクションに分割してくれます。

設定

  1. isortの設定
    setup.cfgで設定を定義できます。
    以下は一行の長さを120行までにして、チェックしないフォルダを指定しています。
    もっといろいろ設定したい場合は調べると出てくると思います。

    setup.cfg
    [isort]
    line_length = 120
    skip = .git, .tox, .venv, .eggs, build, dist, docs
    include_trailing_comma = true
    multi_line_output = 3
    '''
    
  2. pipenvのスクリプトの設定
    Pipfileにscriptsを追加する。

    Pipfile
    [scripts]
    isort = "isort . --atomic" # --atomicを外すとフォーマットせずにチェックのみになります
    

実行

pipenv run isort

pythonコードが自動でフォーマットされます

mypyとは

mypyはPEP484に準拠したType Hintsが書けているかをチェックしてくれます。

設定

  1. mypyの設定
    setup.cfgで設定を定義できます。
    以下はモジュールの型定義ファイル(stub)が無いことを無視し、型アノテーションを強制しています。
    もっといろいろ設定したい場合は調べると出てくると思います。

    setup.cfg
    [mypy]
    ignore_missing_imports = True
    disallow_untyped_defs = True
    
  2. pipenvのスクリプトの設定
    Pipfileにscriptsを追加する。

    Pipfile
    [scripts]
    mypy = "mypy ."
    

実行

pipenv run mypy

pythonコードのチェックが行われます。

まとめ

これらのツールを使えば、Pythonを使用した開発の生産性が向上すると思います。
GitHubでコードを管理している場合は、以下をGitHub Actionsに設定しておけばPush時に自動で静的解析を行ってくれます。
エラーが出た場合は修正してPushし直しましょう。

.github/workflows/ci.yml(ここをクリック)
.github/workflows/ci.yml
name: Source Code Check
on: [push]
jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Setup Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.8'
      - name: Install Python Dependencies
        run: |
            python -m pip install --upgrade pip
            pip install pipenv
            pipenv sync --dev
      - name: Check with black
        run: pipenv run black
      - name: Check with flake8
        run: pipenv run flake8
      - name: Check with isort
        run: pipenv run isort
      - name: Check with mypy
        run: pipenv run mypy
13
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?