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的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python 中 Meta Classes详解
Feb 13 Python
python常用函数详解
Sep 13 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
Django保护敏感信息的方法示例
May 09 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
jupyter 添加不同内核的操作
Feb 06 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python 批量修改/替换数据的实例
2018/07/25 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
办理居住证介绍信
2014/01/15 职场文书
简单的辞职信范文
2014/01/18 职场文书
大学生暑期实践感言
2014/02/26 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
优质服务标语口号
2015/12/26 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
比较node.js和Deno
2021/04/27 Javascript
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
php png失真的原因及解决办法
2021/10/24 PHP
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS