目次
コードチェッカー(flake8)
flake8は、Pythonのコードチェッカーです。
flake8はPEP8というスタイル規約に基づき、コードチェックします。
PEP8
PEP8は、pythonにおける世界標準スタイル規約です。
PEP8(Python Enhancement Proposal #8)です。
pep8規約をチェックするツールには「pycodestyle」もあります。
以前はpep8という名前でしたが、以下の提案をきっかけに見直されました。
ただ、flake8は内部で「pycodestyle」を使っています。
なので、出力するエラーコードは同じです。
flake8(pycodestyle)のエラーコード一覧
VSCodeなんかの開発環境の設定でこのエラーコードが必要になる場合があります。
訳は自分が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」を使い、自動補正できない部分だけを手修正するのが普通です。
コマンドラインで利用する方法と、VsCodeなどの開発環境の設定で、エディタの機能として自動フォーマットを使う方法があります。
コマンドラインで利用する方法とオプションです。
このオプションは、VSCodeなどの開発環境の設定で必要になる場合があります。
autopep8:コマンドラインでの使い方
インストール方法
pip install autopep8
使い方
autopep8 --in-place --aggressive --aggressive <filename>
です。
--in-place は、ファイルを書き換える指定です。
これを指定しなかった場合は、書き換え後の確認だけで、実際のファイルは書き換えられません。
--aggressive --aggressiveは、同じものが2つありますが、間違いではないです。
デフォルトだと、pycodestyleのすべてのエラーの修正をしません。
例えば、上記エラーコードのE711とかE712は修正してくれません。
でも、自分はそれも修正してほしいので、「 --aggressive」をつけてます。
「 --aggressive」は二つ指定すると、レベル2になって、修正対象のエラーが増えるので、自分にはちょうど良いです。
autopep8&flake8:VsCodeで利用する
VSCodeだと、PEP8のチェックと、autopep8のフォーマットが手軽にできます。
ちなみに今の自分の環境の設定(setting.json)の関連部分はこんな感じです。
"python.linting.lintOnSave": true, "python.linting.pylintEnabled": false, "python.linting.pep8Enabled": false, "python.linting.flake8Enabled": true, "python.linting.flake8Args": [ "--ignore=W293, W504", "--max-complexity", "20" ], "python.formatting.provider": "autopep8", "python.formatting.autopep8Args": [ "--aggressive", "--aggressive", ],
上の「python.linting」の部分がチェックで、「python.formatting」の部分がフォーマッターです。
上記で、pep8Enabledをfalseにして、flake8EnabledをTrueにしてます。
flake8は、pep8のスタイルチェック+論理的なエラーチェックをやってくれる発展版なので、最近はそちらを使っているということです。
一部、チェックさせたくないものがあるので、設定ではずしているところがあります。
--ignore=W293, W504
の部分です。
W293、W504というのは、本記事の一覧のcodeです。
この辺は本記事の一覧を参考にしてもらって、適当に追加したり、外したりして自分好みにすればよいと思います。
フォーマッターの設定は、autopep8のオプションをそのまま書いています。
VSCodeの場合は画面上で確認して上書き保存するので「--in-place」はいりません。
もちろん、設定を書いただけではダメで。
チェッカー
pip install flake8
フォーマッター
pip install autopep8
はインストールしないといけませんし、VSCode側で追加インストールを求められる場合もあります。。
こうしておくと、ソースの編集都度リアルタイムでエラーチェックし修正箇所を教えてくれます。
エディタの「ドキュメントのフォーマット」でautopep8が動くようになります。
VsCodeを開発に使う場合の設定他は以下の記事にもまとめています。
注意:autopep8で修正してくれないエラーもある
autopep8でほぼほぼ修正されますが、完璧ではありません。
コメントで全角空白を使っているエラーは修正してくれません。
PEP8には、ブロックコメントの時、「# 前に半角空白が必要」みたいに、#の後ろに半角空白がひとつ必要というルールがあってpycodstyleでもエラーになります。
当然、#の後ろに間違って、全角空白をおいてしまうとエラーになります。
でも。
これは「autopep8」では自動修正してくれません。
手で修正する必要があります。
プログラムの実行には関係ないのですが、念のため。
今回は以上です。
ではでは。