答案页 · 12 道题

Python 上下文管理器练习答案

本页汇总 Python 上下文管理器 的 12 道练习。先做练习页,再回到这里核对准确答案和原因。

快速答案

本答案页包含 Python 上下文管理器 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。

答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。

01 · 选择题

哪两个方法让对象成为上下文管理器?

  1. __iter__ 和 __next__
  2. __init__ 和 __repr__
  3. __enter__ 和 __exit__正确答案
  4. __get__ 和 __set__

答案: __enter__ 和 __exit__

为什么: with 语句会在主体前调用 __enter__,主体后调用 __exit__。

02 · 选择题

__exit__ 什么时候被调用?

  1. with 代码块退出时正确答案
  2. 只有 __enter__ 失败时
  3. __enter__ 之前
  4. 只有文件为空时

答案: with 代码块退出时

为什么: 无论主体成功还是抛出异常,__exit__ 都会运行。

03 · 选择题

代码的输出结果是什么?

class C:
    def __enter__(self):
        return "ok"
    def __exit__(self, *args):
        pass
with C() as value:
    print(value)
  1. True
  2. ok正确答案
  3. C
  4. None

答案: ok

为什么: __enter__ 返回的值会绑定到 as 后面的变量。

04 · 选择题

contextlib.contextmanager 要求函数里有什么?

  1. 一个类
  2. 一个 yield正确答案
  3. 一个 return
  4. 一个 print

答案: 一个 yield

为什么: yield 之前是准备,yield 之后是清理。

05 · 填空题

补全打开受管理代码块的语句。

____ open("note.txt", "w") as f:
    f.write("hi")

答案: with

为什么: with 开始一个受管理的代码块,并保证清理。

06 · 填空题

补全准备资源的方法。

class C:
    def ____(self):
        return self

答案: __enter__

为什么: __enter__ 准备资源,并返回绑定到 as 的值。

07 · 填空题

补全清理方法。

class C:
    def ____(self, exc_type, exc, tb):
        pass

答案: __exit__

为什么: with 代码块结束时运行 __exit__。

08 · 填空题

补全分隔准备与清理的关键字。

from contextlib import contextmanager
@contextmanager
def c():
    ____ 1

答案: yield

为什么: contextmanager 用 yield 作为准备与清理的边界。

09 · 输出预测

屏幕上会显示什么?

class C:
    def __enter__(self):
        return "ok"
    def __exit__(self, *args):
        return False
with C() as value:
    print(value)

答案: ok

为什么: __enter__ 返回的值是 ok。

10 · 输出预测

这段代码会输出什么?

from contextlib import contextmanager
@contextmanager
def value():
    yield 7
with value() as number:
    print(number + 1)

答案: 8

为什么: 管理器产出七,七加一等于八。

11 · 输出预测

运行结果是什么?

class C:
    def __enter__(self):
        return 2
    def __exit__(self, *args):
        pass
with C() as n:
    print(n * 3)

答案: 6

为什么: 管理器返回二,二乘三等于六。

12 · 输出预测

这段程序打印出什么?

from contextlib import contextmanager
@contextmanager
def label():
    yield "x"
with label() as text:
    print(text.upper())

答案: X

为什么: 管理器产出 x,upper 把它变成 X。

先试一遍题目

打开 Python 上下文管理器 练习页,用即时反馈回答同样的 12 道题。

练习本课