LoginSignup
0
0

More than 5 years have passed since last update.

デコレータでデコレーション

Last updated at Posted at 2015-10-26

デコレータ

デコレータは、既存の関数に何か追加動作を加える感じのもの。
例えば、実行時間を測って出力したり、"〜〜関数が実行されました"とかのメッセージを付け加えたりできます。

サンプル

今回は、出力にメッセを付け加えるものと実行時間計測を作りました
作ったコード:https://github.com/KodairaTomonori/Qiita/tree/master/default_module/syntax

メッセージを付け加える

decoration.py
deco =  '。+゚+。・゚・。+*+。・★・。+*+。・===[ '
deco_end = deco.replace('[', ']')[::-1]
deco_result = [' ∧____∧  結果を', '( `Д´ )    出力するぞ', '(っ▄︻▇〓┳═ ', '/   )', '( / ̄∪']

def deco_func(func):
    def decoration(*args, **kwargs):
        print(deco + 'start   ' + func.__name__ + deco_end)
        for i in range(len(deco_result) ):
            if i != 2: print(deco_result[i])
            else: print(deco_result[i], func(*args, **kwargs) )
        print(deco + 'end     ' + func.__name__ + deco_end)
    return decoration

@deco_func
def addition(a, b):
    return '{} + {} = {}'.format(a, b, a + b)

if __name__ == '__main__':
    addition(103842, 283746)

出力

スクリーンショット 2015-10-27 2.02.23.png

デコレータは、deco_func関数は、関数内で作ったdecoration関数を返すものになってます。
decorationは、始まりと終わりをprintして出力を飾っています。
func.__name__で、関数名を取得できます。
また、(*args, **kwargs)とすることで、大体の関数に対応できるようになってます。

デコレータとして使う場合には、関数の前に@deco_funcを付け加えるだけです。
こうすることで、addition = deco_func(addition)(a, b)となるわけです。

時間計測

timer.py
#usr/bin/python

import time

def timer(func):
    def print_time(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        print(func.__name__ + \
            'の実行にかかった時間は{}秒です'.format(time.time() - start) )
    return print_time

@timer
def roop_timer(a):
    return roop(a)

def roop(a):
    sum_ = 0
    for i in range(a):
        sum_ += i
    return sum_

if __name__ == '__main__':
    roop_timer(10000)
    timer(roop)(10000)

出力

output.txt
roop_timerの実行にかかった時間は0.0008311271667480469秒です
roopの実行にかかった時間は0.0008249282836914062秒です

print_timeでは、時間を計って、その結果を出力しています。
func.__name__は、関数名をとってきてくれます。
@timerを一部にしか反映させたくない場合は、timer(roop)(10000)とすることで、同じ動作をすることになる。
また、roop_timerのようにそれ専用の関数を作っても可能(二つ以上つかう時はこれ作ったほうが楽)。

まとめ

@decorate_functionを付け加えることで、簡単に関数に他の機能を付け加えることができる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0