Function decorators are used to modify what happens when a function is defined. That is, they affect the behavior of the def statement itself. Decorators are denoted using the special @ symbol, as follows:
@foo def bar(x): return x*2
The preceding code is shorthand for the following:
def bar(x): return x*2 bar = foo(bar)
In the example, a function bar() is defined. However, immediately after its definition, the function object itself is passed to the function foo(), which returns an object that replaces the original bar. An example will clarify:
def foo(f): def wrapper(*x,**y): print "Calling", f.__name__ return f(*x,**y) return wrapper
In this case, foo() places a wrapper function around the original function object. If ...