Teniendo en cuenta este fragmento 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
Pylint me alarmó con este mensaje con respecto a la línea con la declaración if:
[pylint] C1801: No utilizar
len(SEQUENCE)
como valor de condición
La regla C1801, a primera vista, no me pareció muy razonable, y la definición en la guía de referencia no explica por qué esto es un problema. De hecho, lo llama francamente un uso incorrecto .
len-as-condition (C1801) : no utilizar
len(SEQUENCE)
como valor de condición Se utiliza cuando Pylint detecta el uso incorrecto de len (secuencia) dentro de las condiciones.
Mis intentos de búsqueda tampoco han podido proporcionarme una explicación más profunda. Entiendo que la propiedad de longitud de una secuencia puede evaluarse perezosamente, y que __len__
se puede programar para que tenga efectos secundarios, pero es cuestionable si eso solo es lo suficientemente problemático como para que Pylint considere incorrecto dicho uso. Por lo tanto, antes de simplemente configurar mi proyecto para ignorar la regla, me gustaría saber si me falta algo en mi razonamiento.
¿Cuándo es len(SEQ)
problemático el uso de como valor de condición? ¿Qué situaciones principales intenta evitar Pylint con C1801?
len
no conoce el contexto en el que se llama, por lo que si calcular la longitud significa atravesar toda la secuencia, debe hacerlo; no sabe que el resultado solo se está comparando con 0. Calcular el valor booleano puede detenerse después de ver el primer elemento, independientemente de la duración de la secuencia. Sin embargo, creo que Pylint está siendo un poco obstinado aquí; No puedo pensar en ninguna situación en la que sea incorrecto usarla len
, solo que es una opción peor que la alternativa.
if files:
oif not files: