Decorators are evolved from the concept of closures.
A decorator function is a higher order function that takes a function as an argument and returns the inner function.
A decorator is capable of adding extra functionality to an existing function, without altering it.
The decorator function is prefixed with @ symbol and written above the function definition.
Example
@outer
def greet():
pass