def show_func_name(func):
def wrapper(*args, *kwargs):
print(func.name, ‘を実行します’)
return func(args, **kwargs)
return wrapper
if name == ‘main‘:
print(‘関数名’, len.name) # ‘関数名 len’と出力
new_len = show_func_name(len)
new_len([]) # ‘len を実行します’と出力
関数の中に関数を定義して、その定義した関数を返すことにより、「実行すると関数を返す関数」が作成できます
ここで def wrapper(*args, *kwargs): となる理由
デコレータを実装する場合は *args
, **kwargs
は必要。
理由は、デコーレータを付ける対象の関数は自由なため、デコレータの実装時には引数を決められないため。だそうです。
ログイン - Pythonのオンライン学習サービスPyQ(パイキュー)
@を使った方法
from decorator1 import show_func_name
@show_func_name
def talk(message):
print(message)
関数show_func_nameは、decorator1.pyで以下のように定義されている場合には、このように@を使って使用できる。
他の方法
def talk(message):
print(message)
talk = show_func_name(talk)
コメント