Skip to content

Instantly share code, notes, and snippets.

@amelieykw
Created July 15, 2018 18:57
Show Gist options
  • Save amelieykw/74b92b01bbcb62e43d2f72e1c778afaa to your computer and use it in GitHub Desktop.
Save amelieykw/74b92b01bbcb62e43d2f72e1c778afaa to your computer and use it in GitHub Desktop.
[Python - Function Decorators] #Python #Function #Decorator #tutorial #interview
  1. In Python, we can define a function inside another function.
  2. In Python, a function can be passed as parameter to another function
  3. In Python, a function can also return another function
# A Python program to demonstrate that a function
# can be defined inside another function and a
# function can be passed as parameter.
 
# Adds a welcome message to the string
def messageWithWelcome(str):
 
    # Nested function
    def addWelcome():
        return "Welcome to "
 
    # Return concatenation of addWelcome()
    # and str.
    return  addWelcome() + str
 
# To get site name to which welcome is added
def site(site_name):
    return site_name
 
print messageWithWelcome(site("GeeksforGeeks"))

Output:

Welcome to GeeksforGeeks

A decorator is a function that takes a function as its only parameter and returns a function.

This is helpful to “wrap” functionality with the same code over and over again.

We use @func_name to specify a decorator to be applied on another function.

# Adds a welcome message to the string
# returned by fun(). Takes fun() as
# parameter and returns welcome().
def decorate_message(fun):
 
    # Nested function
    def addWelcome(site_name):
        return "Welcome to " + fun(site_name)
 
    # Decorator returns a function
    return addWelcome
 
@decorate_message
def site(site_name):
    return site_name;
 
# Driver code
 
# This call is equivalent to call to
# decorate_message() with function
# site("GeeksforGeeks") as parameter
print site("GeeksforGeeks")

Output:

Welcome to GeeksforGeeks

Decorators can also be useful to attach data (or add attribute) to functions.

# A Python example to demonstrate that
# decorators can be useful attach data
 
# A decorator function to attach
# data to func
def attach_data(func):
       func.data = 3
       return func
 
@attach_data
def add (x, y):
       return x + y
 
# Driver code
 
# This call is equivalent to attach_data()
# with add() as parameter
print(add(2, 3))
 
print(add.data)

Output:

5
3

‘add()’ returns sum of x and y passed as arguments but it is wrapped by a decorator function, calling add(2, 3) would simply give sum of two numbers but when we call add.data then ‘add’ function is passed into then decorator function ‘attach_data’ as argument and this function returns ‘add’ function with an attribute ‘data’ that is set to 3 and hence prints it.

Python decorators are a powerful tool to remove redundancy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment