Почему использование len (SEQUENCE) в значениях условий считается неправильным Pylint?

Учитывая этот фрагмент кода:

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(SEQ) в качестве значения условия проблематично? В каких основных ситуациях Pylint пытается избежать использования C1801?

    2 Solutions collect form web for “Почему использование len (SEQUENCE) в значениях условий считается неправильным Pylint?”

    Когда использование функции 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 в булевом контексте, считается более «Pythonic».

    Обратите внимание, что использование len (seq) на самом деле требуется (вместо проверки значения bool seq) при использовании массивов NumPy.

     a = numpy.array(range(10)) if a: print "a is not empty" 

    приводит к исключению: ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте команды a.any () или a.all ()

    И, следовательно, для кода, который использует как списки Python, так и массивы NumPy, сообщение C1801 менее полезно.

    Python - лучший язык программирования в мире.