In Anbetracht dieses Code-Snippets:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Ich wurde von Pylint mit dieser Meldung bezüglich der Zeile mit der if-Anweisung alarmiert:
[pylint] C1801: Nicht verwenden
len(SEQUENCE)
als Bedingungswert verwenden
Die Regel C1801 klang auf den ersten Blick für mich nicht sehr vernünftig, und die Definition im Referenzhandbuch erklärt nicht, warum dies ein Problem ist. Tatsächlich nennt es es geradezu eine falsche Verwendung .
len-as-condition (C1801) : Nicht
len(SEQUENCE)
als Bedingungswert verwenden Wird verwendet, wenn Pylint eine falsche Verwendung von len (Sequenz) innerhalb von Bedingungen feststellt.
Meine Suchversuche haben mir auch keine tiefere Erklärung geliefert. Ich verstehe, dass die Längeneigenschaft einer Sequenz möglicherweise träge ausgewertet wird und __len__
so programmiert werden kann, dass sie Nebenwirkungen hat, aber es ist fraglich, ob dies allein für Pylint problematisch genug ist, um eine solche Verwendung als falsch zu bezeichnen. Bevor ich mein Projekt einfach so konfiguriere, dass die Regel ignoriert wird, möchte ich wissen, ob mir etwas in meiner Argumentation fehlt.
Wann ist die Verwendung len(SEQ)
als Bedingungswert problematisch? Welche wichtigen Situationen versucht Pylint mit C1801 zu vermeiden?
len
kennt den Kontext, in dem es aufgerufen wird, nicht. Wenn das Berechnen der Länge das Durchlaufen der gesamten Sequenz bedeutet, muss es; Es ist nicht bekannt, dass das Ergebnis nur mit 0 verglichen wird. Die Berechnung des Booleschen Werts kann beendet werden, nachdem das erste Element angezeigt wurde, unabhängig davon, wie lang die Sequenz tatsächlich ist. Ich denke, Pylint ist hier allerdings ein bisschen eigensinnig; Ich kann mir keine Situation vorstellen, in der die Verwendung falsch istlen
, nur dass es eine schlechtere Option als die Alternative ist.
if files:
oderif not files: