Si es absolutamente necesario es una pregunta incorrecta. La pregunta es si es una buena idea.
Como regla general en la programación, debe evitar hacer cosas raras y usar la mejor herramienta para el trabajo . Si algo tiene una forma explícita de liberar recursos, simplemente explique la versión y termine con ella:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Lo que quizás no sepa es que la with
cláusula en realidad invoca lógica adicional. Una with
cláusula requiere un administrador de contexto, que debe tener un método __enter__
(invocado cuando se ingresa el bloque) y __exit__
(invocado cuando se sale del bloque). En particular, el __exit__
método se invoca independientemente de si se produjo una excepción, lo que garantiza que el programa siempre libera el recurso incluso en caso de error. Esto le proporciona a su código documentación explícita de cuándo se adquiere un recurso y cuándo se libera, y garantiza que se pueda liberar un recurso lo antes posible.
Por el contrario, en realidad no puede depender del tiempo de ejecución para cerrarlo mágicamente de inmediato. Esto se debe a que la forma en que se cierra es invocando el destructor del objeto, lo que puede suceder o no de inmediato. Python no ofrece ninguna garantía acerca de cuándo se invoca un destructor, solo que eventualmente lo será cuando se recolecte basura del objeto. (Ver aquí .) Actualmente, Python está implementado para que ocurra tan pronto como ya no haya una referencia a un objeto. Pero es fácil propagar accidentalmente referencias a un objeto, y el tiempo de ejecución de Python puede cambiar.
Considere también el mantenimiento a largo plazo. No hay ninguna referencia a largo plazo ahora, pero lo que sucede en 6 meses cuando es necesario modificar el código de modo que no es una referencia? ¿Qué pasa si alguien más lo hace? Es posible que la persona que realiza el cambio no piense cambiar a un with
bloque ya que no hay uno ya allí. Haga que la limpieza de sus recursos sea un hábito y tendrá muchos menos problemas.
¿Realmente desea vincular su código a los detalles de implementación de la recolección de basura? ¿Desea tener que pensar constantemente si podría estar propagando accidentalmente una referencia a través de una excepción? No, tu no. Imagínese si eso sucedió cuando se invocó el script 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. Libere el recurso explícitamente. Guardar una línea de código no vale los riesgos de los problemas que puede causar. Los administradores de contexto son el mecanismo estándar para adquirir y liberar recursos en Python, y lo hacen muy bien.
La conclusión es que no liberarlo explícitamente es una mala idea.
Esto, por supuesto, supone que el código tiene alguna posibilidad de afectar a otra persona, como ponerlo en un script que alguien más necesitará ejecutar o mantener o podría retrasar la entrega de su trabajo si tiene que cerrar ArcMap por completo porque No puedo guardar tus cambios. Si eres el único que se verá afectado por un problema, entonces, por supuesto, vuela frente a las buenas prácticas todo lo que quieras.
da
cursores: sgillies.net/2011/02/01/get-with-it.html y help.arcgis.com/ es / arcgisdesktop / 10,0 / ayuda / index.html # // ... . En particular, mire los comentarios de @JasonScheirer al final del primer enlace.