Ob es absolut notwendig ist, ist die falsche Frage. Die Frage ist, ob es eine gute Idee ist.
In der Regel sollten Sie beim Programmieren seltsame Dinge vermeiden und das beste Werkzeug für den Job verwenden . Wenn es einen expliziten Weg gibt, Ressourcen freizugeben, machen Sie die Freigabe einfach explizit und machen Sie es damit:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Was Sie möglicherweise nicht wissen, ist, dass die with
Klausel tatsächlich zusätzliche Logik aufruft. Für eine with
Klausel ist ein Kontextmanager erforderlich, der eine Methode (bei __enter__
Eingabe __exit__
des Blocks aufgerufen ) und (beim Beenden des Blocks aufgerufen) haben muss. Insbesondere wird die __exit__
Methode unabhängig davon aufgerufen, ob eine Ausnahme aufgetreten ist. Dadurch wird sichergestellt, dass das Programm die Ressource auch bei Fehlern immer freigibt. Dies gibt Ihrem Code eine explizite Dokumentation darüber, wann eine Ressource erworben und wann sie freigegeben wird, und stellt sicher, dass eine Ressource so schnell wie möglich freigegeben werden kann.
Im Gegensatz dazu können Sie sich nicht wirklich darauf verlassen, dass die Laufzeitumgebung sie sofort magisch für Sie schließt. Dies liegt daran, dass das Objekt geschlossen wird, indem der Destruktor des Objekts aufgerufen wird. Dies kann sofort geschehen oder auch nicht. Python übernimmt keine Garantie dafür, wann ein Destruktor aufgerufen wird, sondern nur dafür, dass das Objekt irgendwann müllsammelbar ist. (Siehe hier .) Derzeit ist Python so implementiert, dass es geschieht, sobald kein Verweis mehr auf ein Objekt vorhanden ist. Es ist jedoch leicht, versehentlich Verweise auf ein Objekt zu verbreiten, und die Laufzeit von Python kann sich ändern.
Berücksichtigen Sie auch die langfristige Wartung. Es gibt keinen langfristigen Bezug auf es jetzt, aber was in 6 Monaten passiert , wenn Sie den Code ändern müssen , so dass es ist eine Referenz? Was ist, wenn es jemand anderes tut? Die Person, die die Änderung vornimmt, denkt möglicherweise nicht daran, zu einem with
Block zu wechseln, da noch keiner vorhanden ist. Machen Sie es sich zur Gewohnheit , Ihre Ressourcen zu bereinigen , und Sie werden weitaus weniger Probleme damit haben.
Möchten Sie Ihren Code wirklich an Implementierungsdetails der Garbage Collection binden? Möchten Sie ständig darüber nachdenken müssen, ob Sie möglicherweise versehentlich einen Verweis über eine Ausnahme verbreiten? Nein, tust du nicht. Stellen Sie sich vor, dass dies passiert ist, als das Skript in ArcMap aufgerufen wurde. Der Benutzer wäre gezwungen, den gesamten Prozess zu schließen, nur um die Datei freizugeben. Versetze dich also nicht in diese Position. Geben Sie die Ressource explizit frei. Das Speichern einer Codezeile ist das Risiko von Problemen nicht wert. Kontext-Manager sind der Standardmechanismus für das Erfassen und Freigeben von Ressourcen in Python, und sie machen das sehr gut.
Das Fazit ist, dass es eine schlechte Idee ist, es nicht explizit zu veröffentlichen.
Dies setzt natürlich voraus, dass der Code die Möglichkeit hat, eine andere Person zu beeinflussen, z. B. das Einfügen in ein Skript, das eine andere Person ausführen oder warten muss, oder die Bereitstellung Ihrer Arbeit verzögert sich möglicherweise, wenn Sie ArcMap vollständig schließen müssen Änderungen können nicht gespeichert werden. Wenn Sie der Einzige sind, der von einem Problem betroffen ist, sollten Sie sich auf jeden Fall den guten Praktiken stellen, die Sie wollen.
da
: sgillies.net/2011/02/01/get-with-it.html und help.arcgis.com/ de / arcgisdesktop / 10.0 / help / index.html # //… . Beachten Sie insbesondere die Kommentare von @JasonScheirer am Ende des ersten Links.