在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用。

官方的reference上有关with statement是这样说的,With申明把由context manager定义的方法的执行块包装起来。这样可以把try...except...finally的使用模式封装起来已被之后方便重用。

官方的定义如下:

with_stmt ::= "with" with_item ("," with_item)* ":" suite

with_item ::= expression ["as" target]

只有一个"item"的with申明的执行过程如下:

计算出内容表达式(context expression)以获取内容管理(context manager),该表达式是在with_item中给出的expression。

内容管理器(context manager)加载__exit__()方法以备之后使用

内容管理器(context manager)触发__enter__()方法

假如一个目标(with_item)包含在with申明中,那么__enter__()的返回值将赋值给该目标。注意:With申明保证如果__enter__()函数的执行没有报错,那么__exit__()将总是执行。 如果在赋值给目标(with_item)的过程中出错,那么被视作该错误是在执行程序组中发生的。参考第六步

执行程序组(suite)

内容管理器(context manager)中的__exit__()方法触发。假如程序组中出现异常或错误,那对应的type,value,以及traceback全部传入__exit__()方法中去。否则,三个None值传入方法中去。

如果程序组中由于异常退出了,并且__exit__()的返回值为假,那么该异常重新引发。假如返回值为真,那么忽略该异常,继续执行With申明之后的程序。

如果程序组中并非由于异常退出,忽略__exit__()的返回值,该干嘛干嘛。

多个目标(with_item)在with申明中的情况,内容管理器(context manager)将其看做多个with申明嵌套。例子如下:

with A() as a, B() as b:

suite

同于:

with A() as a:

with B() as b:

suite

以上是With申明具体的内部执行过程,可以看出,其中最核心是内容管理器(context manager),所以我又查阅了有关with申明的内容管理器(with statment context managers)的相关内容。

Context Manager主要是用来管理在with申明中定义的运行时内容(runtime context),也可以说是一种环境,一个状态。 该管理器实现了两个方法,一个是__enter__()方法,一个是__exit__()方法。

__enter__()方法主要是进入运行时内容(runtime context)并返回与之相对应的对象。 该方法的返回值的会绑定到使用该context Manager的with申明AS标识符之后的内容。举个例子:

with open(r'D:/test.txt', 'r', encoding='utf-8') as a_file:

process(a_file)

该内容管理器(context manager)中的__enter__()方法返回的是一个文件对象,该对象赋值给了a_file。

在举个例子,浮点型数据运算时需要设定一个计算环境(contexts),该环境可以设定精度,进位的规则,决定哪些中情况视为异常,限制指数范围等等。可以使用getcontext()和setcontext()方法来实现,也可以用localcontext() 和with申明结合的方法来实现。

from decimal import localcontext

with localcontext() as ctx:

ctx.prec = 42 # Perform a high precision calculation

s = calculate_something()

s = +s # Round the final result back to the default precision

__exit__(exc_type, exc_val, exc_tb)方法就是退出这个运行时内容或环境(runtime context)并返回一个布尔值的变量来确定是否忽略中途出现的异常情况。如果中途在with申明中的执行体中出现了什么问题。就会把对应的异常类型,值以及回溯信息传给该方法,没有异常就传入None。如果有异常传入并且布尔值为真就忽略该异常,如果有异常传入但布尔值为假就像正常一样抛出异常。内容管理器的好处就如之前所说一样就是把try...except...finally的使用模式封装起来已被之后方便重用。

有关contextlib的内容将之后更新。

python 中del 的用法

python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于pyth ...

python中argparse模块用法实例详解

python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

【313】python 中 print 函数用法总结

参考:python 中 print 函数用法总结 参考:Python print() 函数(菜鸟教程) 参考:Python 3 print 函数用法总结 目录: 字符串和数值类型 变量 格式化输出 p ...

python中MySQLdb模块用法实例

篇文章主要介绍了python中MySQLdb模块用法,以实例形式详细讲述了MySQLdb模块针对MySQL数据库的各种常见操作方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python中 ...

python中hashlib模块用法示例

python中hashlib模块用法示例 我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib ha ...

Python Deque 模块使用详解,python中yield的用法详解

Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...

Python中super的用法【转载】

Python中super的用法[转载] 转载dxk_093812 最后发布于2019-02-17 20:12:18 阅读数 1143  收藏 展开 转载自 Python面向对象中super用法与MRO ...

Python中AND-OR的用法

学习Python中的lambda函数的时候,才发现原来Python中的AND和OR还可以有一些别的用法.Python中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个.文章的部分例子来 ...

python中的有趣用法

本文给除了python中几个有趣的用法,可以给我们不一样的启发 1: Python中模拟使用C++ 中的   cout << import sys  class ostream: def  ...

随机推荐

Leetcode&colon; Create Maximum Number

Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

hdu 5587 规律

