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:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
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.
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.