基本的なデコレータの理解
このステップでは、デコレータの概念とその基本的な使い方を紹介します。デコレータとは、別の関数を引数として受け取り、何らかの機能を追加して別の関数を返す関数であり、元の関数のソースコードを変更することなくこれを行います。
まず、WebIDE の左側にあるファイルエクスプローラーでファイル decorator_basics.py を見つけます。ダブルクリックして開いてください。このファイルに最初のデコレータを記述します。
以下のコードを decorator_basics.py にコピー&ペーストしてください。
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
このコードを詳しく見てみましょう。
- 関数
func を引数として受け取るデコレータ関数 log_activity を定義します。
log_activity の内部で、ネストされた関数 wrapper を定義します。この関数が新しい振る舞いを保持します。ログメッセージを出力し、元の関数 func を呼び出し、その後別のログメッセージを出力します。
log_activity 関数は wrapper 関数を返します。
greet 関数の上にある @log_activity 構文は、greet = log_activity(greet) のショートカットです。これにより、デコレータが greet 関数に適用されます。
次に、ファイルを保存します(Ctrl+S または Cmd+S を使用できます)。スクリプトを実行するには、WebIDE の下部にある統合ターミナルを開き、次のコマンドを実行します。
python ~/project/decorator_basics.py
以下のような出力が表示されます。日時は実行ごとに異なります。
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
出力には 2 つの点に注目してください。第一に、greet 関数がログメッセージでラップされていることです。第二に、関数の名前と docstring が wrapper 関数のものに置き換わってしまっていることです。これはデバッグやイントロスペクション(introspection)において問題となる可能性があります。次のステップでは、これを修正する方法を学びます。