function decorators

Terry Reedy tjreedy at udel.edu
Tue Sep 28 20:57:16 EDT 2010


On 9/28/2010 6:02 PM, Nick Donohue wrote:
> I came across this code just now:
>
> def time_me(function):
>    def wrap(*arg):
>      start = time.time()
>      r = function(*arg)
>      end = time.time()
>      print "%s (%0.3f ms)" %(function.func_name, (end-start)*1000)
>    return wrap
>
> @time_me
> def some_function(somearg)

As others noted, this is an bad example of a decorator. Please forget 
it. Let us move on...

#deco
def func_name(*args): pass

is syntactic sugar for (which is to say, is almost and for practical 
purposes is exactly equivalent to)

def func_name(*args): pass
func_name = deco(func_name)

Indeed, Python did well without them until they were added. But there 
are 2 advantages of the decorator syntax:

1. Without it, one write (and read!) func_name 3 times instead of 1. One 
of the use cases that motivated decorators was a situation where someone 
was required to wrap numerous functions with stylized names about 30 
chars long, like 'get_hopscotch_version_a_code_123x76'

2. Understanding the code may require that one know that it will never 
see the light of day as is. If the body is several lines, the wrapping 
call may be hard to see. To put it another way, the wrapping calls often 
belong near the doc string since they are part of a high-level overview 
of the function.

-- 
Terry Jan Reedy




More information about the Python-list mailing list