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实现的防DDoS脚本
Feb 08 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
pytorch中的inference使用实例
Feb 20 Python
python的sys.path模块路径添加方式
Mar 09 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
python 实现socket服务端并发的四种方式
Dec 14 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php实现购物车功能(下)
2016/01/05 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
js实现随机点名功能
2020/12/23 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
django foreignkey(外键)的实现
2019/07/29 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
Python 图片处理库exifread详解
2021/02/25 Python
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
贷款委托书
2014/08/01 职场文书
法人委托书范本格式
2014/09/15 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
大学生读书笔记范文
2015/07/01 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL