Python学習【365日チャレンジ!】303日目のマスターU(@Udemy11)です。
昨日また近くのスーパーで大きなアジが150円で売っていたので、またまた買ってしまいました。
今回は、フライではなく、アジの開きにして一夜干しとみりん干しを作ってみましたが、これまた旨味が凝縮されて美味しかったのですが、ちょっと気になることが。。。
若干目が曇っていたので、新鮮ではないのかなぁとおもいつつ、津本式の血抜きをしてもなかなか血が抜けませんでした。
で、3枚に下ろしてみると、中のほうが凍っている感じがしたので、もしかしたら、前回のセールで売れ残ったのを冷凍してから解凍したアジを販売してるんじゃないの?なんて思ってしまいました。
ま〜美味しかったので、いいんですけど〜。
それでは今日も、Python学習を始めましょう。
昨日の復習
昨日は、cacheを使って処理を高速化するlru_cache
を学習しました。
lru_cache
を使うことで、処理に時間がかかる関数の実行結果を保存しておいて、再利用して処理を高速化することができました。
処理結果をキャッシュに一時的に保存しておくことでサーバーの負担を減らしたり、処理を待つユーザーのストレスを減らしたりすることができるので、キャッシュは、ブラウザーをはじめ、様々なシーンで活用されています。
lru.cache
の使い方については、昨日の記事をごらんください。
今日は、デコレーターを使った時にdocstring
の表示を操作できるfunctools.wraps
を学習します。
デコレーターの復習
Pythonのバージョンが上がるたびに便利な機能が追加されてモジュール化されていきますが、functools.wraps
は、デコレータを使った時に、実行関数のドキュメントを表示するためのモジュールです。
まずはデコレーターを復習しましょう。
def d(f):
def w():
print('decorator')
return f()
return w
@d
def test():
print('test')
test()
引数f
を取る関数d
を定義して、その中にdecorator
と出力したあと関数d
の引数f
を関数として返す関数w
を定義して、関数d
の返り値をw
とするのがデコレーターです。
7行目に関数d
をデコレーターにして、test
と出力するtest
関数を定義しています。
最後の11行目で関数test
を実行します。
出力結果
decorator
test
最小限のコードなので、decorator
とtest
が出力されているだけですが、実行する関数の前後に処理をさせることができました。
functools.wraps
先程のかんたんなコードの関数test()
にドキュメンテーションを記述して、それを出力しようとしてもデコレーターが関係して、出力することができません。
def d(f):
def w():
print('decorator')
return f()
return w
@d
def test():
"""test docstring"""
print('test')
print(test.__doc__)
出力結果
None
関数test
に書いたdocstring
は、test.__doc__
で出力できるはずですが、None
が返されました。
3行目に"""wrapper docstring"""
と記述して、再度実行してみると、wrapper docstring
と表示されます。
こんな時に、実行関数のドキュメンテーションを出力できるのが、functools.wraps
です。
これまでに記述したコード1行目にimport functools
と3行目にfunctools.wraps
を記述することで、デコレーターのdocstring
ではなく、実行関数のドキュメントに記述してあるtest docstring
が出力されるようになります。
まとめ
Python学習の初心者に撮っては、デコレーターがややこしいし、さらにdocstring
となると、あまり興味をそそられないかもしれません。
とはいえ、企業案件などでは細かくdocstring
の記述を求められることもあるらしいので、今回学習した内容は、とりあえず頭の片隅に残しておいてください。
ということで、明日もGood Python!