Python のデコレータの実装方法のメモ。
デコレータの定義
デコレータは以下のように定義する。
def dec(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
デコレータの使用例
@dec
def test1():
print("test1()")
return 0
デコレータ例
以下はデコレータの実装例。
@log はメソッドが実行された時刻を表示する。
@args_ret はメソッドの引数とレスポンスを表示する。
import time
def log(func):
def wrapper(*args, **kwargs):
name = func.__name__
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {name} begin")
res = func(*args, **kwargs)
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {name} end")
return wrapper
def args_ret(func):
def wrapper(*args, **kwargs):
name = func.__name__
print(f"{name} {str(args)}, {str(kwargs)}")
res = func(args, kwargs)
print(f"{name} ret: {str(res)}")
return wrapper
プログラム例
from decorator1 import log, args_ret
@log
def test1():
print('test1()')
time.sleep(1.0)
obj = 'abc'
return obj
@args_ret
def test2(a, b, arg1=None, arg2=None):
print('test2()')
obj = {'a': a, 'b': b, 'arg1': arg1, 'arg2': arg2}
return obj
test1()
test2(1, 2, arg1='abc', arg2='def')
実行結果
[2025-04-26 23:35:09] test1 begin
test1()
[2025-04-26 23:35:10] test1 end
test2 (1, 2), {'arg1': 'abc', 'arg2': 'def'}
test2()
test2 ret: {'a': (1, 2), 'b': {'arg1': 'abc', 'arg2': 'def'}, 'arg1': None, 'arg2': None}