1. ホーム
  2. パイソン

[解決済み】Pylintで条件値のlen(SEQUENCE)の使用が正しくないとされるのはなぜですか?

2022-04-05 06:10:24

質問

このコード・スニペットについて考えてみましょう。

from os import walk

files = []
for (dirpath, _, filenames) in walk(mydir):
    # More code that modifies files
if len(files) == 0: # <-- C1801
    return None

if文のある行について、Pylintからこのようなメッセージで警告を受けました。

[pylint] C1801:使用しないでください。 len(SEQUENCE) 条件値として

ルールC1801は、一見するとあまり合理的とは思えませんでしたし リファレンスガイドの定義 は、なぜこれが問題なのかを説明していない。それどころか、それを真っ向から否定しています。 誤った使用 .

レンアスコンディション (C1801) : を使用しないでください。 len(SEQUENCE) 条件値として Pylint が条件内部で len(sequence) の不正使用を検出したときに使用します。

また、検索しても深い説明は得られなかった。シーケンスのlengthプロパティが遅延評価される可能性があることは理解していますし __len__ は副作用を持つようにプログラムすることができますが、それだけでPylintがそのような使用を正しくないと呼ぶほど問題があるかどうか疑問があります。したがって、このルールを無視するように私のプロジェクトを単純に構成する前に、私の推論に何か欠けているものがあるかどうかを知りたいのです。

を使用するのはどのような場合ですか? len(SEQ) を条件値として使用することは、問題があるのでしょうか?PylintがC1801で避けようとしている主な状況とは?

解決方法は?

<ブロッククオート

を使用するのはどのような場合ですか? len(SEQ) を条件値として使用することは、問題があるのでしょうか?どのような PylintはC1801で回避しようとしている状況とは?

それは 本当に を使用することは問題ありません。 len(SEQUENCE) - は、効率が悪いかもしれませんが ( chepnerのコメント ). それとは関係なく、Pylint はコードが PEP 8 スタイルガイド には、次のように書かれています。

シーケンス(文字列、リスト、タプル)については、空のシーケンスは偽であることを利用します。

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

Pythonのプログラマーとして、言語間を行き来することもある私としては len(SEQUENCE) の方が読みやすく、明示的です(「Explicit is better than implicit」)。 しかし、空文字列の評価が False の方が、より「Pythonic」であると考えられています。