9ユーザー定義関数
8章に続き定義関数について

章をまたぐということは大事なことなんでしょう。

9.1デコレーター
デコレーター(関数デコレーター)とは  既存の関数に機能を追加するための仕組みです。

理解するのが難しいらしく、まずデコレーターを使わないのを見て比べながら勉強します

9.1.1デコレーターを利用しない例
>>> def log_func(func): ... def inner(*args, **keywds): ... print('------------------') ... print(f'Name: {func.__name__}') ... print(f'Args: {args}') ... print(f'Keywds: {keywds}') ... print('------------------') ... return func(*args, **keywds) ... return inner ... >>> def hoge(x, y, m='bar', n='piyo'): ... print(f'hoge: {x}-{y}/{m}-{n}') ... >>> # log_func関数の戻り値を実行 >>> log_hoge = log_func(hoge) >>> log_hoge(15, 37, m='ほげ', n='ぴよ') ------------------ Name: hoge Args: (15, 37) Keywds: {'m': 'ほげ', 'n': 'ぴよ'} ------------------ hoge: 15-37/ほげ-ぴよ
  1. 1.log_func関数の定義: log_func関数は引数として関数(func)を受け取ります。これはデコレーターが動作する方法です。デコレーターは他の関数を引数として受け取り、その関数をラップする新しい関数を生成します。

  2. 2.inner関数の定義: log_func関数の内部には、innerという新たな関数が定義されています。このinner関数はfuncが呼び出されるたびに実行されるコードをラップします。

  3. 3.inner関数の中で、まず関数の名前(func.__name__)、引数(args)、キーワード引数(keywds)を表示しています。これらの情報は関数の呼び出しに関する有用なデバッグ情報を提供します。

  4. 4.次にinner関数は、元のfunc関数を呼び出し、その結果を返します。ここで*args**keywdsを使用して、inner関数に渡された任意の引数やキーワード引数をfuncにそのまま渡します。

  5. 5.最後に、log_func関数はinner関数自体を返します。これにより、log_func(func)は元のfuncと同じ引数を取ることができ、同じ値を返す新しい関数を生成します。しかし、その関数が呼び出されるたびに、追加のログメッセージが表示されます。

  6. 6.hoge関数の定義: ここで、hoge関数はlog_func関数を使ってデコレートされます。つまり、hoge関数の呼び出しはlog_funcによってラップされ、その結果、hoge関数が呼び出されるたびにログメッセージが表示されます。

  7. 7.log_hoge関数の実行: ここでlog_hoge関数を実行します。これは、hoge関数をlog_func関数でラップした結果を実行するものです。結果として、関数の名前、引数、キーワード引数が表示され、その後にhoge関数の出力が表示されます。


高級関数とは
他の関数を引数として受け取る
他の関数を結果として返す

というものらしいです。