Question

Inspiré par cette question.

Pourquoi n'y a-t-il pas de méthode list.clear () en python? J'ai trouvé plusieurs questions ici qui disent que la bonne façon de le faire est l'une des suivantes, mais personne n'a dit pourquoi il n'y a pas qu'une méthode pour cela.

del lst[:]
lst[:] = []

Bien que cela puisse aller à l’encontre du "zen of python" pour avoir plus d’une façon de faire quelque chose, il me semble certainement plus évident d’avoir une "liste.clear ()". méthode. Cela cadrerait également avec les dict et les sets, qui ont tous deux .clear ().

Je suis tombé sur quelques articles de python-dev et de python-ideas à ce sujet et je n'ai pas obtenu de réponse définitive (voir ici (2006) et ici (2009)). Guido a-t-il pesé dessus? Est-ce juste un point de discorde qui n’a pas encore été résolu au cours des 4-5 dernières années?

Mise à jour: list.clear () a été ajouté à python dans la version 3.3 - à voir ici

Était-ce utile?

La solution

Dans les discussions que vous avez liées Raymond Hettinger résume à peu près tout les avantages et les inconvénients de l'ajout de cette méthode. En matière de conception linguistique, il est très important d’être conservateur. Voir, par exemple, " chaque fonctionnalité commence par -100 points " principe de l'équipe C #. Vous n'obtenez pas quelque chose d'aussi propre que Python en ajoutant des fonctionnalités à volonté. Jetez simplement un coup d’œil à quelques-uns des langages de script populaires les plus cruels pour voir où cela vous mènera.

Je suppose que la méthode .clear () n'a jamais franchi la règle implicite des -100 points pour devenir un atout supplémentaire à ajouter au langage principal. Bien que le nom de la méthode soit déjà utilisé à des fins équivalentes et que l’alternative soit difficile à trouver, ce n’est probablement pas si loin.

Autres conseils

Bien qu'il n'y ait pas eu list.clear () quand cette question a été posée, la version 3.3 en a maintenant une (comme le demande http://bugs.python.org/issue10516 ). De plus, des méthodes clear () ont été ajoutées à bytearray et MutableSequence pour faciliter le basculement entre les listes et les autres collections (set, dict, etc.).

Vous trouverez des détails complets sur le changement ici .

Je ne peux pas répondre au pourquoi; mais il doit absolument en exister un, afin que différents types d'objets puissent être effacés avec la même interface.

Un exemple simple et évident:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()

Ceci nécessite seulement que l'objet supporte l'itération, et qu'il supporte clear (). Si les listes avaient une méthode clear (), cela pourrait accepter une liste ou un ensemble identique. Au lieu de cela, étant donné que les ensembles et les listes ont une API différente pour supprimer leur contenu, cela ne fonctionne pas; vous vous retrouvez avec un bidouillage inutilement laid, comme:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    if getattr(reqs, "clear"):
        reqs.clear()
    else:
        del reqs[:]

En ce qui me concerne, utiliser del obj [:] ou obj [:] = [] ne sont que des méthodes désagréables et peu intuitives pour contourner le fait que la liste manque (clear) ().

Ceci prend "réduction de la redondance". faute de quoi, cela nuirait à la cohérence de la langue, ce qui est encore plus important.

Pour ce que vous devriez utiliser, je recommanderais del obj [:]. Je pense que c'est plus facile à implémenter pour des objets ne faisant pas partie d'une liste.

Lors des tests, il est souvent utile de configurer les données constituant le domaine des tests dans des variables globales, afin que les tests puissent s’appuyer les uns sur les autres si nécessaire / plus simplement. Dans de tels cas, disposer d’une méthode pour effacer la liste vous permettrait de le faire sans avoir à déclarer ces variables comme étant globales dans une fonction (c’est-à-dire les tests). Je sais que les tests ne doivent pas dépendre les uns des autres ...

La question devrait être de savoir pourquoi clear a été jugé nécessaire en premier lieu. Les travaux suivants permettent d'effacer toutes les collections Python auxquelles je peux penser.

def clear(x):
    return type(x)()

>>> s = {1, 2, 3}
>>> s
set([1, 2, 3])
>>> s = clear(s)
>>> s
set([])
>>> l = [1, 2, 3]
>>> l
[1, 2, 3]
>>> l = clear(l)
>>> l
[]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top