Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで関数デコレータをチェーン(連結)して使う方法

Pythonにおけるデコレータとは、いわば「ラッパー」のようなものです。関数そのもののコードを変更することなく、装飾対象の関数の実行前後に任意の処理を追加できます。

さらに、デコレータは1つの関数に対して複数を重ねて適用する(チェーンする)ことも可能です。この記事では、その基本的な使い方を具体例とともに解説します。

デコレータをチェーンするサンプルコード

以下の例では、makeboldmakeitalic という2つのデコレータを定義し、hello 関数に両方を適用しています。

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world"

print(hello())

実行結果

<b><i>hello world</i></b>

解説:デコレータの適用順序

このHTML出力をブラウザなどで表示すると、「hello world」という文字列が太字かつ斜体で表示されます。

ポイントは、デコレータは関数に近い側(下側)から順に適用されるという点です。上記の例では、まず @makeitalic が適用されて文字列が <i> タグで囲まれ、次にその結果が @makebold によって <b> タグで囲まれます。

つまり、処理の流れは次のようになります。

  1. hello() の戻り値 "hello world"makeitalic<i>hello world</i> になる
  2. その結果が makebold<b><i>hello world</i></b> になる

このように、デコレータをチェーンすることで、関数本体を一切変更せずに、複数の処理を柔軟に組み合わせることができます。ロギング、認証チェック、キャッシュ処理など、実務でも幅広く活用されるテクニックなので、ぜひマスターしておきましょう。

  1. 【Python入門】defで定義した関数をMatplotlibでプロットする方法

    Pythonでは、defキーワードで定義した自作関数を、Matplotlibを使って簡単にグラフ化できます。本記事では、ユーザー定義関数 f(x) を作成し、その結果をプロットするまでの基本手順をサンプルコード付きで解説します。 プロットまでの基本手順 defで定義した関数をプロットするには、以下の手順に従います。 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整する defを使ってユーザー定義関数 f(x) を作成する NumPyを使って x のデータ点を生成する plot()メソッドで x と f(x) をプロットする show()メソッドで図を画面に表示する サ

  2. Pythonで対数ヒストグラムを作成する方法【matplotlib活用】

    Pythonのmatplotlibを使って対数(ログ)スケールのヒストグラムを作成するには、hist()メソッドの引数にlog=Trueを指定します。これにより、縦軸が対数スケールで表示され、値の範囲が大きく異なるデータも見やすく可視化できます。作成手順数値のリスト(配列)を用意します。density=Trueを指定して、正規化されたヒストグラムをプロットします。図を表示するには、show()メソッドを呼び出します。サンプルコードimport numpy as np import matplotlib.pyplot as plt plt.rcParams[figure.figsize] = [