Pourquoi L'utilisation de Len(SEQUENCE) dans les valeurs d'état est-elle considérée comme incorrecte par Pylint?

compte tenu de ce code snippet:

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 la déclaration if:

[pylint] C1801: N'utilisez pas len(SEQUENCE) comme valeur d'état

la règle C1801, à première vue, ne me semble pas très raisonnable, et la définition de dans le guide de référence n'explique pas pourquoi il s'agit d'un problème. Dans en fait, il l'appelle carrément un utilisation incorrecte .

len-que-condition (C1801) : Ne pas utiliser len(SEQUENCE) comme condition de la valeur Utilisée lors de Pylint détecte une utilisation incorrecte de la len(séquence) à l'intérieur de conditions.

Mes recherches n'ont pas non plus fourni d'explication plus détaillée. Je comprends que la propriété longueur d'une séquence peut être paresse évalué, et que __len__ peut être programmé pour avoir des effets secondaires, mais on peut se demander si cela seul est assez 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 C1801?

118
demandé sur E_net4 2017-03-30 17:52:30

2 réponses

quand l'utilisation de len(SEQ) comme valeur de condition est-elle problématique? Quels sont les grands situations que Pylint tente d'éviter avec C1801?

Ce n'est pas vraiment problématique d'utiliser len(SEQUENCE) – mais il peut ne pas être aussi efficace (voir chepner le commentaire de ). Quoi qu'il en soit, Pylint vérifie le code de conformité avec le guide de style PEP 8 qui stipule que

pour les séquences (chaînes, listes, tuples), utilisez le fait que les séquences vides sont fausses.

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

en tant que programmeur Python occasionnel, qui passe d'une langue à l'autre, je considérerais que la construction len(SEQUENCE) est plus lisible et explicite ("explicite est mieux que implicite"). Cependant, en utilisant le fait qu'une séquence vide évalue à False dans un contexte booléen est considéré plus "Pythonic".

159
répondu Anthony Geoghegan 2017-04-18 15:49:48

noter que l'utilisation de len(seq) est en fait nécessaire (au lieu de simplement vérifier la valeur de bool de seq) lors de l'utilisation de tableaux NumPy.

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

fait exception: ValueError: La valeur de vérité d'un tableau avec plus d'un élément est ambigu. Utilisez un.tout () ou A. tous ()

et donc pour le code qui utilise à la fois des listes Python et des tableaux NumPy, le message C1801 n'est pas très utile.

24
répondu Cameron Hayne 2017-05-08 20:46:20