Python @ DjangoSpin

Python: Decorators

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon
Reading Time: 1 minutes

Python Decorators

Python Decorators

Decorators is a Python-exclusive feature, virtue of which you can define a function called a decorator function. This decorator function takes an object, manipulates it using its own object and returns this latter object. For example, in the event of decorating a function:

def decoratorFunction(inputFunction):
    def manipulateInputFunction():
        capture return value of inputFunction
        return manipulatedReturnValueOfInputFunction
    return manipulateInputFunction
 
@decoratorFunction
def functionToBeDecorated():
    # body of function
    returns an object, say a string

Significance of @ Notation

Any call to functionToBeDecorated() translates to decoratorFunction() with functionToBeDecorated as its argument i.e. functionToBeDecorated() becomes decoratorFunction(functionToBeDecorated)(). For example:

stringOne = functionToBeDecorated()
BECOMES
stringOne = decoratorFunction(functionToBeDecorated)()

Example

Let’s make the output of a function fancier by wrapping its return value with additional text. We will make use of the decorator annotation (@) provided by Python.

def decorateMyFunction(originalFunction):
    '''Decorates a function by wrapping its return value in a pair of HTML paragraph tags.'''
    def addAdditionalText():
        # Obtain string returned by original function
        textFromOriginalFunction = originalFunction()
        # Adding new functionality to the function being decorated
        return "<p>" + textFromOriginalFunction + "</p>"
    return addAdditionalText
 
@decorateMyFunction
def functionToBeDecorated():
    '''A simple function that returns a string.'''
    return "Hi there!"
 
print( functionToBeDecorated() )                  # OUTPUT: <p>Hi there!</p>

Further Reading


See also:

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon

Leave a Reply