Python デコレータ: 関数のラッピングと変更

関数の動作を動的に変更するための Python デコレーターを学習します。ラッパー関数、@ 構文、デコレーターでの引数の処理を理解します。

エディターで試してみる

概要

デコレータは、Python の最もエレガントで強力なデザイン パターンの 1 つです。これにより、開発者はソース コードを永続的に変更することなく、関数、メソッド、またはクラスの動作を変更または拡張できます。デコレーターは、前処理ステップと後処理ステップを実行するために別の関数内に関数をラップするものと考えてください。これにより、デコレータは、ロギング、タイミング、検証、アクセス制御などの横断的な問題の実装に最適になります。

Python 関数は第一級市民であるため、デコレーターは中核的に機能します。これは、関数を引数として他の関数に渡したり、関数から返したり、変数に割り当てたりできることを意味します。デコレータは、別の関数を引数として受け取り、元の関数と追加のロジックを実行するネストされたラッパー関数を定義し、このラッパー関数を返して元の関数を置き換える単純な関数です。

デコレータの適用をシンプルかつクリーンにするために、Python ではターゲット関数定義のすぐ上に配置される `@decorator_name` 構文シュガーが提供されています。装飾された関数を呼び出すと、Python は代わりにラッパーを呼び出します。関数がパラメータを受け入れる場合、ラッパーは任意の引数 (`*args` と `**kwargs`) を受け入れ、それらを適切に転送する必要があります。デコレータを理解すると、高度にモジュール化された、クリーンで DRY (Don'trepeat Yourself) コードを作成できるようになります。

コードと実行の出力

関数実行の詳細を追跡し、ログに記録するカスタム デコレータ。

def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
端子出力
Calling multiply with args: (5, 4)
multiply returned: 20

段階的な実装

  • パフォーマンス モニターへのランタイム メトリックのログ記録
  • ルートに対する認証と認可のチェックを強制する
  • 高価な計算結果のキャッシュまたはメモ化

よくある質問

デコレーターは引数をどのように処理するのでしょうか?

ネストされたラッパー関数で *args と **kwargs を使用すると、位置パラメーターまたはキーワード パラメーターを受け取り、ラップされた関数に転送できるようになります。

1 つの関数に複数のデコレータを適用できますか?

はい、積み重ねることができます。これらは上から順に実行されます (最も内側から最も外側のラップ)。

関連トピック

推奨される Python リソース

関連するインタラクティブなチュートリアル、チートシート、コード比較で知識を深めてください。