Почему использование len (последовательности) в значениях условий считается неправильным Pylint?
рассматривая этот фрагмент кода:
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)как значение условие
правило С1801, на первый взгляд, показалось мне не очень разумным, а то определение в справочном руководстве не объясняет, почему это является проблемой. На самом деле, он прямо называет его неправильные используйте.
len-as-condition (C1801):
не используйтеlen(SEQUENCE)как значение условия, используемое, когда Pylint обнаруживает неправильное использование len(последовательности) внутри условий.
мои попытки поиска также не смогли дать мне более глубокое объяснение. Я понимаю, что свойство длины последовательности может быть лениво оценено, и что __len__ можно запрограммировать иметь побочные эффекты, но сомнительно ли это само по себе достаточно проблематично для Pylint назвать такое использование неправильным. Поэтому, прежде чем я просто настрою свой проект на игнорирование правила, я хотел бы знать, не упускаю ли я что-то в своих рассуждениях.
при использовании len(SEQ) как значение условия проблематично? Какие основные ситуации Pylint пытается избежать с C1801?
2 ответов:
при использовании
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)построить, чтобы быть более понятным и явным ("явное лучше, чем неявное"). Однако, используя тот факт, что пустая последовательность оценивается вFalseв логическом контексте является более "подходящие для Python".
обратите внимание, что использование len(seq) на самом деле требуется (вместо того, чтобы просто проверять значение bool seq) при использовании массивов NumPy.
a = numpy.array(range(10)) if a: print "a is not empty"приводит к исключению: ValueError: значение истинности массива с более чем одним элементом неоднозначно. Использовать.любой() или.все()
и, следовательно, для кода, который использует как списки Python, так и массивы NumPy, сообщение C1801 менее чем полезно.
Comments