版权声明: https://blog.csdn.net/dashoumeixi/article/details/83869753
with open('xxx','r') as fd 这类代码应该很多吧.
能让上下文环境块 执行的理由是 open 返回的对象实现了 __enter__ 与 __exit__
这一行代码即调用了 __enter__ , 等待离开 with 时 , __exit__ 被调用.
contextmanager 装饰器 , 可以不用自己写一个类 就能实现 with 环境块.
contextmanager 装饰的函数 通过一个 yield 分为2个部分.
yield 前的代码 相当于 __enter__ , yield 后的代码相当于 __exit__
而 yiled 产出的值 相当于 as 的变量上.
import contextlib
#装饰一下
@contextlib.contextmanager
def open_file(filepath):
#相当于 __enter__
print("准备打开")
fileObject = open(filepath,'r')
print("打开结束 , 准备yield")
# fileObject 将赋值 给 as 后的变量
yield fileObject
# 下面的代码相当于 __exit__
print("准备close")
fileObject.close()
print("close完成")
#测试一下
with open_file("D:/code/book/async-python-latest/index.html") as fd:
print("with 块进入了")
time.sleep(3)
print("完成操作")