Учитывая этот фрагмент кода:
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] C1801: не использовать в
len(SEQUENCE)
качестве значения условия
Правило C1801, на первый взгляд, показалось мне не очень разумным, и определение в справочном руководстве не объясняет, почему это проблема. Фактически, это прямо называет это неправильным использованием .
len-as-condition (C1801) : Не использовать в
len(SEQUENCE)
качестве значения условия. Используется, когда Pylint обнаруживает неправильное использование len (последовательности) внутри условий.
Мои попытки поиска также не дали мне более глубокого объяснения. Я понимаю, что свойство длины последовательности может быть лениво оценено, и это __len__
может быть запрограммировано, чтобы иметь побочные эффекты, но сомнительно, является ли это само по себе достаточно проблематичным для Pylint, чтобы назвать такое использование неправильным. Следовательно, прежде чем я просто настрою свой проект на игнорирование правила, я хотел бы знать, что я что-то упускаю в своих рассуждениях.
Когда использование len(SEQ)
в качестве значения условия проблематично? Каких основных ситуаций Pylint пытается избежать с помощью C1801?
len
не знает контекст, в котором он вызывается, поэтому, если вычисление длины означает пересечение всей последовательности, оно должно; он не знает, что результат просто сравнивается с 0. Вычисление логического значения может прекратиться после того, как он увидит первый элемент, независимо от того, какова длина последовательности на самом деле. Я думаю, что Пилинт здесь немного самоуверен; Я не могу придумать ни одной ситуации, когда это неправильно использовать len
, просто что это худший вариант, чем альтернатива.
if files:
илиif not files: