Python with...as... 语法深入解析
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__()
__enter__()方法被执行
__enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量’sample’
执行代码块,打印变量"sample"的值为 “Foo”
__exit__()方法被调用with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。这些参数在异常处理中相当有用。
Python with...as... 语法深入解析相关推荐
- standfordcorenlp在python环境下的使用(中文分词、词性标注、命名实体分析、解析语法、解析语法关系)
操作环境:windows 需求:安装PyCharm.JDK1.8 第一步: 首先从stanford NLP网页下载两个包,分别是stanford-corenlp-full-2018-10-05.zip ...
- 动手写的Python的HTML语法分析器(面向对象)
动手写的Python的HTML语法分析器(面向对象) 主要包括4个文件,util.py文件主要负责截取每个块. rules.py文件定义两个类,超类Rule和分别对应的子类,子类定义了不同的划分块的要 ...
- python 追加到字典_使用Python读取,写入和解析JSON
JSON是用于数据交换的轻量级数据格式,可以很容易地被人类读取和写入,也可以由机器轻松解析和生成.它是一种完全独立于语言的文本格式.为了处理JSON数据,Python有一个名为的内置包json. 示例 ...
- 笨办法学 Python · 续 练习 33:解析器
练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...
- Python的基本语法汇总
Python的基本语法汇总 1.常用列表的操作 2.常用字典的操作 3.文件基本操作 4.if/else三元表达符 5.生成器表达式(不占内存) 6.Python的while语句或者for语句可以带e ...
- python电子章_python二级电子教案 第2章 Python语言基本语法元素
<python二级电子教案 第2章 Python语言基本语法元素>由会员分享,可在线阅读,更多相关<python二级电子教案 第2章 Python语言基本语法元素(46页珍藏版)&g ...
- python基本常用语法函数数据结构
1. Python概述 1989年12月,Google工程师 Guido van Rossum为了打发圣诞节假期,开发了ABC语言的后继,并以他自己喜欢的一个情景剧 Monty Python's Fl ...
- python进阶学习--- django框架解析 ---领悟编程语言共性与特性【后续详解】
python进阶学习---> django框架解析 --->领悟编程语言共性与特性 1.python语言介绍 python解释型脚本语言 2.python执行原理 python解释 ...
- 河南师范大学python+学习笔记2 python语言基本语法元素
吃水不忘挖井人 首先对河南师范大学的各位老师们说声谢谢.他们是: 张磊老师.张倩倩老师.刘金金老师.郭凌云老师.李晓艳老师.李志先老师.陶华亭老师.周雪燕老师.王爱菊老师.陈劲松老师.黄晓巧老师.夏辉 ...
最新文章
- Linux Shell 逻辑运算符、逻辑表达式详解
- php7怎么开pdo,linux php7.2开启pdo等扩展
- c 窗体程序 mysql_C\C++开发MySQL程序简介(下)
- Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤
- 使用Visio 2000逆向工程将代码转换为UML图表
- Nginx 禁止猜测路径上传恶意代码
- Linux CentOS 7 安装 JAVA(jdk-8u181-linux-x64)
- 剑指offer——面试题35:第一个只出现一次的字符
- Kubernetes 学习笔记---RESTClient 详解
- python 实现复制文件夹以及文件夹下的子文件
- 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
- python右对齐_Python中print函数输出时的左右对齐问题
- 基频和倍频的概念_基频峰,泛频峰,倍频峰,二倍频峰的区别
- html换行出现省略号,css怎么设置不换行显示省略号?
- 【List】个人 常用学习工作软件清单
- 制作EDM 邮件规范
- MPB:林科院袁志林组-野外树木根系取样及根际土收集操作规程
- Brain Stimulation: ​大脑电生理记录和刺激工具包(BEST)
- ChatGPT惊人语录大赏
- 【Unity3D】Animator动画播放时卡死在第一帧BUG系列
热门文章
- GC回收垃圾对象过程
- java的4种代码块
- 一步步学习微软InfoPath2010和SP2010--第四章节--处理SP列表表单(6)--列表表单的局限...
- c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt
- Java黑皮书课后题第6章:**6.24(显示当前日期和时间)程序清单2-7显示当前时间。改进这个例子,显示当前的日期和时间。程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路
- Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
- php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
- 数据结构(十八)树的定义与存储结构
- react当中子组件改变父组件的状态
- 用官方2012版本131兆,一共有四个自带软件