Nerede Python'prosedür belgelenen s?
CPython kapatma sırasında Hiçbiri modülleri ayarlar burada garip bir davranışı var. Bu kadar hata yazdım bazı çoklu kod kapatma sırasında günlük vidalar.
Bu davranış herhangi bir belge bulamadım. PEP 432 geçen bahsediyor:
[...] önemli ölçüde "None break döngüleri kasıtlı ve girişimi bültenleri için daha fazla dış kaynakları temiz bir şekilde kullanılan" davranış. set modül yaşayacaksınız modülleri sayısını azaltarak
SO questions about this behaviour C API documentation mentions shutdown behaviour for embedded interpreters vardır.
Ayrıca related thread on python-dev related CPython bug: buldum
Bu yama modül davranışını değiştirmez nesneleri kendi bütünsel sözlük en kısa sürede temizlenmesi kaldırıldı.
Bu belgelenmiş bir davranış mı? 2 özel Python mi?
CEVAP
Davranıştırdeğiliyi belgelenmiş ve 1.5-ish hakkında Python sürümleri mevcutturPython 3.4 kadar:
Bu değişimin bir parçası olarak, modül bütünsel artık zorla çoğu durumda tercüman kapatma sırasında
None
set yerine döngüsel çöp toplayıcı normal çalışmasını güveniyor.
Davranışları için tek belge moduleobject.c
source code
/* To make the execution order of destructors for global
objects a bit more predictable, we first zap all objects
whose name starts with a single underscore, before we clear
the entire dictionary. We zap them by replacing them with
None, rather than deleting them from the dictionary, to
avoid rehashing the dictionary (to some extent). */
Not Bu ayar değerleri None
optimizasyon; alternatif olurdu silmek adlarını eşleme, götürecek farklı bir hata (NameError
istisnalar yerine AttributeError
ler ne zaman kullanmak istiyor bütünsel bir __del__
handler).
Dışarı mailinglist üzerinde bulunduğu gibi, davranış Halkalı çöp toplayıcı öncedir; Halkalı çöp toplayıcı added in 2000 23 olurken,**,. İşlevi nesneleri her zaman modülü __dict__
başvuru yılından bir modülde tüm işlev nesneleri GC önce __dict__
gerekli temizleme oyun haline geldi bu yüzden döngüsel başvurular içerir.
Siklik GC __del__
yöntemleri döngüleri dahil olan nesneler olabilir çünkü eklendi bile yerde tutuldu. aren't otherwise garbage-collectable ve sözlük en azından modülü kaldırmak istiyorsunuz modülünü temizleme bu 11* *böyle olmalıdır. Öyle bir şey olmayacaktümBu modül başvurulan global yaşıyor.
Değişiklikleri PEP 442 için yapılmış şimdi çöp toplayıcı __del__
bir sonlandırıcı sağlayan nesneler ile döngüsel başvuruları temizlemek için mümkün, modülü __dict__
temizlemek için gereken kaldırma yapmakçoğu durumda. Kodu still there ama bu sadece tetikleyen __dict__
öznitelik hala yaşıyor sonra bile hareketli içindekiler sys.modules
zayıf başvuru ve başlangıç GC collection çalıştırıldığında yorumlayıcı kapatıyor; modülü sonlandırıcı sadece azaltır kendi başvuru sayısı.
Nerede Python'in "en iyi Bu ...
Nerede Python birim testleri gider?...
Python ile dosya ayıklama uzantısı...
Nasıl Python SIGINT yakalamak mı?...
Python: HERHANGİ bir özel durum yakala...