1. TOP
  2. プログラム
  3. ソフト
  4. python
  5. デコレータ

デコレータ

デコレータとは

入力として関数をひとつとり、別の関数を返す
これまで出てきたトリックの
*argsと**kwargs
関数内関数
引数としての関数を使う

document_it()関数は、
○関数名と引数を表示する
○その引数を渡して関数を実行する
○結果を表示する
○実際に使うために変更後の関数を返す
コードは
def document_it(func):
def new_function(*args, **kwargs):
print('Running function:', func.__name__)
print('Posisional arguments:', args)
print('Keyword arguments:', kwargs)
result = func(*args, **kwargs)
print('Result:', result)
return Result
return new_function

どう使うか

def add_ints(a, b):
return a + b

add_init(3,5)
8

cooler_add_ints = document_it(add_inits)
cooler_add_ints(3,5)
Running function:', add_inits
Posisional arguments:', (3,5)
Keyword arguments:', ()
Result: 8
8

@decorator_nameで良い

手作業でデコレーターの戻り値を代入しなくても、
デコレートしたい関数の直前に@decorator_nameを追加すれば変更後の動作が
得られる
@document_it
def add_ints(a, b):
return a + b

add_inits(3,5)

Start function add_inits
Posisional arguments: (3,5)
Keyword arguments: ()
Result: 8
8

デコレータは複数持てる

結果を自乗するsquare_it()をつくる
def square_it(func):
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function

関数にもっとも近い、defのすぐ上が先に実行される。

次にその上のデコレータが実行される。結果はどの順番でも同じになる
@document_it
@square_it
def add_int(a, b):
return a + b

add_ints(3,5)

Running function:', new_function
Posisional arguments:', (3,5)
Keyword arguments:', ()
Result: 64
64

デコレーターの順序を逆にしてみる

@square_it
@document_it
def add_int(a, b):
return a + b

add_ints(3,5)

Running function:', add_ints
Posisional arguments:', (3,5)
Keyword arguments:', ()
Result: 8
64