快速答案
本答案页包含 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 道题。