web-dev-qa-db-fra.com

Quel est le meilleur en python, del ou delattr?

C'est peut-être idiot, mais ça me harcèle depuis un moment.

Python nous offre deux méthodes intégrées pour supprimer des attributs d'objets: la commande del Word et la fonction delattr. Je préfère delattr car je pense que c'est un peu plus explicite:

del foo.bar
delattr(foo, "bar")

Mais je me demande s'il pourrait y avoir des différences mineures entre eux.

165
pydanny

Le premier est plus efficace que le second. del foo.bar Est compilé en deux instructions de code binaire:

  2           0 LOAD_FAST                0 (foo)
              3 DELETE_ATTR              0 (bar)

alors que delattr(foo, "bar") prend cinq:

  2           0 LOAD_GLOBAL              0 (delattr)
              3 LOAD_FAST                0 (foo)
              6 LOAD_CONST               1 ('bar')
              9 CALL_FUNCTION            2
             12 POP_TOP             

Cela se traduit par le premier en cours d'exécution légèrement plus rapide (mais ce n'est pas une énorme différence -. 15 μs sur ma machine).

Comme les autres l’ont dit, vous ne devriez utiliser le second formulaire que lorsque l’attribut que vous supprimez est déterminé de manière dynamique.

[Modifié pour afficher les instructions de bytecode générées dans une fonction, où le compilateur peut utiliser LOAD_FAST Et LOAD_GLOBAL]

248
Miles
  • del est plus explicite et efficace;
  • delattr permet la suppression d'attributs dynamiques.

Considérez les exemples suivants:

for name in ATTRIBUTES:
    delattr(obj, name)

ou:

def _cleanup(self, name):
    """Do cleanup for an attribute"""
    value = getattr(self, name)
    self._pre_cleanup(name, value)
    delattr(self, name)
    self._post_cleanup(name, value)

Vous ne pouvez pas le faire avec del.

37
Oleksandr Fedorov

Incontestablement l'ancien. À mon avis, cela revient à demander si foo.bar Est meilleur que getattr(foo, "bar"), et je ne pense pas que quiconque se pose cette question :)

17
Alex Gaynor

C'est vraiment une question de préférence, mais la première est probablement préférable. Je n'utiliserais le second que si vous ne connaissez pas le nom de l'attribut que vous supprimez à l'avance.

14
Jason Baker

Tout comme getattr et setattr, delattr ne devrait être utilisé que lorsque le nom de l'attribut est inconnu.

En ce sens, cela équivaut à peu près à plusieurs python) fonctionnalités utilisées pour accéder aux fonctionnalités intégrées à un niveau inférieur à celui dont vous disposez normalement, telles que __import__ au lieu de import et operator.add au lieu de +

5
Algorias

Pas sûr du fonctionnement interne, mais du point de vue de la réutilisation du code et de la perspective d'un collègue, utilisez del. C'est plus clair et compris par les personnes venant d'autres langues.

3
eleddy

C'est une vieille question, mais je voudrais mettre mes 2 cents.

Bien que del foo.bar Soit plus élégant, vous aurez parfois besoin de delattr(foo, "bar"). Disons que si vous avez une interface de ligne de commande interactive qui permet à un utilisateur de supprimer dynamiquement tout membre de l'objet par en tapant le nom, vous n'avez pas d'autre choix que d'utiliser le dernier formulaire.

1
kaosad

Si vous pensez que delattr est plus explicite, pourquoi ne pas utiliser getattr tout le temps plutôt que object.attr?

Quant à sous le capot ... votre hypothèse est aussi bonne que la mienne. Si ce n'est pas nettement mieux.

1
Dougal Matthews