Чому закрити набір даних у GDAL Python?


17

Я досить часто в коді Python GDAL бачу, що люди закривають набори даних наприкінці сценарію. Чому має сенс закрити набір даних у Python GDAL? Чи є наслідки, якщо я цього не роблю?

import gdal

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

# close dataset
ds = None

Іноді деструктор C ++ робить інакше, ніж очищення (для деяких драйверів), наприклад, перерахування статистики. Це найкраща практика встановити значення None, все, що говорить bla2238, є правильним і AFAIK.

Відповіді:


15

Я не думаю, що це не має жодної мети в кінці сценарію, оскільки збирач сміття Python автоматично зробить те саме, коли сценарій вийде. Причина, яку ви можете зробити це, знаходиться в середині вашого сценарію, щоб відновити ресурси, що зберігаються, отримавши доступ до набору даних, видаліть блоки файлів тощо, щоб ви могли їх повторно використовувати.

del ds повинен мати той самий ефект, але більш чіткий щодо його намірів.

Більш пітонічним підходом було б використання withоператора , але GDAL / OGR не реалізує його. Однак є деякі обгортки GDAL / OGR, такі як Rasterio і Fiona .


2
Розглянемо об’єкти файлів Python. Ви відкриваєте один, f = open(filename)а один закриваєте f.close(). Ні del fабо f = None. Чому? Тому що те, що відбувається з об'єктами після того, як вони більше не посилаються, є деталізацією реалізації інтерпретатора і тому, що явне краще, ніж неявне ( python.org/dev/peps/pep-0020 ).
sgillies

1
Погоджено, але прив'язки Python GDAL не зовсім пітонічні. Є GDALClose()метод, який слід викликати, якщо ви хочете бути явним (я бачу, що Растеріо називає це внутрішньо ).
blah238

2
У Python GDALClose()не було реалізовано, але встановлення набору даних None(тобто ds = None) еквівалентно.
Артур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.