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.
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
]
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.
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 :)
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.
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 +
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.
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.
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.