Python上下文管理器
简介
最近用到这个,仔细了解了一下,感觉是十分有用的,记录一下
使用场景
当我们需要获取一个临时打开的资源,并在使用完毕后进行资源释放和异常处理,利用try-catch语句可以完成,举个例子。
打开文件:
f = None try: print("try") f = open("__init__.py", "r") print(f.read()) except Exception as e: print("exception") finally: if f: print("finally") f.close()
利用上下文管理器:
class OpenHandle: def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): self.f = open(self.filename, self.mode) return self.f def __exit__(self, exc_type, exc_val, exc_tb): if exc_type: print("exception") else: print("normal") self.f.close() with OpenHandle("book.txt", "r") as f: print(f.read())
这样可以利用with-as语句改写代码,让程序员关注业务主流程,去掉对于资源的获取和关闭这些重复操作。提升代码的可读性。好处很大。
执行顺序
执行顺序是理解这种写法的关键:
函数式上下文管理器
利用from contextlib import contextmanager这个装饰器可以将函数装饰为上下文管理器,其实这个装饰背后也是返回一个实现了__enter__和__exit__方法的类
from contextlib import contextmanager @contextmanager def managed_resource(*args, **kwds): # Code to acquire resource, e.g.: resource = acquire_resource(*args, **kwds) try: yield resource finally: # Code to release resource, e.g.: release_resource(resource) >>> with managed_resource(timeout=3600) as resource: ... # Resource is released at the end of this block, ... # even if code in the block raises an exception
模板代码
sqlalchemy会话上下文管理器
利用这个管理sqlalchemy会话对象的获取和释放,控制事务是再合适不过了
class DbTransaction: def __init__(self, session_maker): self.session_maker = session_maker def __enter__(self): self.session = self.session_maker() return self.session def __exit__(self, exc_type, exc_val, exc_tb): if exc_type: self.session.rollback() else: self.session.commit() self.session.close() return False if exc_type else True
以上就是全部相关知识点,感谢大家的学习和对小牛知识库的支持。
本文向大家介绍Python上下文管理器用法及实例解析,包括了Python上下文管理器用法及实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python上下文管理器用法及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 with上下文管理器 语法:with ... as ... 如:with open('test.txt'
本文向大家介绍Python上下文管理器和with块详解,包括了Python上下文管理器和with块详解的使用技巧和注意事项,需要的朋友参考一下 上下文管理器和with块,具体内容如下 上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样。 with 语句的目的是简化 try/finally 模式。这种模式用于保证一段代码运行完毕后执行某项操作,即便那段代码
本文向大家介绍Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析,包括了Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python上下文管理器类和上下文管理器装饰器contextmanager用法。分享给大家供大家参考,具体如下: 一. 什么是上下文管理器 上下文管理
本文向大家介绍Python Flask上下文管理机制实例解析,包括了Python Flask上下文管理机制实例解析的使用技巧和注意事项,需要的朋友参考一下 前言 上下文这个概念多见于文章中,是一句话中的语境,也就是语言环境。一句莫名其妙的话出现会让人不理解什么意思,如果有语言环境的说明,则会更好,这就是语境对语意的影响。 上下文是一种属性的有序序列,为驻留在环境内的对象定义环境。在对象的激活过程中
问题内容: 我不明白为什么无法在此示例中模拟NamedTemporaryFile.name: 测试结果在: 问题答案: 您设置的模拟错误:不是上下文管理器,而是 返回 了一个上下文管理器。将您的设置行替换为: 这样您的测试就可以了。
问题内容: 在这个问题中,我定义了一个包含上下文管理器的上下文管理器。完成此嵌套的最简单的正确方法是什么?我最后打电话了。但是,在中,我很确定我必须调用finally块,以防引发异常。如果出现问题,是否应该设置type_,value和traceback参数?我检查了,但找不到任何实用程序来帮助解决此问题。 来自问题的原始代码: 问题答案: 创建上下文管理器的简单方法是使用。像这样: 然后使用。语句