Quel est le meilleur en python, ou del delattr?
Question
Cela peut être stupide, mais il a été lancinante à l'arrière de mon cerveau pendant un certain temps.
Python nous donne deux haut-façons de supprimer les attributs des objets, del commande et mot delattr fonction intégrée. Je préfère delattr parce que je pense que son un peu plus explicite:
del foo.bar
delattr(foo, "bar")
Mais je me demande s'il pourrait y avoir sous le capot des différences entre eux.
La solution
Le premier est plus efficace que la seconde. del foo.bar
compile deux instructions bytecode:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
alors 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 la première course légèrement plus rapide (mais pas une énorme différence - .15 ps sur ma machine).
Comme les autres l'ont dit, vous devez vraiment utiliser la deuxième forme lorsque l'attribut que vous supprimez est déterminée dynamiquement.
[Edité pour montrer les instructions de bytecode générées à l'intérieur d'une fonction, où le compilateur peut utiliser LOAD_FAST
et LOAD_GLOBAL
]
Autres conseils
- del est plus explicite et efficace;
- delattr permet de supprimer l'attribut dynamique.
Prenons 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 .
Sans aucun doute l'ancien. À mon avis, c'est comme demander si foo.bar
est mieux que getattr(foo, "bar")
, et je ne pense pas que quiconque pose cette question:)
Il est vraiment une question de préférence, mais la première est sans doute préférable. Je n'utilise le second si vous ne connaissez pas le nom de l'attribut que vous supprimez à l'avance.
Tout comme getattr et setattr, delattr ne doit être utilisé lorsque le nom d'attribut est inconnu.
En ce sens, il est à peu près équivalent à plusieurs fonctionnalités de python qui sont utilisés pour accéder à des fonctionnalités intégrées à un niveau plus bas que vous avez normalement disponibles, comme __import__
au lieu de import
et operator.add
au lieu de +
Je ne sais pas sur le fonctionnement interne, mais d'un réutilisabilité de code et ne soyez pas une secousse de perspective collègue de travail, utilisez del. Il est plus clair et compris par des personnes venant d'autres langues.
Si vous pensez que delattr
est plus explicite, alors pourquoi ne pas utiliser getattr
tout le temps plutôt que object.attr
?
Pour ce qui est sous le capot ... votre estimation est aussi bonne que la mienne. Dans le cas contraire beaucoup mieux.
Il est une vieille question, mais je voudrais mettre mes 2 cents.
Bien que, del foo.bar
est plus élégant, parfois vous aurez besoin delattr(foo, "bar")
. Dites, si vous disposez d'une interface de ligne de commande interactive qui permet à un utilisateur de supprimer dynamiquement un membre dans l'objet par en tapant le nom , alors vous avez pas d'autre choix que d'utiliser cette dernière forme.