with从Python 2.5就有,需要from __future__ import with_statement。自python 2.6开始,成为默认关键字。

也就是说with是一个控制流语句,跟if/for/while/try之类的是一类的,with可以用来简化try finally代码,看起来可以比try finally更清晰。

with EXPRESSION [ as VARIABLE] WITH-BLOCK

基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。

紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。

with expresion as variable的执行过程是,首先执行__enter__函数,它的返回值会赋给as后面的variable,想让它返回什么就返回什么,只要你知道怎么处理就可以了,如果不写as variable,返回值会被忽略。

然后,开始执行with-block中的语句,不论成功失败(比如发生异常、错误,设置sys.exit()),在with-block执行完成后,会执行__exit__函数。

这样的过程其实等价于:

try:执行 __enter__的内容执行 with_block.
finally:执行 __exit__内容

再看个例子

file = open("/tmp/foo.txt")
try:data = file.read()
finally:file.close()

使用with…as…的方式替换,修改后的代码是:

with open("/tmp/foo.txt") as file:data = file.read()
#!/usr/bin/env python
# with_example01.pyclass Sample:def __enter__(self):print "In __enter__()"return "Foo"def __exit__(self, type, value, trace):print "In __exit__()"def get_sample():return Sample()
with get_sample() as sample:print "sample:", sample

执行结果为

In __enter__()
sample: Foo
In __exit__()
  1. __enter__()方法被执行

  2. __enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量’sample’

  3. 执行代码块,打印变量"sample"的值为 “Foo”

  4. __exit__()方法被调用with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。这些参数在异常处理中相当有用。

Python with...as... 语法深入解析相关推荐

  1. standfordcorenlp在python环境下的使用(中文分词、词性标注、命名实体分析、解析语法、解析语法关系)

    操作环境:windows 需求:安装PyCharm.JDK1.8 第一步: 首先从stanford NLP网页下载两个包,分别是stanford-corenlp-full-2018-10-05.zip ...

  2. 动手写的Python的HTML语法分析器(面向对象)

    动手写的Python的HTML语法分析器(面向对象) 主要包括4个文件,util.py文件主要负责截取每个块. rules.py文件定义两个类,超类Rule和分别对应的子类,子类定义了不同的划分块的要 ...

  3. python 追加到字典_使用Python读取,写入和解析JSON

    JSON是用于数据交换的轻量级数据格式,可以很容易地被人类读取和写入,也可以由机器轻松解析和生成.它是一种完全独立于语言的文本格式.为了处理JSON数据,Python有一个名为的内置包json. 示例 ...

  4. 笨办法学 Python · 续 练习 33:解析器

    练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...

  5. Python的基本语法汇总

    Python的基本语法汇总 1.常用列表的操作 2.常用字典的操作 3.文件基本操作 4.if/else三元表达符 5.生成器表达式(不占内存) 6.Python的while语句或者for语句可以带e ...

  6. python电子章_python二级电子教案 第2章 Python语言基本语法元素

    <python二级电子教案 第2章 Python语言基本语法元素>由会员分享,可在线阅读,更多相关<python二级电子教案 第2章 Python语言基本语法元素(46页珍藏版)&g ...

  7. python基本常用语法函数数据结构

    1. Python概述 1989年12月,Google工程师 Guido van Rossum为了打发圣诞节假期,开发了ABC语言的后继,并以他自己喜欢的一个情景剧 Monty Python's Fl ...

  8. python进阶学习--- django框架解析 ---领悟编程语言共性与特性【后续详解】

    python进阶学习---> django框架解析 --->领悟编程语言共性与特性 1.python语言介绍   python解释型脚本语言 2.python执行原理   python解释 ...

  9. 河南师范大学python+学习笔记2 python语言基本语法元素

    吃水不忘挖井人 首先对河南师范大学的各位老师们说声谢谢.他们是: 张磊老师.张倩倩老师.刘金金老师.郭凌云老师.李晓艳老师.李志先老师.陶华亭老师.周雪燕老师.王爱菊老师.陈劲松老师.黄晓巧老师.夏辉 ...

最新文章

  1. Linux Shell 逻辑运算符、逻辑表达式详解
  2. php7怎么开pdo,linux php7.2开启pdo等扩展
  3. c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
  4. Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤
  5. 使用Visio 2000逆向工程将代码转换为UML图表
  6. Nginx 禁止猜测路径上传恶意代码
  7. Linux CentOS 7 安装 JAVA(jdk-8u181-linux-x64)
  8. 剑指offer——面试题35:第一个只出现一次的字符
  9. Kubernetes 学习笔记---RESTClient 详解
  10. python 实现复制文件夹以及文件夹下的子文件
  11. 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
  12. python右对齐_Python中print函数输出时的左右对齐问题
  13. 基频和倍频的概念_基频峰,泛频峰,倍频峰,二倍频峰的区别
  14. html换行出现省略号,css怎么设置不换行显示省略号?
  15. 【List】个人 常用学习工作软件清单
  16. 制作EDM 邮件规范
  17. MPB:林科院袁志林组-野外树木根系取样及根际土收集操作规程
  18. Brain Stimulation: ​大脑电生理记录和刺激工具包(BEST)
  19. ChatGPT惊人语录大赏
  20. 【Unity3D】Animator动画播放时卡死在第一帧BUG系列

热门文章

  1. GC回收垃圾对象过程
  2. java的4种代码块
  3. 一步步学习微软InfoPath2010和SP2010--第四章节--处理SP列表表单(6)--列表表单的局限...
  4. c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt
  5. Java黑皮书课后题第6章:**6.24(显示当前日期和时间)程序清单2-7显示当前时间。改进这个例子,显示当前的日期和时间。程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路
  6. Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
  7. php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
  8. 数据结构(十八)树的定义与存储结构
  9. react当中子组件改变父组件的状态
  10. 用官方2012版本131兆,一共有四个自带软件