[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