Является ли это абсолютно необходимым, это неправильный вопрос. Вопрос в том, хорошая ли это идея.
Как правило, в программировании вы должны избегать странных вещей и использовать лучший инструмент для этой работы . Если у чего-то есть явный способ освобождения ресурсов, просто сделайте релиз явным и покончите с этим:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
То, что вы можете не знать, это то, что with
предложение фактически вызывает дополнительную логику. Предложение with
требует диспетчера контекста, который должен иметь __enter__
(вызывается при входе в блок) и __exit__
(вызывается при выходе из блока) метод. В частности, __exit__
метод вызывается независимо от того, произошло ли исключение, гарантируя, что программа всегда освобождает ресурс даже при ошибке. Это дает вашему коду явную документацию о том, когда ресурс приобретен и когда он выпущен, и гарантирует, что ресурс может быть освобожден как можно скорее.
В отличие от этого, вы не можете зависеть от времени выполнения, чтобы магически закрыть его немедленно для вас. Это потому, что он закрывается, вызывая деструктор объекта, что может произойти или не произойти немедленно. Python не дает никаких гарантий относительно того, когда деструктор вызывается, а только в том случае, когда объект будет собираться мусором. (См. Здесь .) В настоящее время Python реализован так, что это происходит, как только перестает быть ссылка на объект. Но случайно распространить ссылки на объект легко, и среда выполнения Python может измениться.
Также рассмотрите долгосрочное обслуживание. Там нет долгосрочной ссылки на него сейчас, но то , что происходит в течение 6 месяцев , когда вам нужно изменить код таким образом, что это ссылка? Что если кто-то еще это сделает? Человек, делающий изменение, может не подумать о переключении на with
блок, так как там его еще нет. Сделайте очистку своих ресурсов привычкой , и у вас будет гораздо меньше проблем с этим.
Вы действительно хотите связать свой код с деталями реализации сборки мусора? Хотите ли вы постоянно думать о том, можете ли вы случайно распространять ссылку через исключение? Нет, ты не Представьте, если это произошло, когда скрипт был вызван в ArcMap. Пользователь будет вынужден закрыть весь процесс, только чтобы освободить файл. Так что не ставьте себя в такое положение. Освободите ресурс явно. Сохранение одной строки кода не стоит рисков, связанных с этими проблемами. Менеджеры контекста являются стандартным механизмом получения и выпуска ресурсов в Python, и они делают это очень хорошо.
Суть в том, что не публиковать это явно плохая идея.
Это, конечно, предполагает, что код имеет некоторую возможность повлиять на кого-то другого, например, поместить его в сценарий, который кому-то еще нужно будет запустить или поддерживать, или это может отложить доставку вашей работы, если вам придется полностью закрыть ArcMap, потому что вы не могу сохранить ваши изменения. Если вы единственный, кто будет затронут проблемой, то во что бы то ни стало бросайте вызов хорошей практике.
da
: sgillies.net/2011/02/01/get-with-it.html и help.arcgis.com/ ru / arcgisdesktop / 10.0 / help / index.html # //… . В частности, посмотрите на комментарии @JasonScheirer внизу первой ссылки.