Pythonのデコレータは、関数やメソッドの振る舞いを変更するための強力なツールです。しかし、デコレータを使用すると、デコレートされた関数の元のメタデータ(関数名、ドキュメンテーション文字列など)が失われることがあります。
これを解決するために、Pythonのfunctools
モジュールはwraps
というデコレータを提供しています。wraps
デコレータは、デコレートされた関数のメタデータを保護および維持するためのものです。
以下に、wraps
を使用したデコレータの例を示します。
import functools
def my_decorator(f):
@functools.wraps(f)
def decorated_function(*args, **kwargs):
print("Before function execution")
result = f(*args, **kwargs)
print("After function execution")
return result
return decorated_function
@my_decorator
def my_function():
"""This is a simple function"""
print("Inside the function")
my_function()
print(my_function.__name__)
print(my_function.__doc__)
このコードでは、my_decorator
というデコレータを定義しています。このデコレータは、関数の実行前後にメッセージを表示します。そして、functools.wraps
を使用して、デコレートされた関数のメタデータを保持しています。
この結果、my_function.__name__
とmy_function.__doc__
は、デコレータを適用した後でも、元の関数の名前とドキュメンテーション文字列を正しく表示します。
以上が、Pythonのデコレータとwraps
についての基本的な説明です。この知識を活用して、Pythonのコードをより効率的で保守性の高いものにしましょう。