読者です 読者をやめる 読者になる 読者になる

flake8 の NOQA コメントは無敵ではない

flake8 のドキュメントを読むと、
警告を抑止する NOQA コメントについて

lines that contain a # noqa comment at the end will not issue warnings.
(訳: 末尾に # noqa というコメントがある行は警告されません)

と説明されています。

しかし、実際にはすべての警告を抑止できるわけではありません。
例えば、インデントのスペースの数を数える警告(E111)は NOQA コメントの効果がありません。

$ cat test.py
name = 'Taro'
if name:
  print 'Hello,', name  # noqa
else:
  print 'Hello world'   # noqa

$ flake8 test.py
test.py:3:3: E111 indentation is not a multiple of four
test.py:5:3: E111 indentation is not a multiple of four

では、具体的にどういったケースで NOQA コメントが有効で、どういうケースには効かないのでしょうか。

答えは pep8 パッケージのリファレンスにありました*1
Error codesの備考のところに次のように記載があります。

(^) These checks can be disabled at the line level using the # noqa special comment. This possibility should be reserved for special cases.
(訳: (^) マークのついている警告は # noqa スペシャルコメントにより行レベルでのチェックが無効になります。この機能は特殊なケースのために予約されています。)

エラーコード一覧を見ていくと (^) マークが付いている項目は pep8 が検出する警告の半分以下です。

じゃあどうするのさ

PEP8 守れ。以上。

困っていること

こういうデータを記述した時に、見やすさを維持しつつ flake8 に怒られない方法を知りたいです。

 data = [('Tokyo',    5),   # noqa
         ('Kanagawa', 10),  # noqa
         ('Saitama',  8),   # noqa
         ('India',    20)]  # noqa

まとめ

NOQA コメントが万能じゃないことがわかりました。
オチはない。

*1:flake8 は pep8 パッケージを利用して pep8 のチェックをしています