decorator question

Ralf Schmitt rs at systemexit.de
Sun Jan 8 16:03:07 EST 2006


Schüle Daniel schrieb:
> hello NG,
> 
> consider this code
> 
>  >>> def timelogger(f):
> ...     def wrapper(*a,**kw):
> ...             print "started at %s" % time.ctime()
> ...             t0 = time.time()
> ...             f(*a, **kw)
> ...             t1 = time.time()
> ...             print "ended at %s" % time.ctime()
> ...             print "diff = ", t1-t0, "sec"
> ...     return wrapper
> ...
>  >>> import time
>  >>> @timelogger
> ... def loops(a,b,c):
> ...     sum = 0
> ...     for i in range(a):
> ...             for j in range(b):
> ...                     for k in range(c):
> ...                             sum += 1
> ...
>  >>> loops
> <function wrapper at 0x402eec34>
>  >>> loops(10,10,10)
> started at Sun Jan  8 23:19:19 2006
> ended at Sun Jan  8 23:19:19 2006
> diff =  0.000367164611816 sec
> 
> the code above works fine
> but I am wondering wheather it's possible to
> write something like this
> 
>  >>> def timelogger(f, logfile=sys.stdout):
> ...     def wrapper(*a,**kw):
> ...             logfile.write("started at %s" % time.ctime())
> ...             t0 = time.time()
> ...             f(*a, **kw)
> ...             t1 = time.time()
> ...             logfile.write("ended at %s" % time.ctime())
> ...             logfile.write("diff = %f %s" % (t1-t0, "sec"))
> ...     return wrapper
> 
>  >>> import time
>  >>> @timelogger(file("hierher", "a"))    ### <<<<<< (1)
> ... def loops(a,b,c):
> ...     sum = 0
> ...     for i in range(a):
> ...             for j in range(b):
> ...                     for k in range(c):
> ...                             sum += 1
> ...
> 
> (1) fails to compile
> is it possible to pass parameters to a decorator function?
>

It's possible. The call to timelogger must return a function which 
itself takes a function and returns one:

def timelogger(logfile=sys.stdout):
     def deco(f):
         def wrapper(*a,**kw):
             logfile.write("started at %s" % time.ctime())
             t0 = time.time()
             f(*a, **kw)
             t1 = time.time()
             logfile.write("ended at %s" % time.ctime())
             logfile.write("diff = %f %s" % (t1-t0, "sec"))
         return wrapper
     return deco


> Regards, Daniel
> 



More information about the Python-list mailing list