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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top