Domanda

Questo può essere stupido, ma è stato fastidioso sul retro del mio cervello per un po '.

Python ci dà due built-in modi per cancellare gli attributi dagli oggetti, il del parola di comando e la delattr la funzione built-in. Io preferisco delattr perché penso che sia un po 'più esplicito:

del foo.bar
delattr(foo, "bar")

Ma mi chiedo se ci potrebbe essere sotto il cofano differenze tra di loro.

È stato utile?

Soluzione

Il primo è più efficiente rispetto alla seconda. del foo.bar compila in due istruzioni bytecode:

  2           0 LOAD_FAST                0 (foo)
              3 DELETE_ATTR              0 (bar)

mentre delattr(foo, "bar") prende cinque:

  2           0 LOAD_GLOBAL              0 (delattr)
              3 LOAD_FAST                0 (foo)
              6 LOAD_CONST               1 ('bar')
              9 CALL_FUNCTION            2
             12 POP_TOP             

Questo si traduce nella prima esecuzione un po ' più veloce (ma non è una differenza enorme - .15 ms sulla mia macchina).

Come gli altri hanno detto, si dovrebbe davvero utilizzare solo la seconda forma quando l'attributo che si sta cancellando è determinata in modo dinamico.

[A cura di mostrare le istruzioni bytecode generato all'interno di una funzione, in cui il compilatore può utilizzare LOAD_FAST e LOAD_GLOBAL]

Altri suggerimenti

  • del è più esplicita ed efficiente;
  • delattr consente dinamica attributo cancellazione.

Si considerino i seguenti esempi:

for name in ATTRIBUTES:
    delattr(obj, name)

o

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)

Non si può farlo con del .

Senza dubbio il primo. A mio avviso questo è come chiedersi se è meglio di foo.bar getattr(foo, "bar"), e io non credo che nessuno sta chiedendo a questa domanda:)

E 'davvero una questione di preferenze, ma la prima è probabilmente preferibile. Mi piacerebbe utilizzare solo la seconda uno se non si conosce il nome dell'attributo che si sta eliminando prima del tempo.

Proprio come getattr e setattr, delattr dovrebbe essere utilizzato solo quando il nome dell'attributo è sconosciuto.

In questo senso, è più o meno equivalente a diverse funzioni Python che vengono utilizzati per accedere a funzionalità built-in a un livello inferiore di quello che normalmente ha a disposizione, come ad esempio __import__ invece di import e operator.add invece di +

Non sono sicuro circa il funzionamento interno, ma da un riusabilità del codice e non essere una prospettiva collega coglione, utilizzare del. E 'più chiaro e comprensibile per le persone provenienti da altre lingue.

Se si pensa delattr è più esplicito, allora perché non utilizzato getattr tutto il tempo, piuttosto che object.attr?

Per quanto riguarda sotto il cofano ... il tuo indovinare è buono come il mio. Se non è significativamente migliore.

Si tratta di una vecchia questione, ma vorrei mettere i miei 2 centesimi.

Anche se, del foo.bar è più elegante, a volte è necessario delattr(foo, "bar"). Dire, se si dispone di un'interfaccia a riga di comando interattivo che consente a un utente di eliminare in modo dinamico qualsiasi membro nell'oggetto da digitando il nome , allora avete altra scelta che usare quest'ultima forma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top