Cho dù nó thực sự cần thiết là câu hỏi sai. Câu hỏi là liệu đó có phải là một ý tưởng tốt.
Theo quy định trong lập trình, bạn nên tránh làm những điều kỳ lạ và sử dụng công cụ tốt nhất cho công việc . Nếu một cái gì đó có một cách rõ ràng để phát hành tài nguyên, chỉ cần làm cho bản phát hành rõ ràng và được thực hiện với nó:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Những gì bạn có thể không nhận thức được là with
mệnh đề thực sự gọi logic bổ sung. Một with
mệnh đề yêu cầu một trình quản lý bối cảnh, phải có một phương thức __enter__
(được gọi khi khối được nhập) và __exit__
(được gọi khi khối được thoát). Cụ thể, __exit__
phương thức được gọi bất kể có xảy ra ngoại lệ hay không, đảm bảo chương trình luôn giải phóng tài nguyên ngay cả khi có lỗi. Điều này cung cấp cho mã của bạn tài liệu rõ ràng về thời điểm tài nguyên được mua và khi nào nó được phát hành và nó đảm bảo rằng tài nguyên có thể được phát hành càng sớm càng tốt.
Ngược lại, bạn thực sự không thể phụ thuộc vào thời gian chạy để đóng nó ngay lập tức cho bạn. Điều này là do cách nó bị đóng bằng cách gọi hàm hủy của đối tượng, điều này có thể xảy ra hoặc không xảy ra ngay lập tức. Python không đảm bảo khi nào một hàm hủy được gọi, chỉ có điều nó sẽ xuất hiện khi đối tượng được thu gom rác. (Xem tại đây .) Hiện tại, Python được triển khai để nó xảy ra ngay khi không còn tham chiếu đến một đối tượng. Nhưng thật dễ dàng để vô tình truyền các tham chiếu đến một đối tượng và thời gian chạy của Python có thể thay đổi.
Cũng xem xét việc bảo trì dài hạn. Không có tài liệu tham khảo lâu dài với nó bây giờ, nhưng những gì xảy ra trong 6 tháng khi bạn cần phải sửa đổi mã để có là một tài liệu tham khảo? Nếu người khác làm điều đó thì sao? Người thực hiện thay đổi có thể không nghĩ sẽ chuyển sang một with
khối vì chưa có ai ở đó. Làm sạch tài nguyên của bạn thành thói quen và bạn sẽ có ít vấn đề hơn với nó.
Bạn có thực sự muốn buộc mã của mình vào chi tiết triển khai của bộ sưu tập rác không? Bạn có muốn phải liên tục suy nghĩ về việc liệu bạn có thể vô tình tuyên truyền một tài liệu tham khảo thông qua một ngoại lệ không? Không, bạn không. Hãy tưởng tượng nếu điều đó xảy ra khi tập lệnh được gọi trong ArcMap. Người dùng sẽ bị buộc phải đóng toàn bộ quá trình chỉ để phát hành tệp. Vì vậy, đừng đặt mình vào vị trí đó. Phát hành tài nguyên một cách rõ ràng. Lưu một dòng mã không có giá trị rủi ro của các vấn đề nó có thể gây ra. Các trình quản lý bối cảnh là cơ chế tiêu chuẩn để có được và giải phóng tài nguyên trong Python và họ làm điều đó rất tốt.
Điểm mấu chốt là không phát hành nó một cách rõ ràng là một ý tưởng tồi.
Tất nhiên, điều này giả định rằng mã có một số khả năng ảnh hưởng đến người khác, như đưa nó vào một tập lệnh mà người khác sẽ cần chạy hoặc duy trì hoặc nó có thể trì hoãn việc phân phối công việc của bạn nếu bạn phải đóng ArcMap hoàn toàn vì bạn không thể lưu các thay đổi của bạn. Nếu bạn là người duy nhất sẽ bị ảnh hưởng bởi một vấn đề, thì bằng mọi cách, hãy bay lên khi đối mặt với những thực hành tốt mà bạn muốn.
da
con trỏ mới : sgillies.net/2011/02/01/get-with-it.html và help.arcgis.com/ vi / arcgisdesktop / 10.0 / help / index.html # // . Cụ thể, hãy xem ý kiến của @JasonScheirer ở cuối liên kết đầu tiên.