[python] Dekorátory, jak na ně ?

Jan Jakubuv jakubuv na gmail.com
Neděle Prosinec 9 11:36:25 CET 2007


zdravim,

> volat s proměnnou = @muj_dekorator('moje_promenna') ?
> Nebo, má dekorátor přístup s proměnným metody kterou dekoruje ?

samozrejme ma pokud to spravne naprogramujete. ja dekorator s
promennou pisu takto (okoukano z tutorialu genshi ;-) :

def muj_dekorator(moje_promenna):
    def decorate(dekorovana_funkce):
        def wrapper(*args, **kwargs):
            ...
            result = dekorovana_funkce(*args, **kwargs)
            ...
            return vysledek
        return wrapper
    return decorate

coz ma tu vyhodu, ze je to obecne pouzitelne, cili nezavisi na jmenech
parametru funkce kterou dekorujete. hodnoty parametru dekorovane
funkce pak mate ulozeny ve slovniku kwargs pripadne v tuple args.

pokud znate pocet a poradi argumentu dekorovanych funkci a vite ze
budete dekorovat pouze funkce s takto urcenymi parametry, muzete vse
zjednodusit napriklad takto (rekneme ze dekorovana funkce ma jediny
argument):

def muj_dekorator(moje_promenna):
    return (lambda dekorovana_funkce: lambda argument:
vypocet(dekorovana_funkce, argument)

tento priklad je spise pro ujasneni principu, snad pomuze. obecne
muj_dekorator musi vratit funkci ktera prijima jeden parametr a to
dekorovanou funkci. v prvnim prikladu je to funkce decorate. tato
funkce (decorate) ma za ukol provest cinnost dekoratoru, tj. "obalit"
dekorovanou funkci a vratit ji jako vysledek. v prvnim priklade je tim
obalenim funkce wrapper. argumenty funkce wrapper jsou argumenty
dekorovane funkce a v jejim tele muzete samozrejme pouzit i promennou
moje_promenna. mozna to zni trochu komplikovane, ale zcela jiste
rychle pochopite prvni priklad na nejakem konkretnim pouziti.

staticke tridy souvisi s dekoratory pouze tak, ze se pro jejich zapis
pouzivaji dekoratory.

honza.


Další informace o konferenci Python