with as python_python - with as的用法
摘自:http://www.cnblogs.com/DswCnblog/p/6126588.html
With 是什么?
有一些任务可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
如果不用with语句,代码如下:
file = open("/tmp/foo.txt")
data=file.read()
file.close()
这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:
file = open("/tmp/foo.txt")try:
data=file.read()finally:
file.close()
虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:
with open("/tmp/foo.txt") as file:
data= file.read()
With 如何工作
这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。
紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
下面例子可以具体说明with如何工作:
#!/usr/bin/env python#with_example01.py
classSample:def __enter__(self):print "In __enter__()"
return "Foo"
def __exit__(self, type, value, trace):print "In __exit__()"
defget_sample():returnSample()
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。 这些参数在异常处理中相当有用。我们来改一下代码,看看具体如何工作的。
#!/usr/bin/env python#with_example02.py
classSample:def __enter__(self):returnselfdef __exit__(self, type, value, trace):print "type:", typeprint "value:", valueprint "trace:", tracedefdo_something(self):
bar= 1/0return bar + 10with Sample() as sample:
sample.do_something()
这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新创建的Sample对象,并赋值给变量sample。
代码执行后:
bash-3.2$ ./with_example02.py
type:value: integer divisionormodulo by zero
trace:Traceback (most recent call last):
File"./with_example02.py", line 19, in sample.do_something()
File"./with_example02.py", line 15, indo_something
bar= 1/0
ZeroDivisionError: integer divisionor modulo by zero
实际上,在with后面的代码块抛出任何异常时,__exit__()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。
因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。
相关文章:

wcf系列学习5天速成——第四天 wcf之分布式架构(转载)
今天是wcf系列的第四天,也该出手压轴戏了。嗯,现在的大型架构,都是神马的, nginx鸡群,iis鸡群,wcf鸡群,DB鸡群,由一个人作战变成了群殴....... 今天我就分享下wcf鸡群,高…

检测jQuery.js是否已加载的判断代码
转载自http://www.jb51.net/article/27185.htm 测类、方法、变量或属性是否已存在,这是Javascript编程基础知识。在这里我们就是要检测jQuery()或$()函数是否存在 当然,该方法不局限于jQuery的检测,对与任何Javascript变量或函数都是通用的。…

Java中常见的锁简述
在Java的应用中,或多或少的都会接触到一些锁,那么问题就来了,在Java中,常见的锁有哪些,都有什么样的作用?? 这里给大家简单的简述一下这些学常见的锁。 本文件所涉及到的锁: 1.公平锁…

加了好友怎么还掉血_微信聊天窗口出现风险提醒,无法添加好友解决办法
再更,你想马上解封,你得有朋友。没有朋友,你就等个十天半个月!更新一下 帖子浏览人挺多的,有问题可以在评论里相互交流,下面是原文:先让我说一句脏话:傻x微信风控系统 终于特么的聊天…

[小明爬坑系列]AssetBundle原理介绍
一.简介 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。 二.移动平台特点 Assetbundle是可以把预制,文件以及场景都打包到Assetbundle中去的,但是在移动平台…

Ubuntu16.04菜单栏侧边栏不显示
2019独角兽企业重金招聘Python工程师标准>>> (1)只有桌面上显示一些原有的文档或图片。但打开文档或者图片后也是没有窗口菜单栏,这样连关闭都没法点,快捷AltF4也没有反应。而且鼠标点击拖动不了…

C 语言中的 strtok 调用小技巧
1 #include <stdio.h>2 #include <string.h>3 4 char *my_strtok(char *buf, char *delims)5 {6 static int first 1;7 if(first){ //8 first 0; // 互斥操作,确保后面代码仅在本次调用执行9 return strtok(buf, delims); 10…

powershell连接数据库_PowerShell 连接SQL Server 数据库
PowerShell 通过ADO.NET连接SQL Server数据库,并执行SQL脚本。工作中整理的一小段脚本,后来没有用上,先记录在这里:建立数据库连接查询返回一个DataTatble对象执行一条SQL语句通过事物执行多条SQL语句## 建立数据库连接.#function…

GDB调试进阶
GDB 调试 ------------------------------------------------------------------------------- gdb 帮助文档 help -- 查看 gdb 的命令种类 help <CmdType> -- 查看 CmdType 种类的 gdb 命令 apropos <keyWord> -- 查看关键字 keyWord 的相关命令 info <keyWord…

RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass
安全研究人员在官方的 RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass。该工具的下载量高达 2800 万次,但这并不意味着下载的所有版本都存在后门,受影响的版本是 v3.2.0.3,研究人员呼吁用户尽可能快的更新,认为可能有数…

读大叔深入理解javascript(2)
Module模式的应用: var Caculator function(eqt){var box document.getElementById(eqt);return {add:function(x,y){return xy;}} }; var a new Caculator(11); a.add(1,3); // return 4 这种方式每次都需要new 一下,也就是说每个实例在内存里都是一…

android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册、自定义广播与广播的类型。当我们学习完广播接收者之后,该如何才能让它起到作用呢?还有广播接…

jQuery中$(function(){})与(function($){})(jQuery)的区别
首先,这两个函数都是在页面载入后执行的函数,其中两者的区别在于: 在jQuery中$(function(){})等同于jQuery(function(){}),另一个写法为jQuery(document).ready(function(){ }),在DOM加载完成之后立即执行,…

