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 > -- http://mail.python.org/mailman/listinfo/python-list