Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

getattr() u lokalu

[es] :: Python & Zope :: getattr() u lokalu

[ Pregleda: 698 | Odgovora: 8 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mr.marvin

Član broj: 137276
Poruke: 82
*.crnagora.net.



Profil

icon getattr() u lokalu22.08.2007. u 22:14

Kako da pozovem funkciju koja je definisana u istom modulu?

Npr, imam display.py u kome su sve same funkcije:

main(), func1(), func2()...

... koje ne zelim da stavljam u kalsu, ali zelim da ih pozovem pomocu getattr, ali ne znam sta je "object":

main(i):
getattr(?, "func_%s" % str(i))()
22.08.2007. u 22:14 

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 125
*.kalik.info.



Profil

icon Re: getattr() u lokalu23.08.2007. u 08:39
Ne znam da li je to moguce, posto je getattr() skracenica od get atrribute sto se odonosi na objekat, valjda. Btw, postoji li razlika izmedju: o.funkcija i getattr(o,'funkcija'), posto ja uvek koristim ovaj prvi nacin???
23.08.2007. u 08:39 

mr.marvin

Član broj: 137276
Poruke: 82
*.crnagora.net.



Profil

icon Re: getattr() u lokalu23.08.2007. u 08:54
Odnosi se na ojekat, ali kao sto sam nalazio na mnogo mjesta u dokumentaciji "sve u Pythonu je objekat". Modul u kome se funkcija nalazi je objekat, pa sam mislio da postoji neki nacin da se postavi referenca ka tome...

"For example, getattr(x, 'foobar') is equivalent to x.foobar" (iz helpa) - mislim da je potpuno isto.
23.08.2007. u 08:54 

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 125
*.kalik.info.



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:12
Izgleda da getattr vazi i za module, sto je ujedno, ako sam dobro razumeo, ono sto ti treba...
Code:

#funkcije.py
def func():
    print 'ovo je funkcija'

Code:

#main.py
import funkcije

getattr(funkcije, 'func')
23.08.2007. u 12:12 

mr.marvin

Član broj: 137276
Poruke: 82
*.crnagora.net.



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:21
Da, da, to je ok. Ali kako koristiti getattr() za poziv funkcija u istom modulu?
23.08.2007. u 12:21 

alex
Aleksandar Radulovic
Team/Project Manager, Software Development, Síminn hf.
Reykjavik, Iceland

Administrator
Član broj: 71
Poruke: 2106
*.siminn.is.

Jabber: maurice.chavez@gmail.com
ICQ: -1
Sajt: www.a13x.info


Profil

icon Re: getattr() u lokalu23.08.2007. u 12:21
Sta je uopste tvoj problem? Ako su te funkcije u istom modulu onda su i u istom (lokalnom) namespace-u pa ih mozes pozivati normalnim putem:

Code:

def func1():
    print "blah"

def func2():
    func1()
    print "blah func2"

def main():
    func2()


Ako zelis da ih pozivas sa primerom koji si ti naveo, mogu odmah da ti kazem da to bas i nije sjajno resenje.

No, U okviru svake funkcije imas dict - func_globals u kome mozes naci funkcije (adrese instanci) koje se nalaze u istom namespace-u kao i sama funkcija.

Ako izmenimo funkciju main() u gornjem primeru:
Code:

def main():
    print main.func_globals


Pokreni kôd i ispisace ti koje sve funkcie postoje u istom namespace-u. Mada, ovo je vec primer kako ne bi trebalo pisati kôd.


[Ovu poruku je menjao alex dana 23.08.2007. u 13:33 GMT+1]

[Ovu poruku je menjao alex dana 23.08.2007. u 14:21 GMT+1]
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
23.08.2007. u 12:21 

mr.marvin

Član broj: 137276
Poruke: 82
*.crnagora.net.



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:33
Nije taj slucaj sto si naveo, ali evo detalja, mozda ima jednostavnije rjesenje...

Radi se o modulu koji koji je zaduzen za ispisivanje informacija u konzoli (posshow.py), a taj modul je dijeljen izmedju nekoliko klasa. Svaka klasa trazi drugaciji ispis, a funkcije koje vrse ispise nalaze se u istom modulu (posshow.py). Glavna funkcija je show():

Code:
def show(pos, detail=1):
    """
    Prints out relevant details.
    Here pos is a class (Nom(), Ver() etc.)
    """
    cap = captions()
    print "\n", getattr(cap, pos.__name__)["title"], "\n", 70*"-"
    print getattr(cap, pos.__name__)["pos"], text_format(pos)
    if len(pos.translate) and detail==1:
        print "Translation(s): ", t
    print
        # TODO:
        #getattr(? "part_%s" % pos.__name__)(pos)
    print
    if detail > 1:
        if pos.nolex:
            print "Lexicon not used."
        else:
            print "Lexicon used."
        print "Module version", pos.__version__



U show() pos je klasa, a program koristi __name__ za odredjivanje sta ce i kako da se stampa. Mogao bih to da uradim sa if/elif ali mi je elegantnije da koristim getattr(): u istom modulu (posshow.py) se nalazi i part_Nom, part_Ver itd, pa onda sa "part_%s" % pos.__name__ formatiram poziv funkcije.
23.08.2007. u 12:33 

alex
Aleksandar Radulovic
Team/Project Manager, Software Development, Síminn hf.
Reykjavik, Iceland

Administrator
Član broj: 71
Poruke: 2106
*.siminn.is.

Jabber: maurice.chavez@gmail.com
ICQ: -1
Sajt: www.a13x.info


Profil

icon Re: getattr() u lokalu23.08.2007. u 13:35
Praksa direktnog pozivanja part_Ver, part_Nom, itd. u zavisnosti cija je pos instanca je veoma losa!

Pravilan pristup bi bio da pozoves part(pos), znaci prenosis pos kao argument; zatim u part funkciji implementiras razlicito tretiranje pos argumenta u zavisnosti od cega je pos instanca(Nom, Ver, itd).
Time je kôd ne samo citljiviji, vec i struktuiran na znatno robustniji nacin (na primer, dodavanje podrske za dodatne klase ne zahteva menjanje koda na desetine mesta vec na samo jednom mestu).

No, jedan od mogucih nacina da postignes ono sto zelis je, naravno, inspekcija pos.__class__ koja sadrzi ime klase cija je pos instanca.

Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
23.08.2007. u 13:35 

mr.marvin

Član broj: 137276
Poruke: 82
*.crnagora.net.



Profil

icon Re: getattr() u lokalu23.08.2007. u 17:47
Shvatam. Od show() cu napraviti klasu i unutar nje pozivati sto mi treba... Hvala mnogo na savjetu!
23.08.2007. u 17:47 

[es] :: Python & Zope :: getattr() u lokalu

[ Pregleda: 698 | Odgovora: 8 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.