Wenn es am besten ist, Cursor mit einer with-Anweisung zu öffnen, um sicherzustellen, dass sie gelöscht werden, gehen Sie wie folgt vor:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
Dann, wenn ein Cursor als Iterable in einem Verständnis wie folgt verwendet wird:
d = {k:v for (k,v) in arcpy.da.SearchCursor(fc,fields)}
Muss der Cursor gelöscht werden, nachdem er im Verständnis verwendet wurde?
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.Antworten:
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:
Was Sie möglicherweise nicht wissen, ist, dass die
with
Klausel tatsächlich zusätzliche Logik aufruft. Für einewith
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.
quelle
Nein, es ist nicht notwendig, eine zu löschen,
cursor
nachdem Sie sie in einem Verständnis verwendet hat. Acursor
ist eine Instanz einer Klasse, die ein Objekt ist (alles in Python ist ein Objekt). Jede Python-Sitzung hat eine,namespace
die Verweise auf alle Objekte in der Sitzung enthält. Stellen Sie sich dies wie ein Wörterbuch vor, in dem die Schlüssel Verweise auf jedes Objekt und die Werte die Objekte selbst sind. Wenn der 'Referenzzähler' - die Anzahl der Schlüssel, die sich auf dieses Objekt beziehen - auf Null fällt, wird das Objekt entfernt und der Speicher neu zugewiesen . Wenn Siecursor
in einem Verständnis ein verwenden, ist im Namespace kein Verweis auf dieses Objekt vorhanden. Nachdem das Verständnis abgeschlossen ist, wird das Objekt gelöscht.Es gibt keinen Eintrag im Namespace und daher muss nichts gelöscht werden. ESRI veranschaulicht diese Syntax auch in Beispiel 2 .
Zur weiteren Klärung, ob Sie ausführen:
Im Verzeichnis wird eine .lock-Datei angezeigt (überprüfen Sie Ihren Dateiexplorer). Der Verweis auf den Cursor lautet
a
, wodurch diecursor
(und daher die Sperre) so lange bestehena
bleibt, bis sie gelöscht wird. Also, wenn Sie dann laufen:Der Eintrag im Namespace wird entfernt und die Sperre aufgehoben (die .lock-Datei verschwindet). Wenn du läufst:
Entweder wird keine Sperrdatei angezeigt, oder sie wird ausgeblendet, wenn der Befehl ausgeführt wird. Ohne einen Eintrag im Namespace ist der
cursor
nicht persistent.t
bezieht sich auf die soeben erstellte Liste, nicht auf diecursor
, mit der sie erstellt wurde.Zusammenfassend müssen Sie sich nur Gedanken über das Löschen machen,
cursors
wenn sie einen Verweis im Namespace haben (dh wenn Sie sie einer Variablen zugewiesen haben, wiea
im obigen Beispiel).quelle
Das Sperren mit arcpy.da-Cursorn entspricht im Wesentlichen dem Sperren mit den ursprünglichen arcpy-Cursorn.
Nachdem Sie Ihren Code getestet haben und wie Gberard betont hat, gibt es nach dem Ende des Verständnisses keinen Verweis auf den Cursor.
Außerdem gibt es keine Sperren für die Feature-Class, nachdem das Verständnis beendet ist.
quelle