什么是上下文管理器?

上下文管理器是在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来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...相关推荐

  1. python知识点总结全_【转】Python高级知识点总结

    一.可迭代对象.迭代器对象和生成器 像list, tuple等这些序列是可以使用for...in ...语句来进行遍历输出的.这是为什么呢?这就需要知道可迭代对象(Iterable).迭代器对象(It ...

  2. python输入单个字符_关于输入:Python从用户读取单个字符

    有没有从用户输入中读取单个字符的方法?例如,他们在终端按下一个键,然后返回(类似于getch()).我知道Windows中有一个函数,但是我想要一个跨平台的函数. 在Windows上,我遇到了和这个问 ...

  3. python语言运行效率高_如何评价说PYTHON是最快的语言?

    我是视频的作者,首先感谢朋友们的关注,并且诞生了这个论题,让我可以看到大家对我视频中的观点的反馈.对于大家的讨论,在日常时间允许的条件下,我会尽量参与.下面就我目前已经看到的朋友们的评论,做一下展开. ...

  4. python 线程安全链表_教你用 Python 实现 HashMap 数据结构

    <犬夜叉·镜中的梦幻城> 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什么说是所有Java工程师都会呢,因为很简单,他们不会这个找不到工作.几乎所有 ...

  5. 我的python学习笔记全集_记录我的Python学习笔记

    不想再像以前那样,什么都从头开始学习语法.总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身. 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言 ...

  6. python hook pc微信_一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~...

    原文链接一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~​mp.weixin.qq.com 导语 众所周知,前段时间微信彻底关闭了网页版微信登录入口.于是一大波基于itchat ...

  7. python代替易语言_基于hook的python机器人,彻底取代itchat

    本文档部分由itchat与wxpy的开发文档修改得出 禁止不规范转载 WechatBot WechatBot是一个半开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到20行的代码, ...

  8. python交互式绘图库_一个交互式可视化Python库——Bokeh

    本篇为<Python数据可视化实战>第十篇文章,我们一起学习一个交互式可视化Python库--Bokeh. Bokeh基础 Bokeh是一个专门针对Web浏览器的呈现功能的交互式可视化Py ...

  9. python怎么打日志_怎样调试 日志 python 代码

    展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...

最新文章

  1. Unity iPhone Touch Animation Tutorial,untiy3d iphone简单动画开发教程
  2. 一个用JAVA实现的线段树类--泛型 重构.
  3. 2020年,人工智能如何走向高质量发展?
  4. java api使用ElastichSearch指南
  5. 访问index.php跳转,打开index.php后,跳转到/user/login.html
  6. linux内核对TCP的连接状态管理
  7. leetcode题解179-最大数
  8. android studio安装Kotlin(零)
  9. python编写赛车_python udp 协议发送接收秒速赛车平台搭建数据
  10. oracle子接点与父节点上下级关系数据库查询语句,及联查询,
  11. 了解SpringMVC框架及基本工作流程
  12. OC_内存管理(二)对象复制、循环引用问题、自动释放池
  13. Java|二叉树基础详解
  14. 熔断漏洞和幽灵漏洞_崩溃和幽灵:发现新的英特尔CPU漏洞
  15. stm32如何在官网下载标准函数库
  16. 导出pdf文件时加图片水印
  17. 一个从业(非正品)奢侈品十年从业者的经验和历程。
  18. 【竞品分析】Android音乐播放器的竞品分析
  19. 什么叫共同富裕,刘强东给老板们打了个样
  20. 国密算法SM2实现 vue+C#

热门文章

  1. 华为鸿蒙系统还不成熟,华为鸿蒙系统终于来了!只因这三点,苹果将面临空前一劫!...
  2. 投资理财的看法IT人
  3. python概念建模_机器学习基本概念
  4. 2022年桂林二级建造师机电工程施工相关法规冲刺试题及答案
  5. 一种简单的防反接防过压电路
  6. 用shell实现简易计算器
  7. 【SpringBoot】自定义启动Banner(附:使用生成艺术字体方法)
  8. labelme批量制作数据集教程
  9. Excel单元格内字符串反转
  10. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)...