Se è assolutamente necessario è la domanda sbagliata da porre. La domanda è se è una buona idea.
Come regola di programmazione, dovresti evitare di fare cose strane e utilizzare lo strumento migliore per il lavoro . Se qualcosa ha un modo esplicito di rilasciare risorse, basta rendere esplicito il rilascio e completare l'operazione:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Ciò di cui potresti non essere a conoscenza è che la with
clausola invoca effettivamente una logica aggiuntiva. Una with
clausola richiede un gestore di contesto, che deve avere un metodo __enter__
(invocato quando viene inserito il blocco) e __exit__
(invocato quando si esce dal blocco). In particolare, il __exit__
metodo viene invocato indipendentemente dal fatto che si sia verificata un'eccezione, assicurando che il programma rilasci sempre la risorsa anche in caso di errore. Ciò fornisce al tuo codice la documentazione esplicita di quando viene acquisita una risorsa e quando viene rilasciata e garantisce che una risorsa possa essere rilasciata il più presto possibile.
Al contrario, in realtà non puoi dipendere dal runtime per chiuderlo magicamente immediatamente per te. Questo perché il modo in cui viene chiuso è invocando il distruttore dell'oggetto, che può accadere o meno immediatamente. Python non fornisce alcuna garanzia su quando viene invocato un distruttore, solo che lo sarà alla fine quando l'oggetto viene raccolto. (Vedi qui .) Attualmente, Python è implementato in modo tale che accada non appena non c'è più un riferimento a un oggetto. Ma è facile propagare accidentalmente i riferimenti a un oggetto e il runtime di Python potrebbe cambiare.
Considera anche la manutenzione a lungo termine. Non ci sono riferimenti a lungo termine ora, ma cosa succede in 6 mesi quando è necessario modificare il codice in modo che ci sia un riferimento? E se lo facesse qualcun altro? La persona che apporta la modifica potrebbe non pensare di passare a un with
blocco poiché non ce n'è già uno lì. Trasforma le tue risorse in un'abitudine e avrai molti meno problemi.
Vuoi davvero legare il tuo codice ai dettagli di implementazione della garbage collection? Vuoi pensare costantemente se potresti propagare accidentalmente un riferimento tramite un'eccezione? No, non lo fai. Immagina se ciò accadesse quando lo script è stato invocato in ArcMap. L'utente sarebbe costretto a chiudere l'intero processo solo per rilasciare il file. Quindi non metterti in quella posizione. Rilasciare la risorsa esplicitamente. Salvare una riga di codice non vale i rischi di problemi che può causare. I gestori di contesto sono il meccanismo standard per l'acquisizione e il rilascio di risorse in Python e lo fanno molto bene.
La linea di fondo è che non rilasciarlo esplicitamente è una cattiva idea.
Questo, ovviamente, presuppone che il codice abbia qualche possibilità di influenzare qualcun altro, come inserirlo in uno script che qualcun altro dovrà eseguire o mantenere o potrebbe ritardare la consegna del tuo lavoro se devi chiudere ArcMap fino in fondo perché impossibile salvare le modifiche. Se sei l'unico a essere colpito da un problema, allora vola di fronte alle buone pratiche tutto ciò che desideri.
da
cursori: sgillies.net/2011/02/01/get-with-it.html e help.arcgis.com/ it / arcgisdesktop / 10.0 / help / index.html # //… . In particolare, guarda i commenti di @JasonScheirer nella parte inferiore del primo link.