Perché chiudere un set di dati in GDAL Python?


17

Vedo abbastanza spesso nel codice GDAL di Python che le persone chiudono i set di dati alla fine del loro script. Perché ha senso chiudere un set di dati in Python GDAL? Ci sono conseguenze se non lo faccio?

import gdal

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

# close dataset
ds = None

A volte il distruttore C ++ fa cose diverse dalla pulizia (per alcuni driver), come ricalcolare le statistiche. È buona norma impostare su Nessuno, tutto ciò che blah238 dice sia corretto anche AFAIK.

Risposte:


15

Non credo che questo abbia uno scopo alla fine dello script, poiché il garbage collector di Python farà automaticamente la stessa cosa quando lo script uscirà. Il motivo per cui potresti voler farlo è nel mezzo dello script, per recuperare le risorse trattenute accedendo al set di dati, rimuovere i blocchi di file, ecc. In modo da poterle riutilizzare.

del ds dovrebbe avere lo stesso effetto ma è più chiaro del suo intento.

L'approccio più Pythonic sarebbe usare withun'istruzione , ma GDAL / OGR non la implementa. Tuttavia, ci sono alcuni wrapper GDAL / OGR come Rasterio e Fiona che lo fanno.


2
Considera gli oggetti file Python. Ne apri uno con f = open(filename)e chiudi uno con f.close(). No del fo f = None. Perché? Perché ciò che accade agli oggetti dopo che non sono più referenziati è un dettaglio dell'implementazione dell'interprete e perché esplicito è meglio di implicito ( python.org/dev/peps/pep-0020 ).
sgillies,

1
D'accordo, ma i collegamenti GDAL Python non sono esattamente Pythonic. C'è un GDALClose()metodo che dovrebbe essere chiamato se vuoi essere esplicito (vedo che Rasterio lo chiama internamente ).
blah238,

2
In Python, GDALClose()non è stato implementato, ma l'impostazione del set di dati su None(cioè, ds = None) è equivalente.
Arthur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.