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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
利用Python开发微信支付的注意事项
Aug 19 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
详解python中groupby函数通俗易懂
May 14 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
Python中Selenium对Cookie的操作方法
Jul 09 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 变量定义方法
2009/06/14 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
js实现转动骰子模型
2019/10/24 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
python之PyMongo使用总结
2017/05/26 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python实现动态创建类的方法分析
2019/06/25 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
校园餐饮创业计划书
2014/01/10 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
难忘的一天教学反思
2014/04/30 职场文书
冬季施工防火方案
2014/05/17 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
复兴之路展览观后感
2015/06/02 职场文书
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android