bugl
bugl
HomeLearnPatternsPathsSearchPremium
HomeLearnPatternsPaths
Learn/Python/Foundations
Python•Foundations

Python Decorators

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.

@changecase

Arguments 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.

*args

Decorator 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

Previous

Python Scope

Next

Python Lambda

This chapter

Overview
100

Lessons

265m

Read time

1. Python Tutorial2. Python Introduction3. Python Getting Started4. Python Syntax5. Python Statements6. Python Output / Print7. Python Output Numbers8. Python Comments9. Python Variables10. Python - Variable Names11. Python Variables - Assign Multiple Values12. Python - Output Variables13. Python - Global Variables14. Python Data Types15. Python Numbers16. Python Casting17. Python Strings18. Python - Slicing Strings19. Python - Modify Strings20. Python - String Concatenation21. Python - Format - Strings22. Python - Escape Characters23. Python - String Methods24. Python Booleans25. Python Operators26. Python Arithmetic Operators27. Python Assignment Operators28. Python Comparison Operators29. Python Logical Operators30. Python Identity Operators31. Python Membership Operators32. Python Bitwise Operators33. Python Operator Precedence34. Python Lists35. Python - Access List Items36. Python - Change List Items37. Python - Add List Items38. Python - Remove List Items39. Python - Loop Lists40. Python - List Comprehension41. Python - Sort Lists42. Python - Copy Lists43. Python - Join Lists44. Python - List Methods45. Python Tuples46. Python - Access Tuple Items47. Python - Update Tuples48. Python - Unpack Tuples49. Python - Loop Tuples50. Python - Join Tuples51. Python - Tuple Methods52. Python Sets53. Python - Access Set Items54. Python - Add Set Items55. Python - Remove Set Items56. Python - Loop Sets57. Python - Join Sets58. Python frozenset59. Python - Set Methods60. Python Dictionaries61. Python - Access Dictionary Items62. Python - Change Dictionary Items63. Python - Add Dictionary Items64. Python - Remove Dictionary Items65. Python - Loop Dictionaries66. Python - Copy Dictionaries67. Python - Nested Dictionaries68. Python Dictionary Methods69. Python If Statement70. Python Elif Statement71. Python Else Statement72. Python Shorthand If73. Python Logical Operators74. Python Nested If75. Python Pass Statement76. Python Match77. Python While Loops78. Python For Loops79. Python Functions80. Python Function Arguments81. Python *args and **kwargs82. Python Scope83. Python Decorators84. Python Lambda85. Python Recursion86. Python Generators87. Python range88. Python Arrays89. Python Iterators90. Python Modules91. Python Datetime92. Python Math93. Python JSON94. Python RegEx95. Python PIP96. Python Try Except97. Python String Formatting98. Python None99. Python User Input100. Python Virtual Environment

On this page

Basic DecoratorMultiple Decorator CallsArguments in the Decorated Function*args and **kwargsDecorator With ArgumentsMultiple DecoratorsPreserving Function Metadata