見出し画像

2024-4-10「デコレーターがやること」

Pythonにはデコレーターという機能があります。

デコレーターは、関数やメソッドの動作を変更するための強力なツールです。

つかいかたは適用したい関数の直前に「@」をつけて記述するだけです。

@my_decorator
def say_hello():
    print("こんにちは!")

この例では「say_hello」という関数に「my_decorator」というデコレータが適用され、say_helloを呼び出す際に便利機能が付与されるような動作をさせることができます。

デコレーターはログを出力したり、実行時間を計測したり、パラメータを検証したり、ユーザーアカウントを検証したりさまざまな機能を簡単に関数に追加することができます。

この便利なデコレーターは、「関数を受け取り」「関数を返す」関数として定義されています。

引数としてべつの関数をうけとり、その関数をラップする新しい関数を返します。

def my_decorator(func):
    def wrapper():
        print("何か前処理を行う。")
        func()
        print("何か後処理を行う。")
    return wrapper

うけとった関数funcは、関数内で実行するのがデコレーターの動作としては自然ですが、別に実行する必要はありません。「初回の一回だけ実行する」のような動きをしてもかまいませんし、「条件を満たしたときだけ実行する」でもかまいませんし、「受け取っただけで絶対に実行しない」でもかまいません。

デコレーターがつけられた関数funcはデコレーターの動作に置き換えられてしまうので、「絶対に実行しない」デコレーターだった場合、もうこの関数funcを実行する手段がなくなってしまいます。まさに、生殺与奪を握られるというのはこのことです。

「デコレーター」という「かざりつけ」を担っている機能がこれだけの強権を持っているというのは最初驚きましたが、このくらい強権がないと便利な「デコレート」を設計することはできないのだろうと思います。

「コミカライズ」とか「アニメ化」とか「ドラマ化」とか「ゲーム化」とか、あるいは「ローカライズ」なんかでも、もとの媒体をがっつりと取り込まないとできないのだろうということも。それを思い出したりしました。

もとの媒体の作者からすると、自分の作ったものを生殺与奪すべてゆだねないといけないというのは、自分の一部を渡すようなものであるのでしょう。

デコレーションする方からするととんでもない大仕事であるということ、簡単にできることではないのはよくわかります。

そのあたりが双方理解できてない場合に問題が起きるんじゃないかと思ったりしました。

この記事が気に入ったらサポートをしてみませんか?