<div class="gmail_quote">On Tue, Sep 28, 2010 at 4:02 PM, Nick Donohue <span dir="ltr"><<a href="mailto:ndonohue@gmail.com">ndonohue@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

I came across this code just now:<br>
<br>
def time_me(function):<br>
  def wrap(*arg):<br>
    start = time.time()<br>
    r = function(*arg)<br>
    end = time.time()<br>
    print "%s (%0.3f ms)" %(function.func_name, (end-start)*1000)<br>
  return wrap<br>
<br>
@time_me<br>
def some_function(somearg)<br>
<br>
some_function(arg)<br>
<br>
I've been looking online about what I think is going on, and from what<br>
I can tell this code is using function decorators.<br>
<br>
I guess what I'm asking is if someone could tell me what exactly is<br>
going on in this code - how is it different from passing:<br>
time_me(some_function(123))? I've tried it this way and it works.<br></blockquote><div><br>Not quite.  It's actually equivalent to calling time_me(some_function)(123).<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


why would I use these? wouldn't it be more flexible to not write the<br>
decorator before the function definition, so I could choose to wrap it<br>
or not?<br></blockquote></div><br>In general, yes.  In the particular case above, I don't know why it would have been written as a decorator, unless it was merely meant to be toy code.  Generally I'll use a decorator in order to add common functionality that is critical to the function's operation.  Dynamically adding a default keyword argument is one example that comes to mind, or wrapping the function in a context manager without adding indentation to the entire function body.<br>

<br>Also, decorators can also be used for things besides wrapping functions, such as registering them with a framework.<br><br>Cheers,<br>Ian<br>