题意:开始序列{1}; 一次变换{1,1,2}: 两次变换{1,1,2,1,2,2,3} ... 求s[n];题解:打表 S1,S2,S4,S8,S16,S32......公式 S[n]=S[最近的比 ...

Intent的详细解析以及用法

Intent的详细解析以及用法      Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...

The Ninth Hunan Collegiate Programming Contest &lpar;2013&rpar; Problem C

Problem C Character Recognition? Write a program that recognizes characters. Don't worry, because yo ...

leetcode 83

83. Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that e ...

Extjs3笔记 fbar

在项目中会遇到在grid右下角显示合计之类的显示. 之前使用过的方式: 1.用width强制顶过去. 2.利用css来控制. 弊端: 利用第一种方式:导致调整窗口大小时会导致合计不能根据窗体的大小变化 ...

pythond对象、异常、反射的学习笔记

python多继承,刚开始我是表示惊讶的,毕竟学的php,哪来的多继承?顶多也就是利用接口模拟多继承后者使用反射机制实现.那么还是来看看python的强大吧 1 首先,Python的类继承了多个类,那 ...

&lbrack;置顶&rsqb; Hibernate从入门到精通(十)多对多单向关联映射

上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

【MongoDB】MongoDB与项目搭配启动进程

项目启动/数据连接命令  (20180701成功且不用再找正确关闭mongoDB的方式) 如上图在mongoDB的bin目录的同级新建mongo.config.mongostart.bat.mongo ...

saltstack常用模块

介绍一些常用的saltstack模块,更多模块参考官方网站 1.跟安装包相关的模块:salt.states.pkg salt.states.pkg.downloaded(name, version=N ...

python中with是什么意思,Python中With的用法相关推荐

  1. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)

    使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...

  2. python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...

    大数据文摘授权转载自数据派THU 作者:MOHD SANAD ZAKI RIZVI 本文主要介绍了: TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习 ...

  3. python函数手册68_直接在python中检索68个内置函数?

    Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name: >>> sorted(k for k, v i ...

  4. load python txt文件_详解Python中numpy.loadtxt()读取txt文件

    为了方便使用和记忆,有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件. 读取txt文件我们通常使用 numpy 中的 loadtx ...

  5. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  6. python post与get的区别_python中get和post有什么区别

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  7. python中chr的用法_python中chr()函数和ord()函数的用法

    原博文 2018-06-11 21:52 − 一,chr()函数 格式:Chr(<数值表达式>) 说明:函数返回值类型为String,其数值表达式值取值范围为0~255. 例如:Print ...

  8. python语言中一切皆对象_2 python 中一切皆对象

    python 中一皆对象 在 python 编程语言中所有的一切都是对象 , python 语言相对于 C++ 或 java 这样的语言 (静态语言), 面向对象这个思想更加的彻底. 2.1 函数和类 ...

  9. python中mainloop什么意思_Python Turtle mainloop()用法

    我有一个online tutorial的以下代码来学习基于事件的编程,方法是在点击鼠标时使停止灯改变状态.这里是我的代码的全部:Python Turtle mainloop()用法 import tu ...

  10. python使用matplotlib可视化、查看matplotlib中常用的线条形式(line style)和数据点标记形状(marker)

    python使用matplotlib可视化.查看matplotlib中常用的线条形式(line style)和数据点标记形状(marker) 目录

最新文章

  1. 动态路由选择协议(三)链路状态路由选择协议
  2. 【CV】使用 scikit-image 进行图像处理
  3. 鸿蒙系统发红包,鸿蒙修真录红包版
  4. weblogic工具_WebLogic Classloader分析工具
  5. 如何成为一个技术全面的架构师
  6. [原]gcc 中c实现所定义的特征
  7. 盘点购物分享系统,有兴趣的来看看哦
  8. 用excel制作,出入库信息管理表,动态库存表
  9. 无火花工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. c语言第三章课后作业答案,C语言第三章习题带答案
  11. 3dmax和python做3d动画_3D动画和影视建模,用什么软件或者多个什么软件结合做比较好?...
  12. html中鼠标移动在标签上出现小手形状
  13. Echarts中迁徙图,设置点和航线的不同颜色
  14. Python3中的多态 ,鸭子类型
  15. 降维 (Dimensionality Reduction)
  16. PAD智龙迷城(puzzle and dragon)辅助转珠算法思路和python实现
  17. ssm基于BS架构的校园爱心捐赠与物品交换平台的设计与实现毕业设计源码301133
  18. 爬虫小白第一课、从安装python到写出第一个爬虫程序、Pycharm安装详解
  19. 软件安全开发生命周期(SSDL)全景图
  20. CEAC之《计算机应用助理工程师》2

热门文章

  1. IDEA 中文太丑解决方法
  2. SharePoint 2013 安装图解
  3. 这这这。。。有神么问题
  4. java形参列表怎么理解_关于Java中形参与实参的理解
  5. 【2022考研】没有考上海大,调剂去了西南大学,随手记录一下失败者经验:从中专到研究生英语应该如何复习
  6. Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)
  7. wireMock单机版jar包的使用
  8. CefSharp高版本IME定位问题
  9. 数说CS|北航人工智能是怎样的存在?
  10. Python批量爬取简历模板