🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5300閲覧

デコレータを複数用いるとわからなくなってしまいます

rink

総合スコア80

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/04 10:34

編集2019/11/04 10:59

デコレータが分かりません。以下がコードです。

python

1def deco_html(func): 2 def wrapper(*args, **kwargs): 3 res = '<html>' 4 res += func(*args, **kwargs) 5 res += '</html>' 6 return res 7 return wrapper 8 9def deco_body(func): 10 def wrapper(*args, **kwargs): 11 res = '<body>' 12 res += func(*args, **kwargs) 13 res += '</body>' 14 return res 15 return wrapper 16 17@deco_html 18@deco_body 19def test(): 20 return 'Hello,world!' 21 22print(test())

この実行結果が

python

1<html><body>Hello,world!</body></html>

となる理由が分かりません。なぜ<body>が中に入ってくるのかを教えていただけるとありがたいです。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私はPythonに関してわからないことがあるとき、よくドキュメントを読みます。

言語それ自体の仕様を確認したいときは、たいてい「言語リファレンス」を見に行けば良いです。構文の定義や基本的な言語仕様はだいたいここに書いてあります。

Python 言語リファレンス — Python 3.8.0 ドキュメント

デコレータは関数定義の一部なので、8.6の関数定義を見てみます。すぐにドンピシャの記述が見つかりました。

関数定義は一つ以上の デコレータ 式でラップできます。デコレータ式は関数を定義するとき、関数定義の入っているスコープで評価されます。その結果は、関数オブジェクトを唯一の引数にとる呼び出し可能オブジェクトでなければなりません。関数オブジェクトの代わりに、返された値が関数名に束縛されます。複数のデコレータはネストして適用されます。例えば、以下のようなコード:

python

1@f1(arg) 2@f2 3def func(): pass

は、だいたい次と等価です

python

1def func(): pass 2func = f1(arg)(f2(func))

ただし、前者のコードでは元々の関数を func という名前へ一時的に束縛することはない、というところを除きます。

8.6. 関数定義 | 8. 複合文 (compound statement) — Python 3.8.0 ドキュメント

特に解説は不要と思いますが、デコレータはネストされて解釈されるということ、つまりまずは下の(関数定義本体に近い)デコレータによってデコレートされたあと上の(関数定義から遠い)デコレータでデコレートされるということを理解すれば良いでしょう。

投稿2019/11/04 13:05

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rink

2019/11/04 13:56

ご回答ありがとうございます! とても分かりやすくて、助かりました! ドキュメントをみるという考えがありませんでした…。 頑張ります!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問