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