首页 家居生活 家电资讯 软件资讯 化工资讯 五金资讯 范文论文 动漫资讯 心情说说 房产资讯 新能源 健康资讯 女性话题 医疗资讯 娱乐资讯 趣闻趣事 故事会
您当前的位置 :软件资讯 >  正文
Python上下文管理器类和上下文管理器装饰器contextmanager用法实
http://yangdaipin.com.cn2020-08-01

本文实例讲述了Python上下文管理器类和上下文管理器装饰器contextmanager用法。分享给大家供大家参考,具体如下:

一. 什么是上下文管理器

上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用, 比如:

with open("test/test.txt","w") as f: f.write("hello")

这上会比使用try:...finally:f.close方便的多.

二. 自定义一个上下文管理器类:

class MyResource: # __enter__ 返回的对象会被with语句中as后的变量接受 def __enter__(self): print('connect to resource') return self def __exit__(self, exc_type, exc_value, tb): print('close resource conection') def query(self): print('query data')

类中有两个特殊的魔术方法:

__enter__: with语句中的代码块执行前, 会执行__enter__, 返回的值将赋值给with句中as后的变量. __exit__: with语句中的代码块执行结束或出错, 会执行_exit__

比如以下代码:

with Myresource() as r: r.query()

的打印结果为:

connect to resource query data close resource conection

那么有没有一个简化定义的方法呢, python提供了一个装饰器contextmanager

三. 使用contextmanager

from contextlib import contextmanager class MyResource: def query(self): print('query data') @contextmanager def make_myresource(): print('start to connect') yield MyResource() print('end connect') pass

被装饰器装饰的函数分为三部分:

with语句中的代码块执行前执行函数中yield之前代码 yield返回的内容复制给as之后的变量 with代码块执行完毕后执行函数中yield之后的代码

比如下方代码:

with make_myresource() as r: r.query()

的结果为:

start to connect query data end connect

四. 一个例子, sqlalchemy: 数据库的自动提交和回滚

在编程中如果频繁的修改数据库, 一味的使用类似try:... except..: rollback() raise e其实是不太好的.

比如某一段的代码的是这样的:

try: gift = Gift() gift.isbn = isbn ... db.session.add(gift) db.session.commit() except Exception as e: db.session.rollback() raise e

为了达到使用with语句的目的, 我们可以重写db所属的类:

from flask_sqlalchemy import SQLAlchemy as _SQLALchemy class SQLAlchemy(_SQLALchemy): @contextmanager def auto_commit(self): try: yield self.session.commit() except Exception as e: db.session.rollback() raise e

这时候, 在执行数据的修改的时候便可以:

with db.auto_commit(): gift = Gift() gift.isbn = isbndb.session.add(gift) db.session.add(gift) with db.auto_commit(): user = User() user.set_attrs(form.data) db.session.add(user)

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
夜游灯光秀 hkjum775896.51sole.com

相关报道
Python上下文管理器类和上下文管理器装饰器contextmanager用法实
qq匿名悄悄话_qq匿名悄悄话怎么查是谁说的
电驴连接不上服务器解决方法
FileGee企业文件同步备份系统图文安装教程
php 批量查询搜狗sog、ou代码分享
火绒安全软件粉碎电脑文件教程
瑞星杀毒软件V16新功能 独特变频杀毒
微软将在Windows 10 Mobile更新中引入强制开启HDR功能
《星际争霸:重制版》国服上架:售价98元
微信电脑版怎么加好友?微信电脑版加好友教程
 
 
 热门新闻
· 移动支付添新将:苹果强势冲入
· 谷歌发布全新iOS键盘应用Gboard
· iphone7plus双后置摄像头或提高机身价格
· 电驴连接不上服务器解决方法
· 纯语义化XHTML CSS设计表单方法
· 迅雷怎么测试网速 迅雷测试网速方法
· 国内第一FM崩了一下午 目前已恢复
· 高频使用的微信小程序都有哪些?
· 传真软件哪个好?传真软件下载地址汇总
· 库克:苹果公司会存在几千年
 推荐
· 电车帮APP怎么样_电车帮APP如何使用
· wps演示怎么添加文本框 wps演示文本框在哪
· 360安全卫士如何清理垃圾?
· 繁体字转换器怎么运行不了
· 小米预热新旗舰发布会 打造最好的新年礼物
· win7如何采用指令界面修改运行环境变量
· Python上下文管理器类和上下文管理器装饰器contextmanager用法实
· qq匿名悄悄话_qq匿名悄悄话怎么查是谁说的
· php 批量查询搜狗sog、ou代码分享
· 瑞星杀毒软件V16新功能 独特变频杀毒
正宏G网