Pythonのデコレータとラッパーは、コードの再利用性を高め、管理しやすくするために使用されます。以下に、それぞれの基本的な使用方法を示します。
デコレータ
デコレータは他の関数の機能を変更したり拡張したりすることができる関数です。以下に、デコレータの基本的な使用方法を示します。
def my_decorator(func):
def wrapper():
print("start")
func()
print("end")
return wrapper
@my_decorator
def say_hello():
print("hello")
say_hello()
上記のコードでは、my_decoratorというデコレータを定義し、say_helloという関数に適用しています。
ラッパー
ラッパーは、元の関数の前後に処理を追加したり、引数や結果を細工することができます。以下に、ラッパーの基本的な使用方法を示します。
def wear_mask(func):
def wrapper(COVID_19_flg):
if COVID_19_flg:
COVID_19_flg = False
return func(COVID_19_flg)
return wrapper
def infected(COVID_19_flg):
if COVID_19_flg:
return 'infected'
else:
return 'uninfected'
func_1 = wear_mask(infected)
print(func_1(True)) # マスクしているのでuninfected
上記のコードでは、wear_maskというラッパーを定義し、infectedという関数に適用しています。
@wrapsデコレータ
@wrapsデコレータは、Pythonのfunctoolsモジュールから提供されており、他のデコレータと組み合わせて使用することで、関数のメタデータ(ドキュメンテーション文字列、関数名など)を維持および更新するのに役立ちます。
import functools
def hoge_decorator(f):
@functools.wraps(f)
def hoge_wrapper(*args, **kwargs):
print("デコレータだよ")
return f(*args, **kwargs)
return hoge_wrapper
@hoge_decorator
def hoge_function():
print("これがデコってる関数だ!")
hoge_function()
print(hoge_function.__name__) # hoge_function
print(hoge_function.__doc__) # デコってる関数のDocstringだよ
上記のコードでは、hoge_decoratorというデコレータに@functools.wrapsを適用し、hoge_functionという関数に適用しています。
以上、Pythonのデコレータとラッパーについての基本的な説明でした。これらの概念を理解し、適切に使用することで、Pythonプログラミングの効率と可読性を向上させることができます。