Function decorators obviously apply to functions. The @foo decorator line is placed on the line prior to the function definition. The syntactic sugar takes one function and runs its results through another automatically; at the end of processing, the original function call's name is applied to the final result. To the system, it looks like the original function call provided the result directly. Below is a demonstration of what a decorator looks like:
@foo_decorator
def my_function():
pass
When the Python interpreter gets to this code block, my_function() is processed and the result is passed to the function that @foo_decorator points to. The decorator function is processed and the result is substituted for the original my_function() results. In essence, the decorator hijacks the function call, modifying the original result...