Jeśli najlepiej jest otwierać kursory za pomocą instrukcji with, aby upewnić się, że zostało ono usunięte, tak:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
Następnie, jeśli kursor jest używany jako iterowalny w takim rozumieniu:
d = {k:v for (k,v) in arcpy.da.SearchCursor(fc,fields)}
Czy konieczne jest usunięcie kursora po użyciu go w zrozumieniu?
da
kursorów: sgillies.net/2011/02/01/get-with-it.html i help.arcgis.com/ pl / arcgisdesktop / 10.0 / help / index.html # //… . W szczególności spójrz na komentarze @JasonScheirer na dole pierwszego linku.Odpowiedzi:
Pytanie, czy jest to absolutnie konieczne, jest złym pytaniem. Pytanie brzmi, czy to dobry pomysł.
Z reguły w programowaniu należy unikać robienia dziwnych rzeczy i używać najlepszego narzędzia do pracy . Jeśli coś ma jawny sposób na uwalnianie zasobów, po prostu wyraź wyraźne wydanie i gotowe:
To, czego możesz nie być świadomy, to fakt, że
with
klauzula faktycznie wywołuje dodatkową logikę.with
Klauzula wymaga menedżera kontekstowe, które musi posiadać__enter__
(wywoływana gdy blok jest wpisany) i__exit__
(wywoływana gdy blok jest zakończony) metody. W szczególności__exit__
metoda jest wywoływana niezależnie od tego, czy wystąpił wyjątek, dzięki czemu program zawsze zwalnia zasób nawet w przypadku błędu. Daje to Twojemu kodowi wyraźną dokumentację, kiedy zasób jest nabywany i kiedy jest zwalniany, i zapewnia, że zasób może zostać zwolniony jak najszybciej.Z drugiej strony, nie można tak naprawdę polegać na środowisku uruchomieniowym, aby magicznie zamknąć je natychmiast. Jest tak, ponieważ sposób, w jaki się zamyka, polega na wywołaniu destruktora obiektu, co może, ale nie musi, nastąpić natychmiast. Python nie daje żadnych gwarancji, kiedy wywoływany jest destruktor, tylko że ostatecznie będzie, kiedy obiekt zostanie wyrzucony. (Zobacz tutaj .) Obecnie Python jest zaimplementowany tak, że dzieje się tak szybko, jak tylko nie ma już odwołania do obiektu. Ale łatwo jest przypadkowo propagować odniesienia do obiektu, a środowisko wykonawcze Pythona może się zmienić.
Weź również pod uwagę długoterminową konserwację. Nie ma długoterminowe odniesienie do niej teraz, ale co się stanie w ciągu 6 miesięcy, gdy trzeba zmodyfikować kod tak, że nie jest odniesienie? Co jeśli ktoś to zrobi? Osoba dokonująca zmiany może nie myśleć o przejściu na
with
blok, ponieważ już go nie ma. Spraw, by sprzątanie zasobów stało się nawykiem , a będziesz miał z tym o wiele mniej problemów.Czy naprawdę chcesz powiązać swój kod ze szczegółami implementacji odśmiecania? Czy chcesz stale zastanawiać się, czy przypadkiem nie propagujesz referencji za pośrednictwem wyjątku? Nie, ty nie. Wyobraź sobie, że tak się stało, gdy skrypt został wywołany w ArcMap. Użytkownik byłby zmuszony zamknąć cały proces tylko w celu zwolnienia pliku. Więc nie stawiaj się w tej pozycji. Zwolnij zasób jawnie. Zapisanie jednej linii kodu nie jest warte ryzyka problemów, które może powodować. Menedżery kontekstu są standardowym mechanizmem pozyskiwania i zwalniania zasobów w Pythonie i robią to bardzo dobrze.
Najważniejsze jest to, że nieudostępnianie go jawnie jest złym pomysłem.
Zakłada to oczywiście, że kod ma pewne możliwości wpływania na kogoś innego, na przykład umieszczenie go w skrypcie, który ktoś będzie musiał uruchomić lub utrzymywać, lub może opóźnić dostarczenie pracy, jeśli musisz całkowicie zamknąć ArcMap, ponieważ nie mogę zapisać twoich zmian. Jeśli jesteś jedynym, który będzie miał wpływ na problem, to na wszelki wypadek, uciekaj w obliczu dobrych praktyk, jak chcesz.
źródło
Nie, nie trzeba usuwać
cursor
po użyciu go w zrozumieniu. Acursor
jest instancją klasy, która jest obiektem (wszystko w Pythonie jest obiektem). Każda sesja Pythonanamespace
zawiera odwołania do wszystkich obiektów w sesji - pomyśl o tym jak o słowniku, w którym klucze są odwołaniami do każdego obiektu, a wartościami są same obiekty. Kiedy „liczba referencji” - liczba kluczy odnoszących się do tego obiektu - spada do zera, obiekt jest usuwany, a pamięć ponownie przydzielana . Kiedy używaszcursor
w rozumieniu, nie ma odniesienia do tego obiektu w przestrzeni nazw. Po zakończeniu zrozumienia obiekt zostanie usunięty.W przestrzeni nazw nie ma wpisu i dlatego nie trzeba niczego usuwać. ESRI ilustruje również tę składnię w przykładzie 2 tutaj .
W celu dalszego wyjaśnienia, jeśli uruchomisz:
Zobaczysz plik .lock pojawi się w katalogu (sprawdź eksplorator plików). Odniesieniem do kursora jest to
a
, co spowoduje, żecursor
(a zatem i blokada) pozostanie do momentua
usunięcia. Kiedy więc uruchomisz:Wpis w przestrzeni nazw zostanie usunięty, a zamek zwolni się (plik .lock zniknie). Jeśli uruchomisz:
Plik blokady albo nie zobaczysz, albo zniknie po zakończeniu wykonywania polecenia. Bez wpisu w przestrzeni nazw
cursor
nie jest trwały.t
odnosi się do właśnie utworzonej listy, a niecursor
do jej utworzenia.Podsumowując, musisz się martwić tylko o usunięcie,
cursors
gdy mają odwołanie w przestrzeni nazw (tj. Kiedy przypisałeś je do zmiennej, jaka
w powyższym przykładzie).źródło
Blokowanie za pomocą kursorów arcpy.da jest prawie takie samo jak blokowanie za pomocą oryginalnych kursorów arcpy.da.
Po przetestowaniu kodu i, jak zauważył Gberard, po zakończeniu czytania nie ma odniesienia do kursora.
Ponadto nie ma żadnych blokad klasy obiektów po zakończeniu zrozumienia.
źródło