Si es absolutamente necesario es la pregunta incorrecta para hacer. La pregunta es si es una buena idea.
Como regla en programación, deberías evitar hacer cosas extrañas y usar la mejor herramienta para el trabajo. Si algo tiene una forma explícita de liberar recursos, simplemente haz la liberación explícita y listo:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Lo que quizás no sepas es que la cláusula with
en realidad invoca lógica adicional. Una cláusula with
requiere un administrador de contexto, que debe tener un método __enter__
(invocado cuando se ingresa al bloque) y un método __exit__
(invocado cuando se sale del bloque). En particular, el método __exit__
se invoca independientemente de si ocurrió una excepción, asegurando que el programa siempre libere el recurso incluso en caso de error. Esto le da a tu código una documentación explícita de cuándo se adquiere un recurso y cuándo se libera, y asegura que un recurso se pueda liberar tan pronto como sea posible.
Por el contrario, en realidad no puedes depender de que se cierre de inmediato automáticamente. Esto se debe a que la forma en que se cierra es invocando el destructor del objeto, lo que puede o no ocurrir de inmediato. Python no ofrece garantías sobre cuándo se invoca un destructor, sólo que eventualmente lo hará cuando el objeto sea recolectado por la basura. (Ver aquí.) Actualmente, Python está implementado de modo que sucede tan pronto como ya no hay una referencia al objeto. Pero es fácil propagar referencias accidentalmente a un objeto, y el tiempo de ejecución de Python podría cambiar.
También considera el mantenimiento a largo plazo. Ahora no hay una referencia a largo plazo, pero ¿qué sucede en 6 meses cuando necesites modificar el código para que sí haya una referencia? ¿Qué pasa si alguien más lo hace? La persona que realiza el cambio puede que no piense en cambiar a un bloque with
ya que no hay uno presente. Hacer de la limpieza de tus recursos un hábito te evitará muchos problemas.
¿Realmente quieres atar tu código a los detalles de implementación de la recolección de basura? ¿Quieres tener que pensar constantemente si podrías estar propagando accidentalmente una referencia a través de una excepción? No, no lo quieres. Imagina si eso sucediera cuando el script fuera invocado en ArcMap. El usuario se vería obligado a cerrar todo el proceso solo para liberar el archivo. Así que no te pongas en esa posición. Libera el recurso explícitamente. No vale la pena arriesgarte a problemas que puede causar el guardar una línea de código. Los administradores de contexto son el mecanismo estándar para adquirir y liberar recursos en Python, y lo hacen muy bien.
En resumen, no liberarlo explícitamente es una mala idea.
Esto, por supuesto, asume que el código tiene alguna posibilidad de afectar a alguien más, como ponerlo en un script que alguien más tendrá que ejecutar o mantener, o podría retrasar la entrega de tu trabajo si tienes que cerrar ArcMap por completo porque no puedes guardar tus cambios. Si eres el único que se verá afectado por un problema, entonces adelante, desatiende las buenas prácticas todo lo que quieras.
1 votos
Gran pregunta. ¿Estás tratando de manejar bloqueos de esquema? Hay algunos artículos antiguos (en su mayoría desactualizados) sobre un tema similar, aunque no puedo encontrar una fuente definitiva sobre los nuevos cursores
da
: sgillies.net/2011/02/01/get-with-it.html y help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…. En particular, mira los comentarios de @JasonScheirer al final del primer enlace.