デコレータの重ね掛け
次のコードを実行したときの出力として、正しいものを1つ選べ。
def a(f):
return lambda: "A" + f()
def b(f):
return lambda: "B" + f()
@a
@b
def f():
return "x"
print(f())
- A
BAx - B
x - C
AB - D
ABx
正解と解説を見る
正解:D
複数のデコレータは、下から順に適用される(@a @b def f は f = a(b(f)))。呼び出しでは、外側から順に実行される。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `def a(f):` | — |
| 2 | `def b(f):` | — |
| 3 | `@a` | — |
| 4 | `@b` | — |
| 5 | `def f():` | — |
| 6 | `@b` | — |
| 7 | └ `return lambda: "B" + f()` | — |
| 8 | `@a` | — |
| 9 | └ `return lambda: "A" + f()` | — |
| 10 | `def f():` | — |
| 11 | `print(f())` | — |
| 12 | └ `return "x"` | — |
| 結果 | 実際の出力 | ABx |
- A
誤り。外側のデコレータ
aの処理が、先に実行される。 - B
誤り。デコレータが適用される。
- C
誤り。元の関数の結果
xも含まれる。 - D
正しい。下のデコレータ(
b)が先に適用され、その結果をaが包む。呼び出すと外側(a)の処理が先。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。