デコレータ

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):
# 変更用の新しい関数を定義 def wrapper(a, b):
# まずは未変更の関数を呼ぶ return func(a, b)
# 新しい関数を返す 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):
# 渡された関数を呼ぶが、各引数を2倍にする 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関数の書き方

Passons à la pratique !

Python関数の書き方

Preparing Video For Download...