Hello World.
LiSMOtechの久津間です。
※pythonのデコレーターについての学習メモです。
デコレーターは関数を装飾(デコレート)することができる機能です。
特定の処理を複数の関数で実行したい場合、関数に同じような処理を毎回記述するよりも、デコレーターを使ってまとめたることでコードが簡潔、簡単になります。
とはいえ、プログラムの流れを追うのが少しとっつきにくい印象で、初めの頃は慣れがいるものだと思います。
今回の記事ではpythonのデコレーターについて基礎をしっかり抑えていきます。
ちなみに、Djangoを使っている方の中では何気なく利用されている方もいるのではないかと予想しますが、ログインの制限などで「@login_required」を使うことがあると思います。こちらもデコレーターになります。
まずは理解を進めるにあたってこちらの関数を用意していきます。
import datetime
def func(f):
def wrapper():
print(f'開始: {datetime.datetime.now()} --------')
f() # testが実行される
print(f'終了: {datetime.datetime.now()} --------')
return wrapper # wrapper関数のオブジェクトを返す
@func
def test():
print('CALL test!')
test()
こちらを実行すると、以下の結果となります。
開始: 2024-03-09 15:55:11.861726 --------
CALL test!
終了: 2024-03-09 15:55:11.861777 --------
それではこちらの結果について、プログラムと一緒に解説していきます。
冒頭で少し触れましたが、test()関数の前にある@funcがデコレーターの宣言となります。
デコレーターを使用する際は、def test():などの関数に対して、前行でデコレーターを指定します。
これにより@funcの定義でtest()をデコレートします、といった宣言になります。
funcの関数はデコレーターの定義となり、引数にはデコレート対象のtest()関数が引数として渡されます。
funcの関数内部で更にwrapperという関数を宣言しており、funcの戻り値としてwrapperを返しております。
wrapper内部では、funcで引数として受け取ったtest関数をf()として実行しています。
次に引数を持つ関数の実装例をみていきます。
import datetime
def date_time(f):
def wrapper(*args, **kwargs):
print(f'開始: {datetime.datetime.now()} --------')
f(*args, **kwargs) # calcが実行される
print(f'終了: {datetime.datetime.now()} --------')
return wrapper # wrapper関数のオブジェクトを返す
@date_time
def calc(base, height):
print(base * height / 2)
calc(10, 20)
流れとしては先ほどの例と同じになりますが、calcとwrapperで引数を受け取れるようになっています。
*argsはタトルとして複数の引数を受け取ることが可能で、**kwargsは辞書として複数の引数を受け取れます。
今回の記事では関数デコレーターについて紹介でした。
慣れるまでは少しとっつきにくい気がしますが、シンプルに、関数を受け取って関数を返す関数と思っていれば良いかもしれません。
この機会に少し深ぼって使いこなしていきたいです。
NEXTGATE LiSMOtechでは中小企業を中心にブランディング・WEBマーケティングを活用したWEB戦略を提供しています。
企業課題・問題に関するご相談、WEBサイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。
平日10:00〜19:00
© NEXTGATE LiSMOtech All rights reserved