"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

pycodestyleのエラー一覧と自動フォーマッター「autopep8」使い方/python・PEP8スタイルガイド

Pythonのプログラムを書く機会が増えると、ソースの再利用の機会も増えます。

さすがに、標準的なコーディングスタイルが気になるようになりました。

f:id:arakan_no_boku:20190223210405j:plain


 

PEP8スタイルガイドに従うことにする

 

pythonには、今や、世界標準ともいうべきスタイルがあります。

PEP8(Python Enhancement Proposal #8)です。

f:id:arakan_no_boku:20181110234101j:plain

詳しくは上記リンクのドキュメントにあるので、重複して書きません。

とにかく、これに従うことにします。

 

ソースのチェックプログラム

 

自分の書いたソースが規約に沿っているかは、チェックプログラムで確認します。

使うのは「pycodestyle」です。

たぶん「pylint」の方が有名です。

でも、使ってみた感じ「pylint」のデフォルトチェックは自分には厳しすぎます。

設定ファイルで調節できるみたいですが、そこまで手間をかける気はありません。

その点「pycodestyle」は、丁度よい加減のチェックの厳しさなので気に入ってます。

 

pycodestyleを使ってみよう

 

Anacondaだと、インストール済ですが、なければ以下でインストールしします。

pip install pycodestyle

さて、とりあえず適当なソースをチェックしてみます。

 

オプション

 

pycodestyleには沢山のオプションがあります。

でも、以下のオプションだけ知ってれば、当面困らない気はします。

pycodestyle --show-source [filename or directory]

これで、エラーコードの行の下に、エラーになったソースコードを表示してくれます。

directoryを指定すると、サブフォルダ以下も含めて、すべての拡張子「py」のファイルをチェックします。

例えば、こんな感じ。

.\proc\pdf2text.py:43:26: E231 missing whitespace after ','
    return re.sub(r"\s| ",'',ret)
                         ^
.\proc\pdf2text.py:43:29: E231 missing whitespace after ','
    return re.sub(r"\s| ",'',ret)
                            ^
.\proc\pdf2text.py:45:1: W391 blank line at end of file

ソースファイル名と行数・列数、エラーコードとエラーになったソース。およびエラー箇所などが、表示されてます。 

pycodestyleのエラーコードは英語なのですが、ソースと一緒に見ればなんとはくはわかります。

 

pycodestyleエラーコードの一覧

 

念のため、Google翻訳したものを列追加してます。

code sample message
E1 Indentation インデント
E101 indentation contains mixed spaces and tabs インデントにはスペースとタブが混在しています
E111 indentation is not a multiple of four インデントは4の倍数ではありません
E112 expected an indented block インデントブロックが予想される
E113 unexpected indentation 予想外の圧痕
E114 indentation is not a multiple of four (comment) インデントは4の倍数ではありません(コメント)
E115 expected an indented block (comment) インデントされたブロック(コメント)
E116 unexpected indentation (comment) 予期しないインデント(コメント)
E121 (*^) continuation line under-indented for hanging indent インデントを挟むために下線でインデントされた継続行
E122 (^) continuation line missing indentation or outdented 継続行がインデントされていないか、またはアウトデントされている
E123 (*) closing bracket does not match indentation of opening bracket’s line 開閉ブラケットが開きブラケットのラインの押し込みと一致しない
E124 (^) closing bracket does not match visual indentation 閉じ括弧が視覚的な刻み目と一致しない
E125 (^) continuation line with same indent as next logical line 次の論理行と同じインデントの継続行
E126 (*^) continuation line over-indented for hanging indent インデントを挟むために余分にインデントされた継続行
E127 (^) continuation line over-indented for visual indent 視覚インデントのために余分にインデントされた継続行
E128 (^) continuation line under-indented for visual indent 視覚インデントのためにインデントされた継続行
E129 (^) visually indented line with same indent as next logical line 次の論理行と同じインデントを持つ視覚的にインデントされた行
E131 (^) continuation line unaligned for hanging indent インデントをぶら下げるために並んでいない連続線
E133 (*) closing bracket is missing indentation 閉じ括弧にはインデントがありません
E2 Whitespace 空白
E201 whitespace after ‘(‘ 空白の後に '('
E202 whitespace before ‘)’ 空白の前に ')'
E203 whitespace before ‘:’ 空白の前に ':'
E211 whitespace before ‘(‘ 空白の前に '('
E221 multiple spaces before operator オペレータの前に複数のスペース
E222 multiple spaces after operator オペレータの後の複数のスペース
E223 tab before operator 操作前のタブ
E224 tab after operator 操作後のタブ
E225 missing whitespace around operator オペレータの周囲に空白がない
E226 (*) missing whitespace around arithmetic operator 算術演算子の周りに空白がない
E227 missing whitespace around bitwise or shift operator ビット単位またはシフト演算子の周囲に空白がない
E228 missing whitespace around modulo operator モジュロ演算子の周囲に空白がない
E231 missing whitespace after ‘,’, ‘;’, or ‘:’ '、'、 ';'、または ':'の後に空白がない
E241 (*) multiple spaces after ‘,’ '、'
E242 (*) tab after ‘,’ タブの後に '、'
E251 unexpected spaces around keyword / parameter equals キーワード/パラメータの前後の予期しないスペース
E261 at least two spaces before inline comment インラインコメントの前に少なくとも2つのスペース
E262 inline comment should start with ‘# ‘ インラインコメントは '#'で始まります
E265 block comment should start with ‘# ‘ ブロックコメントは '#'で始まります
E266 too many leading ‘#’ for block comment ブロックコメントの先頭に「#」が多すぎます
E271 multiple spaces after keyword キーワードの後の複数のスペース
E272 multiple spaces before keyword キーワードの前に複数のスペース
E273 tab after keyword キーワードの後のタブ
E274 tab before keyword キーワードの前のタブ
E275 missing whitespace after keyword キーワードの後に​​空白がない
E3 Blank line 空白行
E301 expected 1 blank line, found 0 期待される1空白行、見つかった0
E302 expected 2 blank lines, found 0 期待される2つの空白行、見つかった0
E303 too many blank lines (3) あまりにも多くの空白行(3)
E304 blank lines found after function decorator 関数デコレータの後に空白行が見つかりました
E305 expected 2 blank lines after end of function or class 関数またはクラスの終了後に2つの空白行が必要です
E306 expected 1 blank line before a nested definition ネストされた定義の前に空白行が1つ必要です
E4 Import インポート
E401 multiple imports on one line 1行に複数のインポート
E402 module level import not at top of file モジュールレベルのインポートがファイルの先頭にない
E5 Line length 行の長さ
E501 (^) line too long (82 > 79 characters) 行が長すぎる(82> 79文字)
E502 the backslash is redundant between brackets ブラケットの間にバックスラッシュは冗長です
E7 Statement ステートメント
E701 multiple statements on one line (colon) 1行の複数のステートメント(コロン)
E702 multiple statements on one line (semicolon) 1行に複数のステートメントセミコロン)
E703 statement ends with a semicolon ステートメントセミコロンで終わります
E704 (*) multiple statements on one line (def) 1行に複数のステートメント(def)
E711 (^) comparison to None should be ‘if cond is None:’ Noneとの比較は 'condがNoneの場合'にする必要があります: '
E712 (^) comparison to True should be ‘if cond is True:’ or ‘if cond:’ Trueとの比較は 'condがTrueの場合:'または 'if cond:'とする必要があります。
E713 test for membership should be ‘not in’ メンバーシップのテストは 'not in'でなければなりません
E714 test for object identity should be ‘is not’ オブジェクトアイデンティティーのテストは 'is not'
E721 (^) do not compare types, use ‘isinstance()’ 型を比較しないでください。 'isinstance()'を使用してください。
E722 do not use bare except, specify exception instead 裸のものを使用しないでください。代わりに例外を指定してください
E731 do not assign a lambda expression, use a def ラムダ式を代入しないでください。def
E741 do not use variables named ‘l’, ‘O’, or ‘I’ 'l'、 'O'、または 'I'という名前の変数は使用しないでください
E742 do not define classes named ‘l’, ‘O’, or ‘I’ 'l'、 'O'、または 'I'というクラスを定義しないでください。
E743 do not define functions named ‘l’, ‘O’, or ‘I’ 'l'、 'O'、または 'I'という名前の関数を定義しないでください
E9 Runtime ランタイム
E901 SyntaxError or IndentationError SyntaxErrorまたはIndentationError
E902 IOError IOError
W1 Indentation warning インデント警告
W191 indentation contains tabs インデントにはタブが含まれています
W2 Whitespace warning 空白の警告
W291 trailing whitespace 末尾の空白
W292 no newline at end of file ファイルの最後に改行がありません
W293 blank line contains whitespace 空行には空白が含まれます
W3 Blank line warning 空白行の警告
W391 blank line at end of file ファイルの最後に空白行
W5 Line break warning 改行警告
W503 (*) line break before binary operator バイナリ演算子の前の改行
W504 (*) line break after binary operator バイナリ演算子後の改行
W505 (*^) doc line too long (82 > 79 characters) doc行が長すぎます(82文字> 79文字)
W6 Deprecation warning 廃止予定の警告
W601 .has_key() is deprecated, use ‘in’ .has_key()は非推奨です。 'in'を使用してください。
W602 deprecated form of raising exception 非難される形式の募集例外
W603 ‘<>’ is deprecated, use ‘!=’ '<>'は非推奨です。 '!='
W604 backticks are deprecated, use ‘repr()’ バッククォートは非難され、 'repr()'を使う
W605 invalid escape sequence ‘x’ 無効なエスケープシーケンス 'x'
W606 ‘async’ and ‘await’ are reserved keywords starting with Python 3.7 'async'と 'await'はPython 3.7以降の予約キーワードです

 

autopep8で自動フォーマット

 

上記でチェックできるとはいえ、過去に書いたソースは多いです。

チェックして、手で修正していくのは、ちょっと現実的ではないです。

なので、今はPEP8基準にそった形で、pythonソースコードを自動フォーマットしてくれる「autopep8」を使ってます。

 

インストール方法

pip install autopep8

 

使い方

autopep8 --in-place --aggressive --aggressive <filename>

--in-place は、ファイルを書き換える指定です。

これを指定しなかった場合は、書き換え後の確認だけで、実際のファイルは書き換えられません。

--aggressive --aggressiveは、同じものが2つありますが、間違いではないです。

デフォルトだと、pycodestyleのすべてのエラーの修正をしません。

例えば、上記エラーコードのE711とかE712は修正してくれません。

でも、自分はそれも修正してほしいので、「 --aggressive」をつけてます。

--aggressive」は二つ指定すると、レベル2になって、修正対象のエラーが増える・・って感じらしく、自分にはちょうど良いと思ってます。

これでフォーマットすると、pycodestyleで検査しても、ほぼエラーゼロになります。

 

PEP8で修正してくれないエラーもある

 

なぜ「ほぼ」かというと。

コメントで全角空白を使っているエラーは修正してくれないからです。

PEP8だと。

ブロックコメントの時、「# 前に半角空白が必要」みたいに、#の後ろに半角空白がひとつ必要で、これがないとpycodstyleでエラーになります。

ところが。

#の後ろに間違って、全角空白をおいてしまう間違いをよくするのですね。

これは「autopep8」では自動修正してくれません。

手で修正する必要があります。

プログラムの実行には関係ないのですが、念のため。

 今回は以上です。

ではでは。