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

getattr() u lokalu

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

[ Pregleda: 2398 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mr.marvin

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



Profil

icon getattr() u lokalu22.08.2007. u 22:14 - pre 157 meseci
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))()
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

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



Profil

icon Re: getattr() u lokalu23.08.2007. u 08:39 - pre 157 meseci
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???
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

mr.marvin

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



Profil

icon Re: getattr() u lokalu23.08.2007. u 08:54 - pre 157 meseci
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.
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

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



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:12 - pre 157 meseci
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')

The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

mr.marvin

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



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:21 - pre 157 meseci
Da, da, to je ok. Ali kako koristiti getattr() za poziv funkcija u istom modulu?
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: getattr() u lokalu23.08.2007. u 12:21 - pre 157 meseci
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)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

mr.marvin

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



Profil

icon Re: getattr() u lokalu23.08.2007. u 12:33 - pre 157 meseci
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.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: getattr() u lokalu23.08.2007. u 13:35 - pre 157 meseci
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)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

mr.marvin

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



Profil

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

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

[ Pregleda: 2398 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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