Considerando este trecho de código:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Fiquei alarmado com Pylint com esta mensagem sobre a linha com a instrução if:
[pylint] C1801: Não use
len(SEQUENCE)
como valor de condição
A regra C1801, à primeira vista, não me pareceu muito razoável, e a definição no guia de referência não explica por que isso é um problema. De fato, ele chama de uso incorreto .
len como condição (C1801) : não use
len(SEQUENCE)
como valor de condição Usado quando o Pylint detecta o uso incorreto de len (sequência) dentro das condições.
Minhas tentativas de pesquisa também falharam em me fornecer uma explicação mais profunda. Entendo que a propriedade de comprimento de uma sequência pode ser avaliada preguiçosamente e que __len__
pode ser programada para ter efeitos colaterais, mas é questionável se isso é problemático o suficiente para que Pylint chame esse uso de incorreto. Portanto, antes de simplesmente configurar meu projeto para ignorar a regra, gostaria de saber se estou perdendo alguma coisa no meu raciocínio.
Quando é len(SEQ)
problemático o uso como valor de condição? Que situações principais a Pylint está tentando evitar com o C1801?
len
não conhece o contexto em que é chamado; portanto, se calcular o comprimento significa atravessar a sequência inteira, ele deve; ele não sabe que o resultado está sendo comparado a 0. A computação do valor booleano pode parar depois que ele vê o primeiro elemento, independentemente de quanto tempo a sequência realmente é. Eu acho que o pylint está sendo um pouco opinativo aqui; Não consigo pensar em nenhuma situação em que seja errado usar len
, apenas que é uma opção pior que a alternativa.
if files:
ouif not files: