SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともに簡潔にわかりやすく伝える解説サイトです。
技術の歴史や背景、関連知識の整理、学習のための覚書や要約記事も掲載しています。

Python - 開発向けVim設定:インデント・PEP8・コードチェック

概要

Python開発で使うVimのインデント設定とflake8によるコードチェックを整理する。

設定ファイルの置き場所だけでなく、実際に有効な設定とその読み込み元を確認する。コードチェックでは未使用のimportと未定義名を含む小さなファイルを使い、行・列・エラーコードから修正箇所を特定する。

この記事の構成

対象環境と利用上の注意

  • 本文記載時の環境
    VimのftpluginとPython向けのflake8を利用する、Unix系OSの設定例。
    Vim・Python・flake8の特定バージョンには固定していない。
  • 確認時期
    2026年9月に公式資料と照合。Vim 9.1では一時ディレクトリの設定を読み込み、インデント設定と保存時の行末空白除去を確認。
    コードチェックの比較例はPython 3.12.2・flake8 7.4.1で確認。
  • 現在そのまま利用できない箇所
    警告内容や設定の推奨値はツールのバージョンとプロジェクト規約で変わる。
    行長などは掲載値を固定的に採用せず、利用中のツールとチームの規約へ合わせる。

作業時の注意点

  • filetype設定
    Python用設定が読み込まれない場合はディレクトリやファイル名を確認。
  • タブとスペース
    混在するとインデントエラーや読みにくさにつながる。
  • flake8の警告
    行番号、列番号、エラーコードの順に読む。
  • プラグイン追加
    最初から入れすぎず、必要なチェックから増やす。

実施内容

Vimの共通設定

  • .vimrcでファイルタイプ別の設定を有効にする
    ホームディレクトリの.vimrcへ次のVim scriptを記述する。すでに同じ設定があれば重複して追加する必要はない。

    " ファイルタイプの判定・専用設定・インデントを有効にする
    filetype plugin indent on
    " シンタックスハイライトを有効にする
    syntax on
    

    従来のVim scriptではコメントに"を使う。シェルのコマンドやPythonコードで使う#とは区別する。

Python用のVim設定

  • ファイルタイプ専用の設定を作る
    次のコマンドをシェルで実行し、~/.vim/ftplugin/python.vimを編集する。

    mkdir -p ~/.vim/ftplugin
    touch ~/.vim/ftplugin/python.vim
    

    python.vimには次のVim scriptを記述する。

    " Tabキー入力などで使うインデントをスペース4つにそろえる
    setlocal expandtab
    setlocal tabstop=4
    setlocal shiftwidth=4
    setlocal softtabstop=4
    " 自動折り返しの幅
    setlocal textwidth=79
    
    " このバッファの保存時に行末の空白を除去する
    augroup sigma_python_whitespace
        autocmd! * <buffer>
        autocmd BufWritePre <buffer> %s/\s\+$//e
    augroup END
    

    expandtabは新たに入力するタブをスペースへ置き換える設定であり、ファイル内の既存タブを一括変換するものではない。保存時の置換は複数行文字列の末尾にも作用するため、末尾空白をデータとして保持するコードでは自動除去の設定を外す。

    PEP 8ではインデントをスペース4つ、コードを原則79文字以内、コメントとdocstringを72文字以内としている。チームで合意した場合はコードを99文字まで広げる選択肢もあるため、行長はプロジェクトの規約を優先する。この設定だけでPEP 8のすべてに準拠するわけではない。

  • 設定したのに反映されない場合の確認順序
    .pyファイルを開き直し、Vimのコマンドラインで順に確認する。

    :set filetype?
    :setlocal expandtab? tabstop? shiftwidth? softtabstop? textwidth?
    :verbose setlocal shiftwidth?
    :scriptnames
    

    この設定が有効ならfiletype=python、expandtab、tabstop=4、shiftwidth=4、softtabstop=4、textwidth=79を確認できる。

    まずfiletypeがpythonかを調べる。次に各設定値を読み、想定と違う値があればverboseで最後に設定したファイルと行を確認する。scriptnamesには読み込まれたスクリプトが表示されるので、専用設定が未読なのか、後から別の設定で上書きされたのかを分けて調べられる。Python用設定が未読なら共通設定とファイル名・配置先を確認する。

コードチェックツールのインストール

  • flake8 のインストール
    Pythonで多く使用されているコードチェックツール flake8 をインストール。
    flake8は、pyflakes、pycodestyle、mccabeを組み合わせて、論理的な誤り、コーディングスタイル、循環的複雑度を確認できる。インストールされるバージョンはPython環境によって異なるため、 python -m flake8 --version で確認。
    $ python -m pip install flake8
    $ python -m flake8 --version
    

コードチェックの一例

  • 小さなファイルで指摘と修正を対応させる
    次の5行をlint_example.pyとして保存する。未使用のimportと変数名の取り違えを含む確認用のコードである。

    import os
    
    
    def total(prices):
        return sum(price)
    
    python -m flake8 --isolated lint_example.py
    
    lint_example.py:1:1: F401 'os' imported but unused
    lint_example.py:5:16: F821 undefined name 'price'
    

    --isolatedは既存のflake8設定ファイルの影響を避けてこの例を試すための指定である。通常のプロジェクトではプロジェクト側の設定に従う。

    1件目は1行目1列目のimportが未使用という指摘で、2件目は5行目16列目のpriceが未定義という指摘になる。引数名はpricesなので次のように直す。

    def total(prices):
        return sum(prices)
    
    
    print(total([100, 200, 300]))
    

    同じflake8コマンドを再実行すると指摘がなくなり、python lint_example.pyでは600を表示する。チェックを通ることと計算結果が正しいことは別なので、入力と期待値でも確認する。論理的な計算ミスを追う方法はPdbの記事で扱う。

以下、flake8、pyflakes、pycodestyle、mccabeの一例。

  • flake8 : コードチェック

    $ flake8 example.py
     example.py:11:1: E302 expected 2 blank lines, found 1
     example.py:12:21: W291 trailing whitespace
    …
    
  • pyflakes : コードチェック

    $ pyflakes example.py
     example.py:74: undefined name 'Http404'
    …
    
  • pycodestyle : PEP8に準拠しているかチェック

    $ pycodestyle example.py
     example.py:10:1: W293 blank line contains whitespace
     example.py:11:1: E302 expected 2 blank lines, found 1
     example.py:12:21: W291 trailing whitespace
    …
    
  • mccabe : 循環的複雑度のチェック
    flake8ではデフォルト無効になっているため、下記のように --max-complexityを指定すれば循環的複雑度のチェックが可能となる。

    $ flake8 --max-complexity 10 coolproject
      ...
      coolproject/mod.py:1204:1: C901 'CoolFactory.prepare' is too complex (14)
    

その他、flake8には、flake8-docstringsやflake8-import-orderなど色々なプラグインが用意されており、必要に応じてカスタマイズすることができる。

まとめ

  • Python用設定が効かない場合はfiletype、有効な設定値、最後に設定したスクリプトの順に確認する。
  • expandtabなどの入力設定と既存ファイルのタブ・空白は区別する。保存時の空白除去も文字列データへの影響を確認して使う。
  • flake8の指摘はファイル・行・列・コードから読み、修正後に再実行する。計算の正しさは具体的な入力と期待値でも確認する。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp