Чи це абсолютно необхідно - це неправильне запитання. Питання в тому, чи це гарна ідея.
Як правило, в програмуванні вам слід уникати дивних речей і використовувати найкращий інструмент для роботи . Якщо щось має явний спосіб звільнення ресурсів, просто зробіть випуск явним і виконайте це:
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/ en / arcgisdesktop / 10.0 / help / index.html # //… . Зокрема, подивіться коментарі @JasonScheirer внизу першого посилання.