python的上下文管理
生活随笔
收集整理的这篇文章主要介绍了
python的上下文管理
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
说道上下文管理首先想到的就是这个:
class MyResource:def __enter__(self):print("查询开始")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("查询结束")def query(self):print("查询中")with MyResource() as f:f.query()执行结果
查询开始 查询中 查询结束但是我们这里要说的不是这个,
from contextlib import contextmanagerclass MyResource:def query(self):print("查询中")@contextmanager def make_myresource():print("查询开始")yield MyResource()print("查询结束")# 这里的f是yield后面返回的实例 with make_myresource() as f:f.query()python给了我们一个contextmanager,contextmanager最大的好处就是可以将不是上下文处理器的类变成一个类似上下文处理的方式来解决问题。
上面的运行结果依然是:
查询开始 查询中 查询结束简单的例子,我想把我一本图书的名字加上书名号输出:
from contextlib import contextmanager@contextmanager def make_myresource():print("《", end='')yieldprint("》")# 这里的f是yield后面返回的实例 with make_myresource():print("my world", end='') 《my world》下面看一个例子:
try:# 此时已经支持事务,commit之前都没有真正提交gift = Gift()gift.isbn = isbn# current_user是实例化后的user模型gift.uid = current_user.idcurrent_user.beans += 0.5db.session.add(gift)db.session.commit() except Exception as e:db.session.rollback()raise e这个例子是sqlalchemy操作里时常要使用到的事务回滚的代码,为了防止本次写入失败对下一次写入的影响,我们时常需要捕捉到异常并回滚到初始状态。这样的异常捕获代码会多次出现在我们的项目里面,所以我们考虑修改他,如何让代码简化,这时候应当使用contextmanager来解决这个问题。
from contextlib import contextmanagerfrom flask_sqlalchemy import SQLAlchemy as _SQLAlchemy from sqlalchemy import Column, SmallIntegerclass SQLAlchemy(_SQLAlchemy):@contextmanagerdef auto_commit(self):try:yieldself.session.commit()except Exception as e:self.session.rollback()raise edb = SQLAlchemy() @web.route('/gifts/book/<isbn>') @login_required def save_to_gifts(isbn):if current_user.can_save_to_list():with db.auto_commit():# 此时已经支持事务,commit之前都没有真正提交gift = Gift()gift.isbn = isbn# current_user是实例化后的user模型gift.uid = current_user.idcurrent_user.beans += 0.5db.session.add(gift)转载于:https://www.cnblogs.com/Jeffding/p/8759430.html
总结
以上是生活随笔为你收集整理的python的上下文管理的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 20165331 第六周学习总结
- 下一篇: 02.Python基础