Почему использование 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?

490   2  

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

    Ничего не найдено.