Python デコレータの理解: ディープダイブ

Barbara Streisand
リリース: 2024-10-30 08:22:28
オリジナル
366 人が閲覧しました

Python デコレータは、関数やメソッドの動作を変更または強化できる強力なツールです。一般的な使用例には、ロギング、認可などが含まれます。
しかし、デコレータを定義するように求められると、多くの人は

と言うかもしれません。

これは関数のラッパーです。

これは技術的には正しいですが、内部ではさらに多くのことが起こっています。

シンプルなデコレータの分析
簡単な例を見てみましょう:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")
ログイン後にコピー

ここで、my_decorator は関数say_hello のデコレータです。 Say_hello が定義されると、自動的に my_decorator に渡され、関数呼び出しが次のように変換されます。
Say_hello = my_decorator(say_hello)

この変化はいつ起こりますか?
この変換はコードのコンパイル中、特に実行時ではなく関数定義時に発生します。

コードの逆アセンブル
デコレータが下位レベルでどのように動作するかを理解するには、dis モジュールを使用してデコレータ関数のバイトコードを調べることができます。

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)
ログイン後にコピー

バイトコードの内訳

dis.dis(say_hello) の出力は次のようになります:

Understanding Python Decorators: A Deep Dive
バイトコードの説明

  1. 関数を呼び出す前

    • LOAD_GLOBAL: 印刷関数をロードします。
    • LOAD_CONST: 「関数を呼び出す前に」メッセージをロードします。
    • CALL_FUNCTION: 呼び出しを印刷します。
    • POP_TOP: 戻り値を破棄します。
  2. 元の関数の呼び出し

    • LOAD_DEREF: クロージャによってキャプチャされた元の関数 (func) をロードします。
    • LOAD_FAST: 位置引数とキーワード引数をロードします。
    • BUILD_MAP: キーワード引数の新しい辞書を作成します。
    • CALL_FUNCTION_EX: 引数を指定して元の関数を呼び出します。
    • STORE_FAST: 結果をローカル変数に保存します。
  3. 関数呼び出し後

    • 最初の部分と同様に、print を呼び出して「関数呼び出し後」を出力します。
    • 結果を返す
    • 結果変数をロードして返します。

結論
Python デコレーターは単なる関数ラッパーではありません。これらにより、定義時に関数の動作を変更できるようになります。デコレータがどのように機能するかを理解し、バイトコードを調べることで、プロジェクトでデコレータをより効果的に使用できます。

今回はここまでです!他に詳しく知りたいことがあれば、ぜひお知らせください。

以上がPython デコレータの理解: ディープダイブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!