Python - 采用 contextmanage 简化代码
contextlib.contextmanage
Python 2.7 documents:
https://docs.python.org/2.7/library/contextlib.html?highlight=contextmanage#contextlib.contextmanager
场景:flask_sqlalchemy :数据库的自动提交和回滚
如果频繁的修改数据库中的数据,每次使用 try/except、rollback()、raise e 会比较繁琐,可采用 contextlib.contextmanage 进行简化
- 简化前采用 try/except :
try:
user_db = User(email=self.email, nickname=self.nickname,password=self.password)
db.session.add(user_db)
db.session.commit()
except Exception as e:
db.session.rollback()
raise e
- 采用 contextmanager 简化后
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy
from contextlib import contextmanager
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:
self.session.rollback()
raise e
db = SQLAlchemy()
- 可利用 with 上下文管理方法调用:
with db.auto_commit():
user_db = User(email=self.email, nickname=self.nickname,password=self.password)
db.session.add(user_db)
被装饰器装饰的函数被分为三部分:
- with 语句中的代码块执行前,执行函数中 yield 之前的代码
- yield 返回的内容赋值给 as 之后的变量
- with 代码块执行完毕后,执行函数中 yield 之后的代码
[参考文献]
- flask-SQLAlchemy数据库模型插入数据的时候使用session.commit()必须处理异常回滚db.session.rollback() https://blog.csdn.net/weixin_43343144/article/details/87106213
- contextmanager: 上下文管理器类和上下文管理器装饰器 https://blog.csdn.net/weixin_42359464/article/details/80742387#three
Python - 采用 contextmanage 简化代码的更多相关文章
- 用 Python 测试框架简化测试
用 Python 测试框架简化测试 摘要:本文将向您介绍了三种流行 Python 测试框架(zope.testing,py.test,nose)的基本特性,并讨论新一代的测试风格. 最近出现了行业级的 ...
- python采用pika库使用rabbitmq总结,多篇笔记和示例
这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...
- python采用pika库使用rabbitmq总结,多篇笔记和示例(转)
add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...
- 【Python challenge】通关代码及攻略(0-11)
前言: 最近找到一个有关python的游戏闯关,这是游戏中的思考及通关攻略 最开始位于:http://www.pythonchallenge.com/pc/def/0.html 第0关 题目分析 提示 ...
- 用block做事件回调来简化代码,提高开发效率
我们在自定义view的时候,通常要考虑view的封装复用,所以如何把view的事件回调给Controller就是个需要好好考虑的问题, 一般来说,可选的方式主要有target-action和de ...
- LevelDB源码分析--使用Iterator简化代码设计
我们先来参考来至使用Iterator简化代码2-TwoLevelIterator的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文. 下面我们再来看一个例子,我们为一个书店写程序, ...
- C#泛型简化代码量示例
泛型简化代码量 下是我在项目中通过泛型来简化工作的一个Demo,记录一下: using System; using System.Collections.Generic; namespace My ...
- python中执行javascript代码
python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext() ctxt.enter() ...
- 玩转UITableView系列(一)--- 解耦封装、简化代码、适者生存!
UITableView这个iOS开发中永远绕不开的UIView,那么就不可避免的要在多个页面多种场景下反复摩擦UITableView,就算是刚跳进火坑不久的iOS Developer也知道实现UITa ...
随机推荐
- 一个使用命令行编译Android项目的工具类
一个使用命令行编译Android项目的工具类 简单介绍 编译apk项目须要使用的几个工具,基本都在sdk中,它们各自是(Windows系统): 1.aapt.exe 资源打包工具 2.android. ...
- 利用scrapy抓取网易新闻并将其存储在mongoDB
好久没有写爬虫了,写一个scrapy的小爬爬来抓取网易新闻,代码原型是github上的一个爬虫,近期也看了一点mongoDB.顺便小用一下.体验一下NoSQL是什么感觉.言归正传啊.scrapy爬虫主 ...
- 具体解释linux文件处理的的经常使用命令
原创Blog.转载请注明出处 附上之前訪问量比較高的几篇linux博客 本人使用shell的8个小技巧 grep的九个经典使用场景 sed命令具体解释 awk命令具体解释 linux中全部的东西都是文 ...
- scanf,printf函数细节
今天笔试的时候遇到一个考察C语言scanf函数的题目 int x; float y; scanf("%3d%f",&x,&y); // input 123456 6 ...
- 国外物联网平台初探(四):Ayla Networks
定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理Ayla Embedded Agents (2) Ayla云 ...
- 排序系列 之 冒泡排序及其改进算法 —— Java实现
冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...
- 「Canvas」玩转
作者: 糖少 简介 Canvas是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可 ...
- SMTP协议详解
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输email的事实标准. SMTP是一个相对简单的基于文本的协议.在其之上指定了一条 ...
- [Offer收割]编程练习赛36
逃离单身节 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector&g ...
- BZOJ1211: [HNOI2004]树的计数(prufer序列)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2987 Solved: 1111[Submit][Status][Discuss] Descript ...