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装饰器使用示例及实际应用例子
Mar 06 Python
python中查看变量内存地址的方法
May 05 Python
python对url格式解析的方法
May 13 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python3安装pip工具的详细步骤
Oct 14 Python
Python jieba库用法及实例解析
Nov 04 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
python 中的[:-1]和[::-1]的具体使用
Feb 13 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python实现自动打卡的示例代码
Oct 10 Python
python 可视化库PyG2Plot的使用
Jan 21 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
PHP实现留言板功能的详细代码
2017/03/25 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
python Django中models进行模糊查询的示例
2019/07/18 Python
python程序 创建多线程过程详解
2019/09/23 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
Python netmiko模块的使用
2020/02/14 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Python如何在bool函数中取值
2020/09/21 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
同学聚会策划方案
2014/06/06 职场文书
先进个人总结范文
2015/02/15 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle