Flash cards
Review the key moves
What is the main idea behind Python Decorators?
Lesson checks
Practice each idea before moving on
Short Mimo-style checks built from this lesson's code, terms, and sequence.
Which statement best captures the main point of this lesson?
Complete the missing token from the example code.
___ changecase(func):Put the learning moves in the order that makes the concept easiest to apply.
Decorators let you add extra behavior to a function, without changing the function's code.
A decorator is a function that takes another function as input and returns a new function.
Basic Decorator
Define the decorator first, then apply it with @decorator_name above the function.
Example
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Hello Sally"
print(myfunction())By placing @changecase directly above the function definition, the function myfunction is being "decorated" with the changecase function.
The function changecase is the decorator.
The function myfunction is the function that gets decorated.
Multiple Decorator Calls
A decorator can be called multiple times. Just place the decorator above the function you want to decorate.
@changecaseArguments in the Decorated Function
Functions that require arguments can also be decorated, just make sure you pass the arguments to the wrapper function:
Example
def changecase(func):
def myinner(x):
return func(x).upper()
return myinner
@changecase
def myfunction(nam):
return "Hello " + nam
print(myfunction("John"))*args and **kwargs
Sometimes the decorator function has no control over the arguments passed from decorated function, to solve this problem, add ( *args , **kwargs ) to the wrapper function, this way the wrapper function can accept any number, and any type of arguments, and pass them to the decorated function.
*argsDecorator With Arguments
Decorators can accept their own arguments by adding another wrapper level.
Example
def changecase(n):
def changecase(func):
def myinner():
if n == 1:
a = func().lower()
else:
a = func().upper()
return a
return myinner
return changecase
@changecase(1)
def myfunction():
return "Hello Linus"
print(myfunction())Multiple Decorators
You can use multiple decorators on one function.
This is done by placing the decorator calls on top of each other.
Decorators are called in the reverse order, starting with the one closest to the function.
Example
def changecase(func):
def myinner():
return func().upper()
return myinner
def addgreeting(func):
def myinner():
return "Hello " + func() + " Have a good day!"
return myinner
@changecase
@addgreeting
def myfunction():
return "Tobias"
print(myfunction())Preserving Function Metadata
Functions in Python has metadata that can be accessed using the name and doc attributes.
__name__But, when a function is decorated, the metadata of the original function is lost.
Example
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Have a great day!"
print(myfunction.__name__)Expected output
def changecase(func): def myinner(): return func().upper() return myinner @changecase def myfunction(): return "Have a great day!" print(myfunction.__name__)
To fix this, Python has a built-in function called functools.wraps that can be used to preserve the original function's name and docstring.
functools.wraps