快速答案
本答案頁包含 Python 上下文管理器 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。
答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。
哪兩個方法讓物件成為上下文管理器?
答案: __enter__ 和 __exit__
為什麼: with 語句會在主體前呼叫 __enter__,主體後呼叫 __exit__。
__exit__ 什麼時候被呼叫?
答案: with 程式碼區塊退出時
為什麼: 無論主體成功還是拋出例外,__exit__ 都會執行。
程式碼的輸出結果是什麼?
class C:
def __enter__(self):
return "ok"
def __exit__(self, *args):
pass
with C() as value:
print(value)答案: ok
為什麼: __enter__ 回傳的值會綁定到 as 後面的變數。
contextlib.contextmanager 要求函式裡有什麼?
答案: 一個 yield
為什麼: yield 之前是準備,yield 之後是清理。
補全打開受管理程式碼區塊的語句。
____ open("note.txt", "w") as f:
f.write("hi")答案: with
為什麼: with 開始一個受管理的程式碼區塊,並保證清理。
補全準備資源的方法。
class C:
def ____(self):
return self答案: __enter__
為什麼: __enter__ 準備資源,並回傳綁定到 as 的值。
補全清理方法。
class C:
def ____(self, exc_type, exc, tb):
pass答案: __exit__
為什麼: with 程式碼區塊結束時執行 __exit__。
補全分隔準備與清理的關鍵字。
from contextlib import contextmanager
@contextmanager
def c():
____ 1答案: yield
為什麼: contextmanager 用 yield 作為準備與清理的邊界。
螢幕上會顯示什麼?
class C:
def __enter__(self):
return "ok"
def __exit__(self, *args):
return False
with C() as value:
print(value)答案: ok
為什麼: __enter__ 回傳的值是 ok。
這段程式碼會輸出什麼?
from contextlib import contextmanager
@contextmanager
def value():
yield 7
with value() as number:
print(number + 1)答案: 8
為什麼: 管理器產出七,七加一等於八。
執行結果是什麼?
class C:
def __enter__(self):
return 2
def __exit__(self, *args):
pass
with C() as n:
print(n * 3)答案: 6
為什麼: 管理器回傳二,二乘三等於六。
這段程式列印出什麼?
from contextlib import contextmanager
@contextmanager
def label():
yield "x"
with label() as text:
print(text.upper())答案: X
為什麼: 管理器產出 x,upper 把它變成 X。
先試一遍題目
打開 Python 上下文管理器 練習頁,用即時回饋回答同樣的 12 道題。