2022年10月13日木曜日

[Python] デコレータはデコレーション?

こんにちは、今日もソフトウェアについてほのぼのと記載します。

現在、Udemyにて、Python学習を行っています。

今回はデコレータについて受講したのですが、

理解しずらかったのでメモしておきます。

デコレータとは、

関数が呼び出される前に

くっついている(デコレーション的な)関数を実行する

事をいいます。

例:

def printInf(func):
    # 包み込むwrapper関数を作成
    def wrapper(*args, **kwargs)
        print(‘start’)
        result= func(*args, **kwargs)
        print(‘end’)
        return result
    return  wrapper

@printInf
def adddata(x,y):
    print(‘x+y’)
    return x+y

# adddata()関数を実行します。
#その際に、デコレータ@printInfによってprintInf()関数が実行されます。
# printInf()の引数funcとして、adddata()関数のオブジェクトが渡されます
# (c言語で言う関数ポインタと考えるとわかりやすいです。)
r= adddata(10,20)
print(‘r:’, r)

こうすることで、関数呼び出し側は
adddata()だけですが、

実際には、デコレートするかたちで

printInf()が呼ばれます。

@関数名

がデコレーション発動条件ですかね。

def wrapper(*args, **kwargs)
の*argsはだけ今回は使われているということです。

この引数は、タプルなので

C言語的に言うと、書き込み出来ない配列のようなものになります。

このデコレータの良いところは、
関数自体変えずに済むのがうれしいんだろうと思います。

変えると不具合が入り込む可能性が出てくるので、よく考えられた仕組みですね。

Guido van Rossumさん天才か


0 件のコメント:

コメントを投稿