Che è meglio in python, del o delattr?
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.
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.