C'est peut-être idiot, mais cela me harcèle le dos depuis un moment.
Python nous donne deux méthodes intégrées pour supprimer des attributs d'objets, le mot de commande del et la fonction intégrée 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 sous le capot entre eux.
dis
module. Vous pouvez l'exécuter à partir de la ligne de commande en utilisantpython -m dis
et en tapant du code, ou désassembler une fonction avecdis.dis()
.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 .
la source
del self.__dict__[name]
, en supposant bien sûr qu'aucune affaire amusante ne se passe avec la classe métaIncontestablement le premier. À mon avis, c'est comme demander si
foo.bar
c'est mieux quegetattr(foo, "bar")
, et je ne pense pas que quiconque pose cette question :)la source
if hasattr(obj, 'var') and obj.var == ...
... Je pourrais simplement réduire cela à,if getattr(obj, 'var', None) == ...
dans la plupart des cas! Un peu plus court et plus facile à lire, je pense.hasattr
appelle réellementgetattr
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.
la source
Tout comme getattr et setattr, delattr ne doit être utilisé que lorsque le nom d'attribut est inconnu.
En ce sens, cela équivaut à peu près à plusieurs fonctionnalités python utilisées pour accéder aux fonctionnalités intégrées à un niveau inférieur à celui dont vous disposez normalement, par exemple au
__import__
lieuimport
etoperator.add
au lieu de+
la source
Je ne suis pas sûr du fonctionnement interne, mais du point de vue de la réutilisation du code et ne soyez pas du point de vue d'un collègue, utilisez del. C'est aussi plus clair et compris par les personnes venant d'autres langues.
la source
Si vous pensez que
delattr
c'est plus explicite, alors pourquoi ne pas être utiliségetattr
tout le temps plutôt queobject.attr
?Quant à sous le capot ... votre estimation est aussi bonne que la mienne. Sinon beaucoup mieux.
la source
C'est une vieille question, mais j'aimerais y mettre mes 2 cents.
Cependant,
del foo.bar
c'est plus élégant, parfois vous en aurez besoindelattr(foo, "bar")
. Disons que si vous disposez d'une interface de ligne de commande interactive qui permet à un utilisateur de supprimer dynamiquement n'importe quel membre de l'objet en tapant le nom , vous n'avez pas d'autre choix que d'utiliser ce dernier formulaire.la source