[Tutor] Writing decorators?
alan.gauld at yahoo.co.uk
Tue Jul 5 10:40:30 EDT 2016
On 05/07/16 14:22, Alex Hall wrote:
> To simplify things, what might be an example of a decorator that, say,
> prints "decorated" before whatever string the decorated function prints?
> My attempt would be:
> def prependDecorated(f):
> def prepend():
> return "decorated"+f()
> #something should go at this level too?
Recall that a decorator is:
that takes a function as its argument
and returns a function
Your code fails on the third item.
Lets take a trivial example first, a decorator that
does nothing. Define a function that takes a function
and returns the same function untouched:
>>> def donothing(f): return f
Now apply it to a square() function:
def square(x): return x*x
<function square at 0x7f3633fcb0d0>
We could do the same without the @ shorthand by using
square2 = donothing(square)
But the @ syntax makes it more readable.
Now lets look at your task
We need a function that takes a function and
returns a function that prepends a string:
def add_string(*args, **kwargs): # in case f takes arguments
return "decorated "+ str(f(*args,**kwargs))
Now we can apply that to a function
def cube(n): return n*n*n
I'm biased because I was the tech editor but the book
Professional Python has a nice chapter on decorators.
Author of the Learn to Program web site
Follow my photo-blog on Flickr at:
More information about the Tutor