lista - ¿Qué es mejor en python, del o delattr?
del variable python (8)
Esto puede ser una tontería, pero ha estado molestando la parte posterior de mi cerebro por un tiempo.
Python nos brinda dos formas integradas para eliminar atributos de objetos, la palabra del comando del del y la función incorporada delattr . Prefiero Delattr porque creo que es un poco más explícito:
del foo.bar
delattr(foo, "bar")
Pero me pregunto si podría haber diferencias bajo el capó entre ellos.
Al igual que getattr y setattr, delattr solo debe usarse cuando el nombre del atributo es desconocido.
En ese sentido, es más o menos equivalente a varias funciones de Python que se utilizan para acceder a la funcionalidad incorporada en un nivel inferior al que normalmente tiene disponible, como __import__
lugar de import
y operator.add
lugar de +
El primero es más eficiente que el segundo. del foo.bar
compila a dos instrucciones de bytecode:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
mientras que delattr(foo, "bar")
toma cinco:
2 0 LOAD_GLOBAL 0 (delattr)
3 LOAD_FAST 0 (foo)
6 LOAD_CONST 1 (''bar'')
9 CALL_FUNCTION 2
12 POP_TOP
Esto se traduce en la primera carrera un poco más rápido (pero no es una gran diferencia - .15 μs en mi máquina).
Como han dicho los demás, en realidad solo debería usar el segundo formulario cuando el atributo que está eliminando se determina dinámicamente.
[Editado para mostrar las instrucciones de bytecode generadas dentro de una función, donde el compilador puede usar LOAD_FAST
y LOAD_GLOBAL
]
Es realmente una cuestión de preferencia, pero la primera es probablemente preferible. Solo usaría el segundo si no sabes el nombre del atributo que estás eliminando antes de tiempo.
Es una vieja pregunta, pero me gustaría poner mis 2 centavos.
Sin embargo, del foo.bar
es más elegante, a veces necesitará delattr(foo, "bar")
. Supongamos que si tiene una interfaz de línea de comando interactiva que permite a un usuario eliminar dinámicamente cualquier miembro del objeto escribiendo el nombre , entonces no tiene más remedio que usar el último formulario.
Incuestionablemente el primero. En mi opinión, esto es como preguntar si foo.bar
es mejor que getattr(foo, "bar")
, y no creo que nadie haga esa pregunta :)
No estoy seguro sobre el funcionamiento interno, pero desde una reutilización de código y no ser una perspectiva de compañero de trabajo jerk, use del. Es más claro y más comprensible para las personas que vienen de otros idiomas también.
Si crees que delattr
es más explícito, ¿por qué no utilizas getattr
todo el tiempo en lugar de object.attr
?
En cuanto a debajo del capó ... tu conjetura es tan buena como la mía. Si no es significativamente mejor.
- del es más explícito y eficiente;
- delattr permite la eliminación dinámica de atributos.
Considere los siguientes ejemplos:
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)
No puedes hacerlo con del .