Uzun süredir çalışan bir Python sunucum olsun ve sunucuyu yeniden başlatmadan bir dosyayı update etmek istediğimizi varsayalım. Bunu nasıl yapabiliriz? Örneğin Python’da modülleri içe aktarmanın tersi bir anahtar kelimemiz olsaydı (un-import gibi) aşağıdakini yapabilirdik:
if degisti_mi(foo.py):
unimport foo <-- bunu nasıl yapacağız?
import foo
myfoo = foo.Foo()
Importlib.reload()
kullanarak zaten içe aktarılmış bir modülü yeniden yükleyebiliriz:
from importlib import reload # Python 3.4+
import foo
while True:
# bir takım işlemler.
if degisti_mi(foo):
foo = reload(foo)
Python 2’de yeniden yükleme
yerleşik bir fonksiyondu. Python 3’te ise imp
modülüne taşındı. Python 3.4’te importlib
lehine kullanımdan kaldırıldı. 3 veya sonraki bir sonraki sürümler için reload
çağırırken uygun bir modüle başvurmanız gerekir.
Django sunucusu gibi Web sunucuları bu yöntemi kullanır, böylece sunucu işleminin kendisini yeniden başlatılmadan kod değişikliklerinizin etkilerini görebilirsiniz.
Belgelerden alıntı yaparsak:
- Python modülünün kodu yeniden derlenir ve modül düzeyi kodu yeniden yürütülür. Modül sözlüğündeki adlara bağlı yeni bir nesne kümesi tanımlanarak modülü ilk yükleyen yükleyiciyi yeniden kullanır. Uzantı modüllerinin
init
işlevi ikinci kez çağrılmaz. - Python’daki diğer tüm nesnelerde olduğu gibi, eski nesneler yalnızca başvuru sayıları sıfıra düştükten sonra geri kazanılır.
- Modül ad alanındaki isimler, yeni veya değiştirilmiş nesnelere işaret etmek için güncellenir.
- Eski nesnelere yapılan diğer başvurular (modül dışındaki adlar gibi) yeni nesnelere başvurmak için geri alınmaz ve istenirse oluştukları her ad alanında güncelleştirilmelidir.
Sorumuzda olduğu gibi, Foo
objelerini eğer Foo
sınıfı foo
modülündeyse yeniden yapılandırmamız gerekir.