¿Por qué cerrar un conjunto de datos en GDAL Python?


17

Veo con bastante frecuencia en el código Python GDAL que las personas cierran conjuntos de datos al final de su secuencia de comandos. ¿Por qué tiene sentido cerrar un conjunto de datos en Python GDAL? ¿Hay alguna consecuencia si no lo hago?

import gdal

# open dataset
ds = gdal.Open('test.tif')

# close dataset
ds = None

A veces, el destructor de C ++ hace otras cosas además de limpiar (para algunos controladores), como volver a calcular las estadísticas. Es una buena práctica establecer Ninguno, todo lo que blah238 dice es correcto también AFAIK.

Respuestas:


15

No creo que esto tenga ningún propósito al final del script, ya que el recolector de basura Python hará lo mismo automáticamente cuando el script salga. La razón por la que puede querer hacerlo es en el medio de su secuencia de comandos, para recuperar los recursos almacenados al acceder al conjunto de datos, eliminar bloqueos de archivos, etc. para poder reutilizarlos.

del ds debería tener el mismo efecto pero es más claro en cuanto a su intención.

El enfoque más pitónico sería usar una withdeclaración , pero GDAL / OGR no la implementa. Sin embargo, hay algunos envoltorios GDAL / OGR como Rasterio y Fiona que sí.


2
Considere los objetos de archivo Python. Abre uno con f = open(filename)y cierra uno con f.close(). No del fo f = None. ¿Por qué? Porque lo que sucede a los objetos después de que ya no se hace referencia a ellos es un detalle de la implementación del intérprete y porque explícito es mejor que implícito ( python.org/dev/peps/pep-0020 ).
sgillies

1
De acuerdo, pero los enlaces de Python de GDAL no son exactamente pitónicos. Hay un GDALClose()método que debería llamarse si desea ser explícito (veo que Rasterio llama a esto internamente ).
blah238

2
En Python, GDALClose()no se ha implementado, pero establecer el conjunto de datos en None(es decir, ds = None) es equivalente.
Arthur
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.