要点
- Decoratorは関数をラップすることで前処理と後処理を追加できる
- 例えばあるfunctionの時間測定ならそこまで前処理と後処理は変わらないのだから、Decoratorを使うことで書くコード量を減らせる。
- 同じようなAssertionを導入したい時とかにも使えるかも?
コードサンプル
import time def time_calc(func): def timer(*args): start = time.time() output = func(*args) end = time.time() print(f'calculate time is {end-start} sec') return output return timer @time_calc def test(n: int) -> int: output = 0 while n > 1: n = n-1 output += 1 return output if __name__ == '__main__': print(test(10000000))
何が起きているか
- time_calc関数にtest()がinputされることによって、時間測定関数であるtimerの関数が新たに呼び出されるようになる
- @でくくっているtest関数を呼び出す際はtest関数本体ではなくて、timer関数が呼び出され、その中に存在するtest関数が実行される。
言葉だと微妙に分かりづらいので図にしておく
使える場所
- 時間測定などの、関数の性能測定には使える。
- Assertionと組み合わせることで、functionへのinputのチェック(壊れていないか)などにも使えるか?
- 今後実施例についてはまた別途紹介したい