Ce qui est mieux en python, del ou delattr?
C'est peut-être ridicule, mais il a été lancinante à l'arrière de mon cerveau pendant un certain temps.
Python nous donne deux haut-façons de supprimer des attributs d'objets, la del mot de commande et le delattr fonction intégrée. Je préfère delattr parce que je pense que c'est un peu plus explicite:
del foo.bar
delattr(foo, "bar")
Mais je me demandais si il pourrait y avoir sous le capot de différences entre eux.
Vous devez vous connecter pour publier un commentaire.
La première est plus efficace que la seconde.
del foo.bar
compile de deux instructions bytecode:alors que
delattr(foo, "bar")
prend cinq:Cela se traduit par la première course légèrement plus vite (mais c'est pas une énorme différence – .15 µs sur ma machine).
Comme les autres l'ont dit, vous devriez vraiment utiliser la deuxième forme lorsque l'attribut que vous supprimez est déterminée de façon dynamique.
[Modifiée pour afficher les instructions bytecode généré à l'intérieur d'une fonction, le compilateur peut utiliser
LOAD_FAST
etLOAD_GLOBAL
]dis
module. Vous pouvez l'exécuter à partir de la ligne de commande à l'aide depython -m dis
et en tapant un code, ou de démonter une fonction avecdis.dis()
.Considérons les exemples suivants:
ou:
Vous ne pouvez pas le faire avec del.
del self.__dict__[name]
, en supposant bien sûr pas drôle d'affaires en cours avec la méta-classeIncontestablement l'ancien. À mon avis, c'est comme demander si
foo.bar
est mieux quegetattr(foo, "bar")
, et je ne pense pas que quelqu'un pose cette question 🙂if hasattr(obj, 'var') and obj.var == ...
... je pourrais juste de réduire cela à,if getattr(obj, 'var', None) == ...
dans la plupart des cas! Légèrement plus courte et plus facile à lire, je pense.getattr
C'est vraiment une question de préférence, mais le premier est probablement préférable. J'avais seulement utiliser la seconde si vous ne connaissez pas le nom de l'attribut que vous êtes à la suppression de l'avance.
Comme getattr et setattr, delattr ne doit être utilisé lorsque l'attribut nom est inconnu.
Dans ce sens, c'est à peu près équivalent à plusieurs python fonctionnalités qui sont utilisés pour accéder à des fonctionnalités intégrées à un niveau inférieur à celui que vous avez normalement disponibles, tels que
__import__
au lieu deimport
etoperator.add
au lieu de+
N'est pas sûr du fonctionnement interne, mais à partir d'un code de réutilisabilité et de ne pas être un salaud collègue point de vue, l'utilisation de 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 utiliségetattr
tout le temps plutôt que deobject.attr
?Comme pour sous le capot... votre supposition est aussi bonne que la mienne. Si pas d'amélioration nette.
C'est une vieille question, mais je voudrais mettre mes 2 cents.
Si,
del foo.bar
est plus élégant, parfois, vous aurez besoindelattr(foo, "bar")
. Dis, si vous avez un interactive interface de ligne de commande qui permet à un utilisateur de supprimer dynamiquement n'importe quel membre de l'objet par tapant le nom, alors vous n'avez pas d'autre choix que d'utiliser la dernière forme.