Pythonのデコレーターにfunctools.wrapsを使ってみましょう2020-12-01Pythonのデコレーターにfunctools.wrapsを使ってみましょうPythonお悩み解決こんにちは。PyQチームのtsutomuです。今回は、functools.wrapsを設定するメリットを紹介します。質問PyQでデコレーターとは「関数を修飾(デコレート)する」「デコレートすることで、機能を追加したり、情報を付加できる」ことがわかりました。最近functools.wrapsというデコレーターを知ったのですが、これはどのような効果があるのでしょうか。回答functools.wrapsを設定することで以下のことができます。ドキュメント以下の解説ではfunctools.wrapsを設定することでどんなメリットがあるのか、もう少し掘り下げて紹介します。改良前のデコレーターこちらは、PyQのクエスト「デコレーターの使い方を学ぼう」に出てくるデコレーターです。wrapperこのデコレーターを使うと、関数の実行前に「(関数名)を実行します」と表示します。実行します」と表示されます。print(message)talk('ごきげんよう')さて、デコレーターは、いくつでも指定できます。print(message)talk('ごきげんよう')上記を実行すると、下記の出力になります。実行しますごきげんようshow_func_name(talk)の関数名がwrapperになっています。期待する動作とは違いますね。?@show_func_nameが1つのとき:talk関数の実態はwrapperです。funcはtalkなので「talkを実行します」と表示します。@show_func_nameが2つのとき:talk関数の実態はwrapperです。funcもwrapperなので「wrapperを実行します」と表示します。下記のように修正しましょう。違いは@wraps(func)が追加されているところです。実行しますが2回出力されます。デコレーターfunctools.wrapsがあることで、「@show_func_nameでデコレートした関数の名前」を「オリジナルの関数の名前(talk)」に設定するからです。他にも、オリジナルのdocstringを設定してくれたりします。簡単に使えて、かゆいところに手が届きますので、是非@wrapsを使ってみましょう。このお悩み解決に関連するクエストこのお悩み解決はPyQのクエスト「デコレーターの使い方を学ぼう」の補足情報として作成しています。11:57このブログはPyQ開発スタッフが運営しています。技術書1冊分の価格ではじめるPython独学プラットフォームです。Pythonの基本から機械学習・データ分析まで、実際にコードを書きつつブラウザだけで学べます。Pythonお悩み解決で紹介しているような疑問が解決できるプラン(スタンダードプラン)もあるので、プログラミング学習をサポートする先輩プログラマーのような存在が必要になったときには、是非検討してみてくださいね。»Python学習チャンネルPython独学プラットフォームPyQ(パイキュー)の公式ブログです。PyQのリリース情報やカリキュラム紹介だけでなく、プログラミング学習者向けにPythonのQ&A、プログラミング学習tipsなどを配信しています。reserved.引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。