231 votes

Pourquoi l'utilisation de len (SEQUENCE) dans les valeurs de condition est-elle considérée comme incorrecte par Pylint?

Considérant ce bout 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ée par Pylint avec ce message au sujet de 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 paraît pas très raisonnable pour moi, et la définition dans le guide de référence ne permet pas d'expliquer pourquoi c'est un problème. En fait, c'est carrément l'appelle d'une 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 tentatives de recherche n'ont pas réussi à me donner une explication plus approfondie. Je ne comprends qu'une séquence de longueur de propriété peut être paresseusement évaluée, et qu' __len__ peuvent être programmés pour avoir des effets secondaires, mais il est douteux que cela seul est assez problématique pour Pylint d'appeler une telle utilisation incorrecte. Donc, avant que je il suffit de configurer mon projet d'ignorer la règle, je voudrais savoir si il me manque quelque chose dans mon raisonnement.

Quand est l'utilisation de l' len(SEQ) comme valeur de la condition problématique? Quelles sont les principales situations de Pylint tenter d'éviter avec C1801?

306voto

Anthony Geoghegan Points 120

Quand est l'utilisation de l' len(SEQ) comme valeur de la condition problématique? Quels sont les grands les situations de Pylint tenter 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 du commentaire). Peu importe, Pylint vérifie le code de la conformité avec la PEP 8 guide de style qui stipule que

Pour les séquences (chaînes de caractères, listes, tuples), utiliser le fait que les séquences vides sont fausses.

Yes:

Parfois, Python programmeur, qui flâne entre les langues, je voudrais examiner l' if not seq: if seq: construire pour être plus lisible et explicite ("Explicite est mieux implicite"). Cependant, en utilisant le fait qu'une séquence vide évalue No: dans un contexte Booléen est considéré comme plus "Pythonic".

45voto

Cameron Hayne Points 271

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

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

génère une exception: ValueError: la valeur de vérité d'un tableau comportant plusieurs éléments est ambiguë. Utilisez a.any () ou a.all ()

Par conséquent, pour le code qui utilise à la fois des listes Python et des tableaux NumPy, le message C1801 n’est pas utile.

5voto

Mateusz Konieczny Points 827

La prochaine version de Pylint ne devrait plus se plaindre inutilement après la fixation d' https://github.com/PyCQA/pylint/issues/2684 et https://github.com/PyCQA/pylint/issues/1405

Grâce à PaulRenvoise, PCManticore et adhearn pour leur travail sur la fixation de ce!

Par exemple if len(files) == 0 ne cause plus de pylint à se plaindre.

0voto

JayRizzo Points 630

Pylint n'était pas de mon code et de la recherche m'a conduit à ce post:

../filename.py:49:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)
../filename.py:49:34: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)

C'était mon code avant:

def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
    if len(dirnames) == 0 and len(filenames) == 0:
        print("Exists: {} : Absolute Path: {}".format(
            os.path.exists(fullpath), os.path.abspath(fullpath)))

C'était après mon code corrigé. En utilisant l' int() attribute, il me semble avoir convaincu la Pep8/Pylint et ne semble pas avoir un impact négatif sur mon code:

def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
    if len(dirnames).__trunc__() == 0 and len(filenames).__trunc__() == 0:
        print("Exists: {} : Absolute Path: {}".format(
            os.path.exists(fullpath), os.path.abspath(fullpath)))

Mon Fix

En ajoutant .__trunc__() de la séquence, il semble avoir résolu le besoin.

Je ne vois pas une différence dans le comportement, mais si quelqu'un sait détails qui me manque, s'il vous plaît laissez-moi savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X