今回は、pythonのデコレータについてまとめてみます。
1. デコレータとは
デコレータは、関数のコードを変えずに、処理を追加したり変更したりできる関数です。組み込みで用意されているものもありますが、自作することもできます。
例えば、機密データをクエリするAPI、社内ドキュメントにアクセスするAPIがあるとします。これらのAPIは、はじめに認証を行い、正しいリクエストだった場合のみ、データを返したり、ドキュメントを参照したりする仕様にします。これを各々の関数で行うとき、以下のような処理の流れになります。
def query_data():
# ①認証処理
# ②クエリ
def load_document():
# ①認証処理
# ②ドキュメントの読み込み
しかし、認証が必要となる全ての関数で、認証処理を書くのは億劫です。そこで、認証処理の部分を、デコレータを使って、共通化することができます。
def authorize():
# 認証処理
@authorize
def query_data():
# クエリ
@authorize
def load_document():
# ドキュメントの読み込み
2. デコレータを使うメリット
デコレータを使うと、先述の通り、重複コードを排除したり、共通処理を分離することでコードの再利用性を高めることができます。また、デコレータを使うことで、その処理の内容を一目で把握できるようになり、可読性が上がったり、修正コストの削減やテストの簡素化によって、保守が簡単になります。
3. デコレータの作り方
今回は、a + bの結果を返すaddメソッドに、「処理をはじめます」「処理が終わりました」という文字列を出力するデコレータを加えます。
※ コメントで解説を入れます
# pre_postの引数に、add()を受け取る
def pre_post(func):
# add()が受け取った引数を、wrapper()で受け取る
def wrapper(*args, **kwargs):
print('処理をはじめます')
# pre_post()で受け取った関数(add)を実行する
func(*args, **kwargs)
print('処理が終わりました')
return wrapper
@pre_post
def add(a, b):
result = a + b
print(f'result: {result}')
add(3, 5) # 出力:処理をはじめます/ 8 / 処理が終わりました
4. 最後に
とってもわかりやすかった動画を貼っておきます。