说道上下文管理首先想到的就是这个:

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的上下文管理相关推荐

  1. Python with上下文管理及自定义上下文管理

    Python with上下文管理及自定义上下文管理 一.上下文管理器 上下文管理器是对Context Manager的翻译 ,上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的 ...

  2. python上下文管理关键字_理解 Python 的上下文管理器

    任何 Python 教程,必然会讲解如何打开一个文件.而任何提到打开文件的地方,都必然会推荐用 with 来操作文件的读写.比如说这里有一篇非常优秀的教程,文中提到在 Python 中,文件读写是通过 ...

  3. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  4. python with上下文管理

    with上下文管理 class person:def __init__(self,name):self .name = name def __enter__(self):print('这是with定义 ...

  5. python进入上下文管理器_浅谈Python中with(上下文管理器)的用法

    例子一 首先来看一段代码: classFoo(object):def __init__(self):print('实例化一个对象')def __enter__(self):print('进入')def ...

  6. Python 上下文管理器和 with 语句

    1. 上下文管理器概念 什么是 Python 的上下文管理器(Context Managers)呢? ​ 含有 __enter__ 和 __exit__ 方法的对象就是.上下文管理器存在的目的是管理 ...

  7. python意外退出_有趣的Python上下文管理器

    阅读耗时:9分钟 目录 编写自定义上下文管理器 从生成器到上下文管理器 将上下文管理器编写为装饰器 嵌套式上下文管理器 组合式上下文管理器 利用用上下文管理器创建SQLAlchemy session ...

  8. python 计时器_Python上下文管理器的魔力

    点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...

  9. Python上下文管理器的魔力

    点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...

最新文章

  1. Android第四十一天(3)
  2. 移动硬盘改台式机硬盘_如何在台式机或移动设备上离线使用Google云端硬盘
  3. 谈谈Tensorflow的Batch Normalization
  4. 算法篇【枚举2 -- 生理周期】
  5. 【Linux使用】Centos 7 YUM仓库配置文件代理服务器设置
  6. java 给图片添加暗水印_java 实现给图片添加水印
  7. 如何从超级用户进入非超级用户
  8. 阿里巴巴泰山版java开发手册最新版.pdf 百度网盘分享
  9. 综合微软、AMiner两大学术图谱,清华大学唐杰博士如何将Open Academic Graph亿级数据精准匹配
  10. SPSS Statistics 分位数回归 翻译文档
  11. c语言编译kbhit出现问题,在VC++中运行出现error C2065: 'kbhit' : undeclared identifier,什么意思?怎么调试?...
  12. 提高php代码质量 36计
  13. 阿里云、腾讯云、七牛、网易云CDN简单对比
  14. 判断手机是安卓还是苹果
  15. 关于WM_COMMAND与WM_NOTIFY
  16. 云计算运维工程师是做什么的?需要经常加班吗?
  17. 【leetcode】二维子矩阵的和
  18. 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
  19. phonegap打包
  20. LVGL7.11中使用freetype库加载显示字体

热门文章

  1. Jmeter使用基础笔记-写一个http请求
  2. 关于web项目当中的mybatis的xml 文件的配置启动报错的解决。
  3. Asp.NetCore MVC Web 应用
  4. 命令行参数 - 和 -- 的区别
  5. 使用Jsonp实现跨域请求
  6. Android webservice的用法详细讲解
  7. Ember.js系列文章
  8. android overridePendingTransition
  9. 网站发布问题及使用Web Deployment Projects
  10. cpp 条件判断 大于等于_第31p,if条件语句,请满足我的要求