目次

目次

Lambda Python の共通処理プラグイン化

高橋克幸
高橋克幸
最終更新日2018/04/25 投稿日2018/04/25

Lambdaで共通処理の続きです。 デコレーターで共通処理が行えるようになったので、共通処理をプラグイン化しました。 これで、デコレーターに プラグイン情報(クラス情報)を定義することで既存のコードを変更せずに、処理を追加できるようになりました。

デコレーターの実装

from common.plugin import Plugin
plugins = [
   {
       'from': 'common.plugin.hello_plugin',
       'class_name': 'HelloPlugin'
   }
]

plugin_instances = None

def load_plugins():
   global plugin_instances
   if plugin_instances is not None:
       return
   plugin_instances = []
   for plugin in plugins:
           mod = __import__(plugin['from'], fromlist=[plugin['class_name']])
           cls = getattr(mod, plugin['class_name'])
           obj = cls()
           if issubclass(obj.__class__, Plugin):
               plugin_instances.append(obj)
           else:
               raise TypeError()

def pre_processing(data):
   if plugin_instances is None:
       return data
   for plugin in plugin_instances:
       data = plugin.pre_processing(data)
   return data

def post_processing(response):
   if plugin_instances is None:
       return response
   for plugin in plugin_instances:
       response = plugin.post_processing(response)
   return response

def decorator(func):
   import functools
   @functools.wraps(func)
   def wrapper(*args, ** kwargs):
       data = pre_processing({'event': args[0], 'context': args[1]})
       response = func(*(data['event'], data['context']), **kwargs)
       response = post_processing(response)
       return response
   return wrapper

__init__.py でモジュールの初期化

from common.decorator import *
load_plugins()

プラグインの基底クラス実装

from abc import ABCMeta, abstractmethod

class Plugin(metaclass=ABCMeta):
   @abstractmethod
   def pre_processing(self, data):
          pass

   @abstractmethod
   def post_processing(self, response):
          pass

全てのレスポンスボディを ‘Hello World’ にするプラグインの実装

import json
from common.plugin import Plugin

class HelloPlugin(Plugin):
   def __init__(self):
       pass

   def pre_processing(self, data):
       pass

   def post_processing(self, response):
       return response['body'] = 'Hello World'

高橋克幸

新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。

目次