Considérant cet extrait de code:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
J'ai été alarmé par Pylint avec ce message concernant la ligne avec l'instruction if:
[pylint] C1801: Ne pas utiliser
len(SEQUENCE)
comme valeur de condition
La règle C1801, à première vue, ne me semblait pas très raisonnable et la définition du guide de référence n'explique pas pourquoi c'est un problème. En fait, il l'appelle carrément une utilisation incorrecte .
len-as-condition (C1801) : Ne pas utiliser
len(SEQUENCE)
comme valeur de condition Utilisé lorsque Pylint détecte une utilisation incorrecte de len (séquence) à l'intérieur des conditions.
Mes tentatives de recherche n'ont pas réussi non plus à me fournir une explication plus approfondie. Je comprends que la propriété de longueur d'une séquence peut être évaluée paresseusement, et cela __len__
peut être programmé pour avoir des effets secondaires, mais il est douteux que cela seul soit suffisamment problématique pour que Pylint appelle une telle utilisation incorrecte. Par conséquent, avant de simplement configurer mon projet pour ignorer la règle, je voudrais savoir si je manque quelque chose dans mon raisonnement.
Quand l'utilisation de len(SEQ)
comme valeur de condition est-elle problématique? Quelles situations majeures Pylint tente-t-il d'éviter avec le C1801?
len
ne connaît pas le contexte dans lequel il est appelé, donc si calculer la longueur signifie traverser la séquence entière, il le doit; il ne sait pas que le résultat est simplement comparé à 0. Le calcul de la valeur booléenne peut s'arrêter après avoir vu le premier élément, quelle que soit la durée réelle de la séquence. Je pense que pylint est un peu d'opinion ici, cependant; Je ne peux penser à aucune situation où il est mauvais d'utiliser len
, juste que c'est une option pire que l'alternative.
if files:
ouif not files: