1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新人エンジニアが、Pythonのデコレータに苦しんだので勉強してみた

Posted at

今回は、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. 最後に

とってもわかりやすかった動画を貼っておきます。

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?