Python中with及contextlib的用法详解


Posted in Python onJune 08, 2017

本文实例讲述了Python中with及contextlib的用法。分享给大家供大家参考,具体如下:

平常Coding过程中,经常使用到的with场景是(打开文件进行文件处理,然后隐式地执行了文件句柄的关闭,同样适合socket之类的,这些类都提供了对with的支持):

with file('test.py','r') as f :
  print f.readline()

with的作用,类似try...finally...,提供一种上下文机制,要应用with语句的类,其内部必须提供两个内置函数__enter__以及__exit__。前者在主体代码执行前执行,后则在主体代码执行后执行。as后面的变量,是在__enter__函数中返回的。通过下面这个代码片段以及注释说明,可以清晰明白__enter__与__exit__的用法:

#!encoding:utf-8
class echo :
  def output(self) :
    print 'hello world'
  def __enter__(self):
    print 'enter'
    return self #返回自身实例,当然也可以返回任何希望返回的东西
  def __exit__(self, exception_type, exception_value, exception_traceback):
    #若发生异常,会在这里捕捉到,可以进行异常处理
    print 'exit'
    #如果改__exit__可以处理改异常则通过返回True告知该异常不必传播,否则返回False
    if exception_type == ValueError :
      return True
    else:
      return False
with echo() as e:
  e.output()
  print 'do something inside'
print '-----------'
with echo() as e:
  raise ValueError('value error')
print '-----------'
with echo() as e:
  raise Exception('can not detect')

运行结果:

Python中with及contextlib的用法详解

contextlib是为了加强with语句,提供上下文机制的模块,它是通过Generator实现的。通过定义类以及写__enter__和__exit__来进行上下文管理虽然不难,但是很繁琐。contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制。常用框架如下:

from contextlib import contextmanager
@contextmanager
def make_context() :
  print 'enter'
  try :
    yield {}
  except RuntimeError, err :
    print 'error' , err
  finally :
    print 'exit'
with make_context() as value :
  print value

contextlib还有连个重要的东西,一个是nested,一个是closing,前者用于创建嵌套的上下文,后则用于帮你执行定义好的close函数。但是nested已经过时了,因为with已经可以通过多个上下文的直接嵌套了。下面是一个例子:

from contextlib import contextmanager
from contextlib import nested
from contextlib import closing
@contextmanager
def make_context(name) :
  print 'enter', name
  yield name
  print 'exit', name
with nested(make_context('A'), make_context('B')) as (a, b) :
  print a
  print b
with make_context('A') as a, make_context('B') as b :
  print a
  print b
class Door(object) :
  def open(self) :
    print 'Door is opened'
  def close(self) :
    print 'Door is closed'
with closing(Door()) as door :
  door.open()

运行结果:

Python中with及contextlib的用法详解

总结:python有很多强大的特性,由于我们平常总习惯于之前C++或java的一些编程习惯,时常忽略这些好的机制。因此,要学会使用这些python特性,让我们写的python程序更像是python。

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python ZipFile模块详解
Nov 01 Python
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
理解Python垃圾回收机制
Feb 12 Python
scrapy爬虫完整实例
Jan 25 Python
matplotlib subplots 设置总图的标题方法
May 25 Python
pytorch数据预处理错误的解决
Feb 20 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
python 检测图片是否有马赛克
Dec 01 Python
基于tensorflow权重文件的解读
May 26 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 #Python
Python实现对象转换为xml的方法示例
Jun 08 #Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 #Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 #Python
Python3 socket同步通信简单示例
Jun 07 #Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 #Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 #Python
You might like
XAMPP安装与使用方法详细解析
2013/11/27 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
9个比较实用的php代码片段
2016/03/15 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
vue实现商城上货组件简易版
2017/11/27 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
python中的装饰器详解
2015/04/13 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
防灾减灾标语
2014/10/07 职场文书
2014年会计工作总结
2014/11/27 职场文书
运动会广播稿20字
2015/08/19 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
mysql优化
2021/04/06 MySQL
golang 实现Location跳转方式
2021/05/02 Golang
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python