时间:2021-05-23
Python上下文管理器
简介
最近用到这个,仔细了解了一下,感觉是十分有用的,记录一下
使用场景
当我们需要获取一个临时打开的资源,并在使用完毕后进行资源释放和异常处理,利用try-catch语句可以完成,举个例子。
打开文件:
f = Nonetry: 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@contextmanagerdef 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以上就是全部相关知识点,感谢大家的学习和对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
0、关于上下文管理器上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象。withmanagerasvar:do_some
网上asyncwith和asyncfor的中文资料比较少,我把PEP492中的官方陈述翻译一下。异步上下文管理器”asyncwith”异步上下文管理器指的是在e
在对于python中的装饰器,我们一般会使用它辅助方法。在我们学习的上下文管理器中,有一个@contextmanager装饰器,它能够帮助我们在函数中定义上下文
问题你想自己去实现一个新的上下文管理器,以便使用with语句。解决方案实现一个新的上下文管理器的最简单的方法就是使用contexlib模块中的@contextm
Python2.5之后引入了上下文管理器(contextmanager),算是Python的黑魔法之一,它用于规定某个对象的使用范围。本文是针对于该功能的思考总