Po co zamykać zestaw danych w GDAL Python?

17

W kodzie Python GDAL dość często widzę, że ludzie zamykają zestawy danych na końcu skryptu. Dlaczego warto zamykać zestaw danych w Pythonie GDAL? Czy są jakieś konsekwencje, jeśli tego nie zrobię?

import gdal

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

# close dataset
ds = None
ustroetz
źródło
Czasami destruktor C ++ wykonuje czynności inne niż czyszczenie (w przypadku niektórych sterowników), takie jak statystyki przeliczania. Dobrą praktyką jest ustawienie na Brak, wszystko, co mówi blah238, jest również poprawne AFAIK.

Odpowiedzi:

15

Nie sądzę, aby miało to jakiś cel na końcu skryptu, ponieważ moduł czyszczący Pythona zrobi to samo automatycznie po zakończeniu skryptu. Powodem, dla którego warto to zrobić, jest znajdowanie się w środku skryptu, aby odzyskać posiadane zasoby, uzyskując dostęp do zestawu danych, usunąć blokady plików itp., Aby móc ich ponownie użyć.

del ds powinien mieć ten sam efekt, ale jest wyraźniejszy co do jego intencji.

Bardziej pythonowym podejściem byłoby użycie withinstrukcji , ale GDAL / OGR jej nie implementuje. Są jednak takie opakowania GDAL / OGR, jak Rasterio i Fiona .

blah238
źródło
2
Rozważ obiekty plików Python. Otwierasz jeden za pomocą f = open(filename)i zamykasz jeden za pomocą f.close(). Nie del flub f = None. Dlaczego? Ponieważ to, co dzieje się z obiektami po ich odwołaniu, jest szczegółem implementacji interpretera i ponieważ jawne jest lepsze niż niejawne ( python.org/dev/peps/pep-0020 ).
sgillies,
1
Zgadzam się, ale powiązania GDAL w języku Python nie są dokładnie w języku Python. Istnieje GDALClose()metoda, którą należy wywołać, jeśli chcesz być jawny (widzę, że Rasterio wywołuje to wewnętrznie ).
blah238,
2
W Pythonie GDALClose()nie został zaimplementowany, ale ustawienie zestawu danych na None(tj. ds = None) Jest równoważne.
Arthur