[python] Dekorovana funkce
mykhal
michal.bozon na gmail.com
Středa Červen 23 13:43:29 CEST 2010
zjistit, jestli je dunkce dekorovana, nebo ne, asi obecne poresit
nepujde, protoze dekorator muze provadet vselico - muze funkci obalit
jinou funkci, nebo funkci jen pridat atribut.
pokud budeme ale predpokladat, ze dekorator vzdy obali puvodni funkci
nejakym wrapperem, stalo by za to povrtat se v func_closure
(__closure__ v py >= 2.6) atributu funkce, jak naznacuju vyse.
vypada to totiz, ze pokud dekorator vyrobi funkci f2 obalenim funkce
f1 funkci wrapper, pak plati, ze
- f2 is wrapper
- f.func_closure[0].cell_contents is f1
On Jun 23, 1:07 pm, Martin Blažík <lach... na fnet.cz> wrote:
> Tu ukazku jsem si ted vycucal z prstu, aby jen bylo videt co hledam.
> Dekorat nemusi byt muj, a ani jinej dekorator nechci znovu dekorovat :)
> Tim padem do obalovane funkce nic vlozeno nebude. Predstavoval jsem si,
> ze to zjistim nejakym zpusobem pres reflexi, ale jak jsm psal, nemuzu
> natrefit na ty spravne atributy.
>
> lachtan
>
> Dne 23.6.2010 9:30, Petr Messner napsal(a):
>
>
>
> > Pokud se jedn o tv j vlastn dekor tor, m e vracen funkci nastavit
> > nejak atribut, jeho p tomnost pak m e testovat.
>
> > Mimochodem ten dekor tor co uv d nen nejlep , proto e p episuje
> > n zev a dokumentaci p vodn funkce. T m by to tak mo n lo zjistit.
>
> > Petr Messner
>
> > 23.6.2010 v 9:14, Martin Bla k <lach... na fnet.cz>:
>
> >> us k,
> >> nem te n kdo p edstavu, jak zjistit za b hu programu, zda funkce i
> >> metoda byla obalena konkr tn m dekor torem? M jme tento uk zkov k d
>
> >> def decorator(func):
> >> def wrap(*args, **kwargs):
> >> return func(*args, **kwargs)
> >> return wrap
>
> >> def test1():
> >> return 'test1'
>
> >> @decorator
> >> def test2():
> >> return 'test2'
>
> >> @decorator
> >> def test3():
> >> return 'test3'
>
> >> a j bych r d m l funkci
>
> >> def isDecorated(function, decor):
> >> pass
>
> >> kter vr t True, pokud function vznikla tak, e n jak jin funkce
> >> (nez le na tom jak ) byla obalena dekor torem decor. Mohl bych napsat
> >> t eba
>
> >> lst = [test1, test2, test3]
> >> for function in lst:
> >> if isDecorated(function, decorator):
> >> print function.__name__, 'YES'
> >> else:
> >> print function.__name__, 'NO'
>
> >> Sna il jsem se o tom n co naj t na inetu i jsem provedl hromadu
> >> testov n za pou t r zn ch atributu funkce, ale po d nem u naj t
> >> e en .
>
> >> Za v echny n pady p edem d k
> >> lachtan
> >> _______________________________________________
> >> Python mailing list
> >> Pyt... na py.cz
> >>http://www.py.cz/mailman/listinfo/python
> > _______________________________________________
> > Python mailing list
> > Pyt... na py.cz
> >http://www.py.cz/mailman/listinfo/python
Další informace o konferenci Python