UITableView注意点
在iOS应用中,UITableView应该是使用率最高的视图之一了。iPod、时钟、日历、备忘录、Mail、天气、照片、电话、短信、 Safari、App Store、iTunes、Game Center⋯几乎所有自带的应用中都能看到它的身影,可见它的重要性。然而在使用第三方应用时ÿ…

083、Prometheus架构(2019-05-05 周日)
参考https://www.cnblogs.com/CloudMan6/p/7692765.htmlPrometheus 是一个非常优秀的监控工具,准确的说,应该是监控方案。Prometheus 提供了监控数据搜集、存储、处理、可视化和告警一整套的解决方案。Prometheus 重要组件的架构如下:Prometh…

自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...
常规建表语句:CREATE TABLE test_table (id int(11) NOT NULL,name char(64) NOT NULL,password char(64) NOT NULL,PRIMARY KEY (name,id)) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENTtest;解析脚本代码:# coding:utf-8import redeftable_design_transf…

对云风 cstring 第二次解析
前言 从明天起 关心粮食和蔬菜 我有一所房子 面朝大海 春暖花开 本文前提条件 1.了解 posix 线程 2.了解 原子操作 3.具备简单C基础,或者 你也敲一遍. 如果上面不太清楚,你可以翻看我以前的博客,或者百度搜索. 结论 1.云风前辈的 玩具 cstring 有点坑, 内存管理很随意(也可能时…

C# 获取当前路径方法
//获取包含清单的已加载文件的路径或 UNC 位置。 public static string sApplicationPath Assembly.GetExecutingAssembly ( ).Location; //result: X:\xxx\xxx\xxx.dll (.dll文件所在的目录.dll文件名) //获取当前进程的完整路径,包含文件名(进程名)。 string st…

土地档案管理系统需求分析
土地档案管理系统需求分析 1 项目背景 随着国土大面积调查工作的全面展开和城镇地籍管理工作得以日趋细化,各种野外调查数据,不同比例尺图件资料急剧增加。特别是城市建设的空前发展以及土地有偿使用法规的实施,使得地籍变更日益频繁、地籍信…

mysql8.0 服务移除_Linux下彻底删除Mysql 8.0服务的方法
观看本文前最好有一定的Linux命令基础,具体为centos7.3环境中清除使用yum安装的Mysql卸载前请先关闭Mysql服务service mysql stop使用 rpm 命令的方式查看已安装的mysqlrpm -qa|grep mysql开始卸载Mysql服务使用yum安装需要先进行清除服务等yum remove mysql mysql-…

老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中,HierarchyViewer会调用自己的成员方法setupViewServer来把ViewServer装备好,那么我们这里先看下这个方法…

泛型详解 高级进阶
泛型详解 高级进阶 转载于:https://www.cnblogs.com/thiaoqueen/p/10830499.html

vim 的中文编码问题
在vim编辑的时候会出现中文编码问题,我们可以这样解决在/usr/share/vim/的目录下有一个vimrc文件打开这个文件,你可能要用sudo打开然后在最后输入这行代码保存即可:$> sudo vim /usr/share/vim/vimrc set fileencodingsutf-8,gb2312,gbk,g…

mysql回表_到底什么情况下mysql innodb会发生回表操作?
谢邀MySQL innodb的主键索引是簇集索引,也就是索引的叶子节点存的是整个单条记录的所有字段值,不是主键索引的就是非簇集索引,非簇集索引的叶子节点存的是主键字段的值。回表是什么意思?就是你执行一条sql语句,需要从两…
经验分享:CSS浮动(float,clear)通俗讲解
很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程。 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家。 写在前面的话: 由于CSS内容比较多,小菜…

前端开发学习Day27
第27天,我只做了一个案例。布局部分花了一整个上午,很乱。代码还是写的少,没有思路。下午好不容易做好了布局,写脚本的时候又被卡死,我现在严重怀疑自己的大脑是怎么长的……本着不抛弃不放弃的原则,晚上找…

对象模型创建SharePoint2010多选字段SPFieldMultiChoice
在使用页面方式创建SharePoint 2010的选项(Choice)字段时,选项字段的显示方式有3种:下拉列表、单选按钮、多选。但是如果使用对象模型创建时,下拉列表和单选按钮只能使用SPFieldChoice类来创建,而多选显示方式就要使用SPFieldMult…

docker mysql忘记密码_docker基于mysql镜像构建mysql容器忘记密码解决办法
环境:[rootmaster-106 ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)[rootmaster-106 ~]# docker --versionDocker version 19.03.13, build 4484c46d9dMySQL 5.7.31# 进入mysql容器[rootmaster-106 ~]# docker ps|grep mysql05759803adb9 mysq…

Android App优化之延长电池续航时间
禁用广播接收器 确保广播接收器在真正须要时才运行指令,在onResume中当中广播接收器,在onPause中禁用。 在manifest文件里声明广播接收器时,事先默认配置成禁用的 <receiver android:name".BatterReceiver" android:enabled&quo…

myeclipse中安装svn插件
1、下载最新的SVN包(我下的是1.0.6版): http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID2240 2、在你的磁盘上任意位置创建文件夹:“myplugins/svn”。名字可以任取,为了方便插件管理,建议名称为“myplugins…