ไม่ว่าจะจำเป็นหรือไม่นั้นเป็นคำถามที่ผิดที่จะถาม คำถามคือว่ามันเป็นความคิดที่ดี
ตามกฎในการเขียนโปรแกรมที่คุณควรหลีกเลี่ยงการทำสิ่งที่แปลกและใช้เครื่องมือที่ดีที่สุดสำหรับงาน หากมีบางสิ่งที่มีวิธีที่ชัดเจนในการปล่อยทรัพยากรเพียงแค่ปล่อยให้เป็นอิสระและสามารถทำได้:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
สิ่งที่คุณอาจไม่ทราบก็คือwith
ประโยคนั้นจะเรียกตรรกะเพิ่มเติมเข้ามา ส่วนwith
คำสั่งต้องใช้ตัวจัดการบริบทซึ่งจะต้องมี__enter__
(เรียกใช้เมื่อมีการป้อนบล็อก) และ__exit__
(เรียกใช้เมื่อบล็อกออก) วิธีการ โดยเฉพาะอย่างยิ่ง__exit__
วิธีการนี้ถูกเรียกใช้โดยไม่คำนึงว่ามีข้อยกเว้นเกิดขึ้นหรือไม่เพื่อให้มั่นใจว่าโปรแกรมจะเผยแพร่ทรัพยากรเสมอแม้เกิดข้อผิดพลาด สิ่งนี้จะให้เอกสารรหัสของคุณอย่างชัดเจนว่าเมื่อใดที่มีการรับทรัพยากรและเมื่อมีการเผยแพร่และช่วยให้มั่นใจได้ว่าทรัพยากรจะได้รับการเผยแพร่โดยเร็วที่สุด
ในทางตรงกันข้ามคุณไม่สามารถพึ่งพารันไทม์เพื่อปิดมันได้อย่างน่าอัศจรรย์สำหรับคุณ เนื่องจากวิธีการปิดคือการเรียกตัวทำลายของวัตถุซึ่งอาจหรืออาจจะไม่เกิดขึ้นทันที Python ไม่รับประกันใด ๆ เมื่อมีการเรียกใช้ destructor เฉพาะในที่สุดเมื่อวัตถุนั้นถูกรวบรวมขยะ (ดูที่นี่ ) ปัจจุบันมีการใช้งาน Python เพื่อให้เกิดขึ้นทันทีที่ไม่มีการอ้างอิงไปยังวัตถุอีกต่อไป แต่มันง่ายที่จะเผยแพร่การอ้างอิงไปยังวัตถุโดยไม่ตั้งใจและรันไทม์ของ Python อาจเปลี่ยนไป
พิจารณาการบำรุงรักษาในระยะยาวด้วย ไม่มีการอ้างอิงในระยะยาวก็ตอนนี้ แต่สิ่งที่เกิดขึ้นในรอบ 6 เดือนเมื่อคุณต้องแก้ไขโค้ดเพื่อให้มีคือการอ้างอิง? เกิดอะไรขึ้นถ้ามีคนอื่นทำมัน? บุคคลที่ทำการเปลี่ยนแปลงอาจไม่คิดว่าจะเปลี่ยนเป็นwith
บล็อกเนื่องจากยังไม่มีบล็อก ทำความสะอาดทรัพยากรให้เป็นนิสัยและคุณจะมีปัญหาน้อยลง
คุณต้องการผูกรหัสของคุณกับรายละเอียดการใช้งานการรวบรวมขยะหรือไม่ คุณต้องการคิดอย่างต่อเนื่องว่าคุณอาจเผยแพร่ข้อมูลอ้างอิงโดยไม่ตั้งใจหรือไม่? ไม่คุณทำไม่ได้ ลองนึกภาพว่ามันเกิดขึ้นเมื่อสคริปต์ถูกเรียกใช้ใน ArcMap ผู้ใช้จะถูกบังคับให้ปิดกระบวนการทั้งหมดเพียงเพื่อปล่อยไฟล์ ดังนั้นอย่าทำให้ตัวเองอยู่ในตำแหน่งนั้น ปล่อยทรัพยากรอย่างชัดเจน การบันทึกรหัสหนึ่งบรรทัดนั้นไม่คุ้มกับความเสี่ยงของปัญหาที่อาจเกิดขึ้น ผู้จัดการบริบทเป็นกลไกมาตรฐานสำหรับการรับและการปล่อยทรัพยากรใน Python และพวกเขาทำได้ดีมาก
บรรทัดล่างคือการไม่ปล่อยอย่างชัดเจนเป็นความคิดที่ไม่ดี
แน่นอนว่ารหัสนี้มีความเป็นไปได้ที่จะส่งผลกระทบต่อคนอื่นเช่นวางไว้ในสคริปต์ที่บุคคลอื่นจะต้องเรียกใช้หรือบำรุงรักษาหรืออาจล่าช้าส่งงานของคุณหากคุณต้องปิด ArcMap ไปตลอดทางเพราะคุณ ไม่สามารถบันทึกการเปลี่ยนแปลงของคุณ หากคุณเป็นคนเดียวที่จะได้รับผลกระทบจากปัญหาดังนั้นโดยวิธีการทั้งหมดแล้วให้บินไปพบกับแนวปฏิบัติที่ดีที่คุณต้องการ
da
เคอร์เซอร์ใหม่: sgillies.net/2011/02/01/get-with-it.htmlและhelp.arcgis.com/ en / arcgisdesktop / 10.0 / ช่วยเหลือ / index.html # // ... โดยเฉพาะดูความคิดเห็นของ @JasonScheirer ที่ด้านล่างของลิงค์แรก