functools.wraps
次のコードを実行したときの出力として、正しいものを1つ選べ。
import functools
def d(f):
@functools.wraps(f)
def w(*a):
return f(*a)
return w
@d
def hello():
"doc"
print(hello.__name__, hello.__doc__)
- A
hello doc - B
w None - C
hello None - D
w doc
正解と解説を見る
正解:A
デコレータの内側の関数に @functools.wraps(f) を付けると、元の関数の __name__・__doc__ などが保たれる。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `import functools` | — |
| 2 | `def d(f):` | — |
| 3 | `@d` | — |
| 4 | `def hello():` | — |
| 5 | `@d` | — |
| 6 | └ `def w(*a):` | — |
| 7 | └ `@functools.wraps(f)` | — |
| 8 | └ `def w(*a):` | — |
| 9 | └ `@functools.wraps(f)` | — |
| 10 | └ `def w(*a):` | — |
| 11 | └ `return w` | — |
| 12 | `def hello():` | — |
| 13 | `print(hello.__name__, hello.__doc__)` | — |
| 結果 | 実際の出力 | hello doc |
- A
正しい。
functools.wrapsが、元の関数の名前と docstring を引き継ぐ。 - B
誤り。
wrapsを使わないと、この結果になる。 - C
誤り。docstring も引き継がれる。
- D
誤り。名前も引き継がれる。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。