¿Cuándo es útil del en Python?
Realmente no se me ocurre ninguna razón por la que Python necesite la del
palabra 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, del
se podría agregar un método.
¿Hay alguna razón para permanecer del
en Python o es un vestigio de los días previos a la recolección de basura de Python?
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 del
de una variable local aclara la intención. Comparar:
del foo
a
foo = None
Sé que en ese caso del foo
la intención es eliminar la variable del alcance. No está claro que foo = None
esté haciendo eso. Si alguien simplemente asignara, foo = None
podría pensar que es un código inactivo. Pero sé instantáneamente lo que alguien que codifica del foo
estaba tratando de hacer.
Hay esta parte de lo que del
hace (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 None
de 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).
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.
Eliminar una variable es diferente a establecerla en Ninguno
Eliminar nombres de variables del
probablemente 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
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 tb
termina 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.