python上下文是什么_(1条消息)python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...
什么是上下文管理器?
上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用
with open("test/test.txt","w") as f:
f.write("hello")
这上会比使用try:...finally:f.close方便的多.
首先引出为什么要使用上下文管理器:我们的代码图如下
通过上图代码我们可以发现,我们每次都要进行db.session.commit()我们可能在项目的很多地方都会使用到,如果我们每次都要写try except 然后在里面回滚,这些重复的代码我们尽可能的要去避免。下面我们就来解决这个问题。
我们先来回顾一下上下文管理器-with
类中有两个特殊的魔术方法:
__enter__: with语句中的代码块执行前, 会执行__enter__, 返回的值将赋值给with句中as后的变量.
__exit__: with语句中的代码块执行结束或出错, 会执行_exit__
如果我们要定义上下文管理器,就需要在这类里面定义__enter__和__exit__这两个方法。
有没有什么简化的方法不需要我们直接定义__enter__和__exit__呢?
python提供了一个装饰器叫@contextmanager,是位于contextlib模块下的。
借助contextmanager装饰器,我们可以简化MyResource的定义
现在我们不要__enter__和__exit__方法,只保留核心方法query(),注意我们只是不想在定义__enter__和__exit__这两个方法,但是他们里面所执行的语句我们还是需要实现的。在进入上下文管理器的时候打印__enter__里面的方法,在退出的时候打印__exit__里面的方法。
所以最终的代码如上图所示。
被装饰器装饰的函数分为三部分:
with语句中的代码块执行前执行函数中yield之前代码
yield返回的内容复制给as之后的变量
with代码块执行完毕后执行函数中yield之后的代码
大家都说利用@contextmanager这个内置的装饰器可以减化上下文管理器的定义,但是我不这样认为。但是这样写有一个非常的好处,就是使用@contextmanager的好处就是给了我们一个机会,让我们把原来不是上下文管理器的类变成了上下文管理器,假如这个MyResource的类不是我们自己编写的,比如说是flask提供给我们的或者是第三方类库提供给我们的,我们去改变源码在里面加__enter__和__exit__方法是不合适的,但是我们却可以在MyResource的类的外部使用@contextmanager把MyResource包装成一个上下文管理器。
例如:
注意下图第三方的SQLAlchemy的名字被我们as成了_SQLAlchemy,这样SQLAlchemy就是父类的子类的。
我们如何为一个第三方的类库新增加一个方法呢?我们可以新建一个子类,然后继承SQLAlchemy
这样我们就可以把代码变成下面这样了
对比之前的是不是简单了呢?(下图为未使用上下文管理器之前的代码),上图仅仅一个with就解决了try except的繁琐。
扩展知识点:
现在我们想打印一本书的名字,但是每一次前后都要自己加书名号太烦了,书名是我们从数据库中查出来的,但是我们在数据库中保存是不会加书名号的,现在我们取出来显示的时候想加书名号,那么我们使用@contextmanager解决
因为我们的with后面没有as,所以我们不需要yield返回任何的结果,这里只写一个yield是可以的。
但是因为有换行,那么我们就在后面加上end=''就行啦
这里的用法就是@contextmanager的另一种用法,和上下文管理器是没有关系的。
python上下文是什么_(1条消息)python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...相关推荐
- python知识点总结全_【转】Python高级知识点总结
一.可迭代对象.迭代器对象和生成器 像list, tuple等这些序列是可以使用for...in ...语句来进行遍历输出的.这是为什么呢?这就需要知道可迭代对象(Iterable).迭代器对象(It ...
- python输入单个字符_关于输入:Python从用户读取单个字符
有没有从用户输入中读取单个字符的方法?例如,他们在终端按下一个键,然后返回(类似于getch()).我知道Windows中有一个函数,但是我想要一个跨平台的函数. 在Windows上,我遇到了和这个问 ...
- python语言运行效率高_如何评价说PYTHON是最快的语言?
我是视频的作者,首先感谢朋友们的关注,并且诞生了这个论题,让我可以看到大家对我视频中的观点的反馈.对于大家的讨论,在日常时间允许的条件下,我会尽量参与.下面就我目前已经看到的朋友们的评论,做一下展开. ...
- python 线程安全链表_教你用 Python 实现 HashMap 数据结构
<犬夜叉·镜中的梦幻城> 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什么说是所有Java工程师都会呢,因为很简单,他们不会这个找不到工作.几乎所有 ...
- 我的python学习笔记全集_记录我的Python学习笔记
不想再像以前那样,什么都从头开始学习语法.总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身. 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言 ...
- python hook pc微信_一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~...
原文链接一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~mp.weixin.qq.com 导语 众所周知,前段时间微信彻底关闭了网页版微信登录入口.于是一大波基于itchat ...
- python代替易语言_基于hook的python机器人,彻底取代itchat
本文档部分由itchat与wxpy的开发文档修改得出 禁止不规范转载 WechatBot WechatBot是一个半开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到20行的代码, ...
- python交互式绘图库_一个交互式可视化Python库——Bokeh
本篇为<Python数据可视化实战>第十篇文章,我们一起学习一个交互式可视化Python库--Bokeh. Bokeh基础 Bokeh是一个专门针对Web浏览器的呈现功能的交互式可视化Py ...
- python怎么打日志_怎样调试 日志 python 代码
展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...
最新文章
- Unity iPhone Touch Animation Tutorial,untiy3d iphone简单动画开发教程
- 一个用JAVA实现的线段树类--泛型 重构.
- 2020年,人工智能如何走向高质量发展?
- java api使用ElastichSearch指南
- 访问index.php跳转,打开index.php后,跳转到/user/login.html
- linux内核对TCP的连接状态管理
- leetcode题解179-最大数
- android studio安装Kotlin(零)
- python编写赛车_python udp 协议发送接收秒速赛车平台搭建数据
- oracle子接点与父节点上下级关系数据库查询语句,及联查询,
- 了解SpringMVC框架及基本工作流程
- OC_内存管理(二)对象复制、循环引用问题、自动释放池
- Java|二叉树基础详解
- 熔断漏洞和幽灵漏洞_崩溃和幽灵:发现新的英特尔CPU漏洞
- stm32如何在官网下载标准函数库
- 导出pdf文件时加图片水印
- 一个从业(非正品)奢侈品十年从业者的经验和历程。
- 【竞品分析】Android音乐播放器的竞品分析
- 什么叫共同富裕,刘强东给老板们打了个样
- 国密算法SM2实现 vue+C#
热门文章
- 华为鸿蒙系统还不成熟,华为鸿蒙系统终于来了!只因这三点,苹果将面临空前一劫!...
- 投资理财的看法IT人
- python概念建模_机器学习基本概念
- 2022年桂林二级建造师机电工程施工相关法规冲刺试题及答案
- 一种简单的防反接防过压电路
- 用shell实现简易计算器
- 【SpringBoot】自定义启动Banner(附:使用生成艺术字体方法)
- labelme批量制作数据集教程
- Excel单元格内字符串反转
- YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)...