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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top