Python でデコレーターに指定したキーワード引数をメソッド側で使用する方法【デコレート入門】【サンプルコードあり】

4 min

Pythonにはデコレートという機能があり、この機能をうまく活用することでデコレートするだけでログ出力するデコレーターなど多くの便利機能が実装出来きます。

本記事では、デコレーターの基本的な使用方法をサンプルコード交えて紹介します。

最後まで読むとデコレーターに指定した引数をメソッド側で使用する方法が解ります。

広告_零号機

【基本形】引数なしデコレーターのサンプルコード

ここでは、引数なしデコレーターのサンプルコードを紹介します。

【デコレーターの処理概要】
メソッドが出力した文字列の先頭に”– start –“、末尾に”– end –“を付与する

import os

def getNewline():
  '''
  実行OS に合わせて改行コードを取得
  Windows -> \r\n
  LINUX  -> \n
  '''
  if os.name == 'nt':
    # windows の場合
    return "\r\n"
  else:
    return "\n"

def deco_test1(func):
  def wrapper(*args, **kwargs):
    _out = "-- start --" + getNewline()
    _out = _out + func(*args, **kwargs) + getNewline()
    _out = _out + "--  end  --"
    return _out
  return wrapper

# 開始と終了の印を付与するデコレーター
@deco_test1
def test():
    return 'Hello Decorator!'

# デコレーターを付与したメソッドを実行
print(test())

この部分がデコレーターです。

print(test()) でデコレーターを付与したメソッドの実行結果を出力しています。

下記が出力されます。

test() が出力した文字列の先頭に”– start –“と、末尾に”– end –“が付与されていることが解ります。

【応用1】引数ありデコレーターのサンプルコード

つぎに、引数ありのデコレーターのサンプルコードを紹介します。

【デコレーターの処理概要】
メソッドが出力した文字列の先頭にデコレーターの第一引数、末尾に第二引数を付与する

def deco_test2(_decarg1, _decarg2):
  def _deco_test1(func):
    def wrapper(*args, **kwargs):
      _out = _decarg1 + getNewline()
      _out = _out + func(*args, **kwargs) + getNewline()
      _out = _out + _decarg2
      return _out
    return wrapper
  return _deco_test1

# 開始と終了の印を付与するデコレーター
@deco_test2("開始", "終了")
def test_1():
    return 'Hello Decorator!'

print(test_1())

この部分がデコレーターです。

print(test_1()) でデコレーターを付与したメソッドの実行結果を出力しています。

下記が出力されます。

test_1() が出力した文字列の先頭にデコレーターの第一引数に指定した”開始”と、末尾に第二引数に指定した”終了”が付与されていることが解ります。

【応用2】デコレーターに指定したキーワード引数をメソッドで使用するサンプルコード

つぎに、デコレーターで指定した引数をメソッドで使用するサンプルコードを紹介します。

【デコレーターの処理概要】
デコレーターに指定したキーワード引数をメソッドへの引数として使用する

def decfunc(_test):
  return "***" + _test + "***"

def deco_test3(*args,**kwargs):
  def _deco_test1(func):
    def wrapper():
      _out = "<dec>" + getNewline()
      _out = _out + func(*args, **kwargs) + getNewline()
      _out = _out + "</dec>"
      return _out
    return wrapper
  return _deco_test1

@deco_test3(_intest=decfunc("Hello Decorator!"))
def test_2(_intest):
  return _intest

print(test_2())

この部分がデコレーターです。

デコレーターに”_intest”という名称で指定したキーワード引数をtest_2()で使用しています。

print(test_2()) でデコレーターを付与したメソッドの実行結果を出力しています。

下記が出力されます。

デコレーターに指定したキーワード引数を使用していることが解ります。

【応用3】複数のデコレーターを入れ子で使用するサンプルコード

最後に複数のデコレーターを入れ子で使用するサンプルコードを紹介します。

@deco_test1
@deco_test2("開始", "終了")
@deco_test3(_intest=decfunc("Hello Decorator!"))
def test_3(_intest):
  return _intest

print(test_3())

この部分がデコレーターです。

print(test_3()) で複数のデコレーターを付与したメソッドの実行結果を出力しています。

下記が出力されます。

これまで紹介した3つのデコレーターが実行されていることが解ります。

まとめ

本記事では、デコレーターの基本的な使い方を中心にサンプルコードを交えてデコレートに指定したキーワード引数をメソッド側で使用する方法を紹介しました。

ご参考になりましたら twitter をフォローして SNS でシェアして頂ければ幸いです。

広告_零号機-エリア2
kewton

kewton

大学院卒業後、某大手SIerで10年以上SEとして従事。
社会人3年目までに基本情報・応用情報技術者、データベーススペシャリスト、簿記3級・2級を取得。
基幹系システム・IoTシステム開発のプロジェクト経験多数。AI活用システムの企画・プロト開発経験あり。
強みは、プロマネだけでなく自身で開発も実施してきたこと。
【扱える言語】
C#、java、python、javascript、Excel VBA
【扱えるDB】
oracle、sql server、postgreSQL、mongoDB

FOLLOW

カテゴリー:
関連記事

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA