Враховуючи цей фрагмент коду:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Мене тривожив Pylint цим повідомленням щодо рядка із заявою 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: