20 分钟
Python 高级

上下文管理器

使用 with 语句管理资源

  • 理解上下文管理器协议
  • 使用 __enter__/__exit__
  • contextlib 简化写法

为什么需要 with

示例代码(可运行)

自定义上下文管理器

示例代码(可运行)

contextlib.contextmanager

示例代码(可运行)
预测输出
class C:
    def __enter__(self): print("enter")
    def __exit__(self,*a): print("exit")
with C(): print("inside")
找 Bugwith块外文件已关闭,再写入会ValueError。
with open("f.txt","w") as f: f.write("hi") f.write("more")
填空题填写空白处的代码
with open("f.txt") f: print(f.read())
选择题

__exit__ 返回 True 会?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

@decorator 写在函数定义上方,它在「模块加载、函数被定义时」就执行一次,把原函数包装成新函数;之后每次调用,走的都是包装后的版本。带参数的装饰器本质是三层嵌套(外层收参数、中层收函数、内层收调用参数)。务必用 functools.wraps 保留原函数名和文档,否则调试栈和日志里全是 wrapper。

挑战任务

上下文管理器挑战

简单+50 XP

实现一个缩进打印上下文管理器。

上下文管理器挑战
2 个测试用例

课后作业

临时目录

中等+20 XP

写个上下文管理器,能自动建临时目录、用完自动删。

临时目录
1 个测试用例