¿Cuándo es útil del en Python?

Resuelto Jason Baker asked hace 13 años • 22 respuestas

Realmente no se me ocurre ninguna razón por la que Python necesite la delpalabra clave (y la mayoría de los lenguajes parecen no tener una palabra clave similar). Por ejemplo, en lugar de eliminar una variable, se podría simplemente asignarla None. Y al eliminar de un diccionario, delse podría agregar un método.

¿Hay alguna razón para permanecer delen Python o es un vestigio de los días previos a la recolección de basura de Python?

Jason Baker avatar May 27 '11 08:05 Jason Baker
Aceptado

En primer lugar, puedes eliminar otras cosas además de las variables locales.

del list_item[4]
del dictionary["alpha"]

Ambos deberían ser claramente útiles. En segundo lugar, el uso delde una variable local aclara la intención. Comparar:

del foo

a

foo = None

Sé que en ese caso del foola intención es eliminar la variable del alcance. No está claro que foo = Noneesté haciendo eso. Si alguien simplemente asignara, foo = Nonepodría pensar que es un código inactivo. Pero sé instantáneamente lo que alguien que codifica del fooestaba tratando de hacer.

Winston Ewert avatar May 27 '2011 02:05 Winston Ewert

Hay esta parte de lo que delhace (de la Referencia del lenguaje Python ):

La eliminación de un nombre elimina la vinculación de ese nombre al espacio de nombres local o global.

La asignación Nonede un nombre no elimina la vinculación del nombre al espacio de nombres.

(Supongo que podría haber algún debate sobre si eliminar un enlace de nombre es realmente útil , pero esa es otra cuestión).

Greg Hewgill avatar May 27 '2011 01:05 Greg Hewgill

Un lugar que he encontrado delútil es limpiar variables extrañas en bucles for:

for x in some_list:
  do(x)
del x

Ahora puedes estar seguro de que x no estará definido si lo usas fuera del bucle for.

Jason Baker avatar Jun 03 '2015 15:06 Jason Baker

Eliminar una variable es diferente a establecerla en Ninguno

Eliminar nombres de variables delprobablemente sea algo que rara vez se usa, pero es algo que no se podría lograr de manera trivial sin una palabra clave. Si puede crear un nombre de variable escribiendo a=1, es bueno que, en teoría, pueda deshacerlo eliminando a.

Puede facilitar la depuración en algunos casos, ya que intentar acceder a una variable eliminada generará un NameError.

Puede eliminar atributos de instancia de clase

Python te permite escribir algo como:

class A(object):
    def set_a(self, a):
        self.a=a
a=A()
a.set_a(3)
if hasattr(a, "a"):
    print("Hallo")

Si elige agregar atributos dinámicamente a una instancia de clase, seguramente querrá poder deshacerlo escribiendo

del a.a
Bernhard avatar Jun 28 '2016 10:06 Bernhard

Hay un ejemplo específico de cuándo debe usar del(puede haber otros, pero este lo sé de inmediato) cuando lo usa sys.exc_info()para inspeccionar una excepción. Esta función devuelve una tupla, el tipo de excepción que se generó, el mensaje y un rastreo.

Los dos primeros valores suelen ser suficientes para diagnosticar un error y actuar en consecuencia, pero el tercero contiene toda la pila de llamadas entre el lugar donde se generó la excepción y el lugar donde se detectó la excepción. En particular, si haces algo como

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

el rastreo tbtermina en las locales de la pila de llamadas, creando una referencia circular que no se puede recolectar como basura. Por ello, es importante hacer:

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

para romper la referencia circular. En muchos casos en los que desea llamar sys.exc_info(), como con la magia de metaclase, el rastreo es útil, por lo que debe asegurarse de limpiarlo antes de poder abandonar el controlador de excepciones. Si no necesita el rastreo, debe eliminarlo inmediatamente o simplemente hacer:

exc_type, exc_value = sys.exc_info()[:2]

Para evitarlo todos juntos.

SingleNegationElimination avatar May 27 '2011 01:05 SingleNegationElimination