¿Qué es mejor en Python, o del delattr?
Pregunta
Esto puede ser tonto, pero ha sido molesta la parte posterior de mi cerebro durante un tiempo.
Python nos da dos armarios formas de eliminar los atributos de los objetos, la del palabra de mando y la delattr función incorporada. Yo prefiero delattr , ya que creo que es un poco más explícito:
del foo.bar
delattr(foo, "bar")
Pero me pregunto si puede haber diferencias bajo el capó entre ellos.
Solución
La primera es más eficiente que el segundo. del foo.bar
compila a dos instrucciones de código de bytes:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
mientras que delattr(foo, "bar")
lleva 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 ejecución ligeramente más rápido (pero no es una gran diferencia - .15 mu s en mi máquina).
Al igual que los otros han dicho, que realmente debería utilizar sólo la segunda forma cuando el atributo que va a eliminar se determina de forma dinámica.
[Editado para mostrar las instrucciones de código de bytes generados dentro de una función, en el que el compilador puede utilizar LOAD_FAST
y LOAD_GLOBAL
]
Otros consejos
- del es más explícito y eficiente;
- delattr permite eliminar atributo dinámico.
Consideremos 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 se puede hacer con del .
Sin lugar a dudas la primera. En mi opinión, esto es como preguntar si es mejor que foo.bar
getattr(foo, "bar")
, y yo no creo que nadie está pidiendo que pregunta:)
Es realmente una cuestión de preferencia, pero la primera es probablemente preferible. Yo sólo uso el segundo si no se conoce el nombre del atributo que va a eliminar antes de tiempo.
Al igual que getattr y setattr, delattr deberían utilizarse sólo cuando el nombre del atributo es desconocido.
En ese sentido, es más o menos equivalente a varias características de Python que se utilizan para acceder a la funcionalidad integrada en un nivel inferior de lo que normalmente tiene disponible, tales como __import__
en lugar de import
y operator.add
en lugar de +
No está seguro sobre el funcionamiento interno, sino de una reutilización de código y no tenga una perspectiva compañero de trabajo tirón, usar del. Es más claro y entendido por las personas procedentes de otros idiomas.
Si cree delattr
es más explícito, entonces ¿por qué no se utiliza getattr
todo el tiempo en lugar de object.attr
?
En cuanto a bajo el capó ... su conjetura es tan buena como la mía. Si no es significativamente mejor.
Es una vieja pregunta, pero me gustaría poner mis 2 centavos en.
Sin embargo, del foo.bar
es más elegante, a veces tendrá que delattr(foo, "bar")
. Decir, si tiene una interfaz de línea de comandos interactiva que permite a un usuario eliminar dinámicamente cualquier miembro en el objeto por a escribir el nombre , entonces no tienen más remedio que utilizar la última forma.