Декораторы

Написание функций на Python

Shayne Miel

Software Architect @ Duo Security

Функции

функция

Написание функций на Python

Декораторы

функция с декоратором

Написание функций на Python

Изменение входных данных

изменение входных данных

Написание функций на Python

Изменение выходных данных

изменение выходных данных

Написание функций на Python

Изменение функции

изменение функции

Написание функций на Python

Как выглядит декоратор?

@double_args
def multiply(a, b):
  return a * b

multiply(1, 5)
20
Написание функций на Python

Декоратор double_args

def multiply(a, b):
  return a * b

def double_args(func): return func
new_multiply = double_args(multiply)
new_multiply(1, 5)
5
multiply(1, 5)
5
Написание функций на Python

Декоратор double_args

def multiply(a, b):
  return a * b

def double_args(func):
# Define a new function that we can modify def wrapper(a, b):
# For now, just call the unmodified function return func(a, b)
# Return the new function return wrapper
new_multiply = double_args(multiply)
new_multiply(1, 5)
5
Написание функций на Python

Декоратор double_args

def multiply(a, b):
  return a * b

def double_args(func): def wrapper(a, b):
# Call the passed in function, but double each argument return func(a * 2, b * 2)
return wrapper
new_multiply = double_args(multiply)
new_multiply(1, 5)
20
Написание функций на Python

Декоратор double_args

def multiply(a, b):
  return a * b

def double_args(func): def wrapper(a, b): return func(a * 2, b * 2) return wrapper
multiply = double_args(multiply)
multiply(1, 5)
20
multiply.__closure__[0].cell_contents
<function multiply at 0x7f0060c9e620>
Написание функций на Python

Синтаксис декораторов

def double_args(func):
  def wrapper(a, b):
    return func(a * 2, b * 2)
  return wrapper

def multiply(a, b): return a * b multiply = double_args(multiply) multiply(1, 5)
20
def double_args(func):
  def wrapper(a, b):
    return func(a * 2, b * 2)
  return wrapper

@double_args def multiply(a, b): return a * b multiply(1, 5)
20
Написание функций на Python

Давайте потренируемся!

Написание функций на Python

Preparing Video For Download...