質問: hoge(fuga)となるようなのですが、 この場合、定義した時点で実行されることになると思います。 これは今回のように関数内でprint()などを使う時など、勝手に実行されて不便なことがいろいろあると思うのですが、デコレータとはこういうものなのでしょうか。 またこれなら普通に別に関数を作って呼び出すほうが楽だと感じたのですが、どのようなプログラムがデコレータを使う時に最適なのでしょうか。
回答: 関数の中の途中の処理を関数化してその関数を引数で指定することによって 好きに変えることができるという点で便利です。 普通に関数を引数にとる関数を作るのに比べてメリットは, 元の関数名と引数にとる関数名を両方書く必要がなくなるため, 見通しが良くなること。デコレータにデコレータを重ねることが できるため,途中の処理順序を入れ替えたり,一部の処理だけ 他のデコレータを入れ替えたりするだけである程度,動くことが 保証されている(引数の間違いなどがなければ)ため,デコレータ 同士の結合がしやすいということ,関数名がデコレート対象名に変える 事が出来るため,関数名から機能の区別が付きやすい事,などがあると 思います。 実際にこれを一つの関数にまとめて記述するとネストまみれの読みづらい コードになります。これを防ぐため,ネストの一つ一つをデコレータという 関数で分けて見やすくしているのだと思います。 デコレートされる関数をサンドイッチの具 デコレータをサンドイッチのパンで両側から挟むというイメージを 持たれると解りやすいかも知れません。 具を好きに取り替えられるという所が便利なのです。 作ったサンドイッチをまた具とみなすことで新しいサンドイッチ のパンで何枚でも挟めます。 具体的な例は以下の記事が参考になると思います。 時間計測テスト。文字列の埋め込みなどに対して汎用性が高いです。 Pythonのデコレータについて Pythonのデコレータを理解するための12Step