Python’da tüm dosyaları kapatmak için Python çöp toplayıcısına güvenmek bir kodlama uygulaması olarak yeterli mi? Örneğin aşağıdakini yapmak ne kadar doğru?
for line in open("filename"):
# ... do stuff ...
Dosya hiçbir zaman kapatılamadığı ve kapatılmasını engelleyen bir özel durum oluşabileceği için bu bir sorun oluşturur mu? Yoksa dosya kapsam dışına çıktığı için for
döngüsü sonunda kesinlikle kapatılır mı?
Bu örnekte dosyanın Python yorumlayıcısı tarafından kapatılacağı garanti edilmez. CPython’un geçerli sürümlerinde dosya for döngüsünün sonunda kapatılır, çünkü CPython birincil çöp toplama mekanizması olarak referans sayımını kullanır. Ancak bu Python’un bir özelliği değil, CPython’un uygulamaya yönelik bir detayı diyebiliriz. Python’un diğer uygulamalarının bu şekilde çalışacağı da garanti edilmez. Örneğin IronPython, PyPy ve Jython referans sayımı kullanmaz ve bu nedenle döngünün sonunda dosyayı kapatmaz.
Yani..
Bazı Python uygulamaları referans verilmediğinde dosyaları otomatik olarak kapatırken, diğerleri kapatmaz. Bizim yerimize dosyaları kapatacak Python’lar için bile zamanlama garanti edilmez: hemen olabilir veya saniyeler, dakikalar, saatler, günler sonra olabilir.
CPython kullanıyorsanız kaynak sızıntılarınız olmayabilir, ancak referans sayımı kullanmayan bir Python uygulamasına geçerseniz, tüm kodunuzu gözden geçirmeniz ve tüm dosyalarınızın düzgün bir şekilde kapatıldığından emin olmanız gerekir. Aslında, Cpython 3’te artık sistemin sizin için dosyaları kapattığını belirten uyarılar alacaksınız.
Bu nedenle, kullandığınız Python ile ilgili sorunlar yaşamasanız da, dosyalarınızı açık bırakmak kesinlikle iyi bir uygulama değildir.
Bu nedenle aşağıdaki daha güvenlidir:
with open("filename") as f:
for line in f:
# ... do stuff ...
Peki with open() as f
otomatik olarak dosyayı kapatır mı?
Evet. Bu yöntem with
‘in sağladığı küçük bir sihir. Ama tabiki bunun çalışabilmesi için de gereksinimler var. Uyguladığımız nesnenin __enter__
ve __exit__
metodları olması gerekir. __exit__
metodunda dosyanın kapatılması ve benzeri temizlik işlemleri yapılır.