Pythonでデコレータを使う方法

プログラミング Python

Pythonには他の言語(Javaなど)と同様にデコレータ機能を利用することができます。

デコレータは「@」の後ろに独自の名前をつけて利用することができ、既存の関数を修正することなく効率的に機能を付加(装飾)することができます。

デコレータはその名の通り「装飾する人(もの)」であり関数などを外部から装飾するのに用いられます。

スポンサーリンク

Pythonでデコレータを使う方法

Pythonではデコレータに「@」の後ろに独自の名前をつけて利用することができます。

ex. @sample_deco

作成したデコレータは装飾したい関数の前に記述します。

@f_trace
def test( x, y ):

この例では「test」という関数を「f_trace」というデコレーターで装飾します。

デコレータのソースコード

以下に具体的なデコレータを利用したソースコードです。

よくある関数の呼び出し・終了を監視する処理をデコレータとして作成し、ログとして表示させてみます。

import datetime
import time
import inspect

def f_trace( func ):
    def get_function_trace( *args, **kwargs ) :

        dt_now1 = datetime.datetime.now()
        func_name = str(inspect.stack()[ 1 ][ 4 ])
        func_name = func_name.replace( '['' , '' )
        func_name = func_name.replace( 'n']' , '' )
        print( func_name + ' 開始[' + str( dt_now1 ) +']' )
        func( *args, **kwargs )
        dt_now2 = datetime.datetime.now()
        print( func_name + ' 終了[' + str( dt_now2 ) + ']' )
        print( func_name + '処理時間[' + str( dt_now2 - dt_now1 ) + ']' )

    return get_function_trace


#デコレータを設定
@f_trace
def test( x, y ):
    print( 'Hello Decorator  x=[' + str( x ) + ']  y=[' + str( y ) + ']' )

test( 1000, 2000 )
上記ソースで

  • 「@f_trace」は関数にデコレータを設定しています。
  • def f_traceはデコレータの名前を宣言しています。引数のfuncは呼出元の関数です。
  • def get_function_traceはデコレータの具体的な処理を行っています。
  • func( *args, **kwargs )は呼出元の関数を実行しています。

実際の動作としては

  1. デコレータの処理内で開始のログが表示される。
  2. 呼出元の関数が実行される
  3. デコレータの処理内で終了のログが表示される。

という順番で処理が実施されています。

実行結果は以下の通りになります。

C:python_test>python test_decopy
test( 1000, 2000 ) 開始[2020-01-23 15:18:37.007053]
Hello Decorator  x=[1000]  y=[2000]
test( 1000, 2000 ) 終了[2020-01-23 15:18:40.017031]
test( 1000, 2000 )処理時間[0:00:03.009978]
C:python_test>

まとめ

Pythonでデコレータを上手く利用できると非常に大きなアドバンテージを持ってコーディングすることができるようになります。

ぜひ、いろいろなデコレータを作成して効率の良いプログラム開発を目指してください。

以上、Pythonでデコレータを使う方法でした。

タイトルとURLをコピーしました