洋書、時々プログラミング

博士課程修了→メーカーという経路を辿っている人の日常

Python3のDecoratorに関するメモ

要点

  • 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))

何が起きているか

  1. time_calc関数にtest()がinputされることによって、時間測定関数であるtimerの関数が新たに呼び出されるようになる
  2. @でくくっているtest関数を呼び出す際はtest関数本体ではなくて、timer関数が呼び出され、その中に存在するtest関数が実行される。

言葉だと微妙に分かりづらいので図にしておく

f:id:aguux:20210201211006p:plain
Decoratorの挙動

使える場所

  • 時間測定などの、関数の性能測定には使える。
  • Assertionと組み合わせることで、functionへのinputのチェック(壊れていないか)などにも使えるか?
  • 今後実施例についてはまた別途紹介したい