[Gelistirici] PiSi'de "from module import X"
Barış Metin
baris at pardus.org.tr
19 Nis 2007 Per 23:43:22 EEST
Faik Uygur <faik at pardus.org.tr>:
> On Thursday 19 April 2007 00:19:33 Barış Metin wrote:
> > Selam,
>
> Selam,
>
> > mymodule.py adında bir modülümüz olsun. İçeriği şu:
> >
> > def karpuz():
> > print "round 1"
> >
> > In [1]: from mymodule import karpuz
> > In [2]: karpuz()
> > round 1
> >
> > Gidip mymodule.py'yi düzenleyelim. Yeni içerik:
> > def karpuz():
> > print "round 2"
> >
> > In [3]: import sys
> > In [4]: reload(sys.modules[karpuz.__module__])
> > Out[4]: <module 'mymodule' from 'mymodule.py'>
> > In [5]: exec("from %s import karpuz" % karpuz.__module__)
> > In [6]: karpuz()
> > round 2
> >
> > Faik, bu işimizi çözüyor mu? Görebildiğim kadarı ile başka yöntemleri de
> > var ama en basitçe uygulanabilecek bu. Bu işi otomatik yapabiliriz tabi,
> > global içerisinde __module__'ü farklı/istediğimiz olan tüm nesneleri bu
> > şekilde reload ettiririz...
>
> Otomatikleştirme kısmının nasıl yapılacağını tam anlayamadım. globals()
> içinde tipi function olan herşeyin modülünü mü reload edeceğiz. Bir de exec
> leri nasıl otomatikleştiriyoruz?
...
> Mevcut kodun üstüne "from import" lar için böyle bir çözümde eklenince
> ne olur bilemiyorum.
Kolay olur bence :). Hızlıca şöyle bir şey çıktı...
http://cekirdek.pardus.org.tr/~baris/tmp/reloadme.py
Bunu çalıştırdığımız zaman şöyle bir çıktı veriyor:
$ python reloadme.py
reloading init from pisi.api as init
reloading install from pisi.operations as operations_install
reloading install from pisi.operations as install
Yalnızca "from X import Y" değil, "from X import Y as Z" tipi çağrımları da
reload edebiliyoruz.
> Sorun olmaz çalışır diyorsan ciddi ciddi bu kısmı
> yazmak ister misin diye sorayım.
Şu anda sorun çıkaran yerlerin ne olduğunu tam olarak konuşabilirsek
yazabilirim tabi :)
> reload işine bir türlü güveniyorum, her an
> bir yerde sorun çıkaracakmış gibi rahatsız ediyor.
Yukarıda yaptığımız iş normal bir reload()'dan farklı değil. Bir scope sorunu
çıkmazsa da kolayca PiSi içerisine entegre ederiz o fonksiyonu. Python'un tip
sistemine ve reload() build-in'ine ne kadar güvendiğimiz ile alakalı olarak
rahatsız edebilir, o ayrı ;).
> a,b,c modüllerini kullanan dışarıdan bir d'nin a,b,c yi reload etmesi
> mantıklı geliyor. Bu işin a,b,c modüllerinden birinin içinde yapılması bir
> acayip... Şu anki durum bu.
C kullanıyor olsaydık evet ama Python gibi dinamik tipli bir dilde çalışmanın
avantaşı bu çok fazla takla atmadan yapılabiliyor. Bu arada, bu reload
işlemini çomar içerisinden de çağırabiliriz sanırım... Çıkardığımız sonucu
beğenmezsek bu seçenek elimizin altında zaten.
> > PS2: Daha önce konuşulan ve Çağlar'ın da toplantıda bahsettiği reload'un
> > bir wrapper tarafından yapılması fikri sıcak gelmemeye başladı. RPM bunu
> > bir wrapper ile çözüyor ama Python gibi bir dil kullanmıyor :).
>
> wrapper'dan kasıt farklı bir şey mi? Benim aklımdaki örneğin pisi-cli'nin,
> pisi modüllerini dışarıdan kullanan bir uygulama olarak bu pisi modüllerini
> reload etmesi doğru bir çözüm görünüyor. Aynı şekilde package manager'da
> dışardan bu modülleri kullanan bir uygulama olarak reload etmeli. Şu an
> pisi kendi modülleri içinde upgrade akışında bu işi yapmaya çalışıyor.
>
> Keşke kurtulabilsek reload gereksiniminden. Şöyle bir yöntem olabilir mi?
> Çok mu rahatsız edici olur kullanıcı açısından?
Bu işlemi tümü ile otomatik yapabiliyorken yapmamak iyi™ olmaz bence. Bu PS2
bölümünü daha sonra konuşalım isterseniz, önce ilk sorunumuza odaklanalım?
--
Barış Metin
Gelistirici mesaj listesiyle ilgili
daha fazla bilgi