Kesinlikle gerekli olup olmadığı sorulması yanlış bir sorudur. Soru, bunun iyi bir fikir olup olmadığıdır.
Programlamada kural olarak, garip şeyler yapmaktan kaçınmalı ve iş için en iyi aracı kullanmalısınız . Bir şeyin kaynakları serbest bırakmanın açık bir yolu varsa, sürümü serbest bırakın ve onunla yapın:
with arcpy.da.UpdateCursor(fc,fields) as cursor:
d = {k: v for (k,v) in cursor}
Farkında olamayacağınız şey, with
cümlenin aslında ek mantık başlatmasıdır. Bir with
yan tümce, __enter__
(blok girildiğinde __exit__
çağrıldı ) ve (bloktan çıkıldığında çağrıldı) yöntemine sahip bir bağlam yöneticisi gerektirir . Özellikle, __exit__
bir istisna oluşup oluşmadığından bağımsız olarak yöntem çağrılır ve programın hatayı bile hata ile serbest bırakmasını sağlar. Bu, kodunuza bir kaynağın ne zaman ve ne zaman serbest bırakıldığına dair açık belgeler verir ve bir kaynağın en kısa zamanda serbest bırakılmasını sağlar.
Aksine, sihirli bir şekilde hemen sizin için kapatmak için çalışma zamanına güvenemezsiniz. Bunun nedeni, kapanma şeklinin, nesnenin, hemen gerçekleşebilecek veya olmayabilecek yıkıcısını çağırmasıdır. Python, bir yıkıcının ne zaman çağrıldığına dair herhangi bir garanti vermez, sadece nesne çöp toplandığında olacaktır. (Bkz. Burada .) Şu anda, Python artık bir nesneye referans olmadığı anda gerçekleşecek şekilde uygulanmaktadır. Ancak bir nesneye referansları yanlışlıkla yaymak kolaydır ve Python'un çalışma zamanı değişebilir.
Ayrıca uzun süreli bakımı da göz önünde bulundurun. Orada kendisine hiçbir uzun vadeli referans şimdi, ama orada o kadar kodunu değiştirmek gerektiğinde neyi 6 ay içinde olur ise bir referans? Ya başka biri yaparsa? Değişikliği yapan kişi, orada bir with
tane olmadığından bir bloğa geçmeyi düşünmeyebilir . Kaynaklarınızı temizlemeyi bir alışkanlık haline getirin ve bununla ilgili çok daha az sorun yaşarsınız.
Kodunuzu gerçekten çöp toplama uygulama ayrıntılarına bağlamak istiyor musunuz? İstisna yoluyla bir referansı yanlışlıkla yayıp yaymayacağınızı sürekli olarak düşünmek ister misiniz? Hayır. Bunun komut dosyası ArcMap'te çağrıldığında gerçekleşip gerçekleşmediğini düşünün. Kullanıcı sadece dosyayı serbest bırakmak için tüm işlemi kapatmak zorunda kalır. Bu yüzden kendinizi bu pozisyona sokmayın. Kaynağı açıkça bırakın. Bir satır kod kaydetmek, neden olabileceği sorunların riskine değmez. Bağlam yöneticileri Python'da kaynak edinme ve serbest bırakmanın standart mekanizmasıdır ve bunu çok iyi yaparlar.
Sonuç olarak, onu açıkça serbest bırakmamak kötü bir fikirdir.
Bu, elbette, kodun bir başkasını etkileme olasılığı olduğunu varsayar; örneğin, başka birinin çalıştırması veya sürdürmesi gereken bir komut dosyasına koymak veya ArcMap'i tamamen kapatmak zorunda kalırsanız çalışmanızı teslim etmeyi geciktirebilir. değişikliklerinizi kaydedemiyorum. Bir sorundan etkilenecek tek kişi sizseniz, elbette, iyi uygulamalar karşısında istediğiniz kadar uçun.
da
imleçlerde kesin bir kaynak bulamıyorum : sgillies.net/2011/02/01/get-with-it.html ve help.arcgis.com/ tr / arcgisdesktop / 10.0 / help / index.html # //… . Özellikle, ilk bağlantının altındaki @JasonScheirer'in yorumlarına bakın.