多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
~~~ f = open("test.txt", "w") try: f.write("aaa") except IOError: print("error") finally: f.close() ~~~ ~~~ with open("test.txt", "r") as f: f.write("aaa") ~~~ 以上两端代码效果一样 with 的作用和使用 try/finally 语句是一样的。那么它的实现原理是什么? ### 上下文管理器 ``` 任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键 字。显然,文件(file)对象也实现了上下文管理器 ``` ~~~ class File(): def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): print("entering") self.f = open(self.filename, self.mode) return self.f def __exit__(self, *args): print("will exit") self.f.close() ~~~ Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 \_\_enter\_\_ 方法中执行,yield 之后的语句在 \_\_exit\_\_ 方法中执行。紧跟在 yield 后面的值是函数的返回值。 ~~~ from contextlib import contextmanager @contextmanager def my_open(path, mode): f = open(path, mode) yield f f.close() ~~~