在Python中with关键字很常用,相信你也经常遇见,例如:

if isinstance(self.commands, str):  with(settings(warn_only = True)):  sudo(self.commands, shell=False)  

你或许会困惑with到底是个什么东西?其实with关键字并不难理解今天我们就来说说with statement

考虑下面这段代码:

set things up
try:  do something  
finally:  tear things down  

“set things up” 你可以理解为打开某个文件或者操作数据库的时候创建一个连接,对应的“tear things down” 可以理解为关闭文件,关闭连接(如果没有释放连接可能会造成内存泄露喔)。try-finally保证“tear things down”必须被执行,不用多解释。

如果我们的代码中很多的的地方都需要 “set things up” 和 “tear things down”操作那么我们把这样的操作封装在一个库中代码是不是变得更简洁了也方便修改了呢(一改全改)?

有以下几种方式去封装上面的操作:

def controlled_execution(callback):  set things up  try:  callback(thing)  finally:  tear things down  def my_function(thing):  do something  controlled_execution(my_function)  

这种方法将上面的"do something" 提取出来作为一个函数 然后传给我们封装好了的controlled_execution并执行,这种方法看着有点别扭感觉,代码不是很清晰.

另外一种方式是使用“yield”

 def controlled_execution():  set things up  try:  yield thing  finally:  tear things down  for thing in controlled_execution():  do something with thing  

但是在 Python 2.4之前 yield是不允许在 try-finally中使用的,同样别扭的是用了一个loop 结构但是你知道你只执行这个代码一次。

所以考虑到前面两种解决方案的缺点,GvR 和 Python-dev 团队最后想出了一个通用的方法那就是with statement

class controlled_execution:  def __enter__(self):  set things up  return thing  def __exit__(self, type, value, traceback):  tear things down  with controlled_execution() as thing:  some code  

现在,当“with” 执行的时候,Python 会调用相应的 __enter__ 方法并且把返回的值赋值给as 后面的变量。Python会执行with下面的“some code”并且不管“some code”中发生了什么都会调用 __exit__  方法。

另外__exit__方法还可以处理异常如返回一个正确的值,例如

def __exit__(self, type, value, traceback):  return isinstance(value, TypeError)  

In Python 2.5, the file object has been equipped with __enter__ and__exit__ methods; the former simply returns the file object itself, and the latter closes the file:

在Python 2.5中,文件对象也可以和__enter__ and__exit__ 结合起来使用,例如

   >>> f = open("x.txt")  >>> f  <open file 'x.txt', mode 'r' at 0x00AE82F0>  >>> f.__enter__()  <open file 'x.txt', mode 'r' at 0x00AE82F0>  >>> f.read(1)  'X'  >>> f.__exit__(None, None, None)  >>> f.read(1)  Traceback (most recent call last):  File "<stdin>", line 1, in <module>  ValueError: I/O operation on closed file  
 <span class="pykeyword" style="color:rgb(178,34,34);"></span>  
with open("x.txt") as f:  data = f.read()  do something with data  

英文出处:Understanding Python's "with" statement

With用法-Python相关推荐

  1. python join函数用法-Python join()函数

    今天写python 100例时,有个题目是大致是这样的:已知输入形式是1+3+2+1,要求输出形式为1+1+2+3 一开始思路是将输入的字符串用split()函数划分成数组,在对数组进行排序,再用fo ...

  2. python中path的用法,python中path的用法

    如何将python的路径加到path中 方法一:函数添加 1 import sys 2 查看sys.path 3 添加sys.path.append("c:\\") 方法二:修改环 ...

  3. map函数的用法python,详解Python map函数及Python map()函数的用法

    python map函数 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list ...

  4. python中readlines函数用法,python中read() readline()以及readlines()用法

    我们谈到"文本处理"时,我们通常是指处理的内容.Python 将文本文件的内容读入可以操作的字符串变量非常容易.文件对象提供了三个"读"方法: .read(). ...

  5. 反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第四篇.前三篇传送门在此,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) 谈谈 Pyth ...

  6. python items函数用法,Python中dictionary items()系列函数的用法实例

    本文实例讲述了Python中dictionary items()系列函数的用法,对Python程序设计有很好的参考借鉴价值.具体分析如下: 先来看一个示例: import html # availab ...

  7. python中int用法,Python中int()函数的用法浅析

    int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builtin__ ...

  8. python中match的六种用法,python 正则函数match()和search()用法示例

    这篇文章主要为大家详细介绍了python 正则函数match()和search()用法示例,具有一定的参考价值,可以用来参考一下. 对python正则表达式函数match()和search()的区别详 ...

  9. python冒号用法-python 列表中[ ]中冒号‘:’的作用

    中括号[ ]:用于定义列表或引用列表.数组.字符串及元组中元素位置 list1 = ["physics", "chemistry", 1997, 2000] l ...

  10. python中for in的用法python中for in的用法

    for in 说明:也是循环结构的一种,经常用于遍历字符串.列表,元组,字典等 格式: 1 2 for x in y:     循环体 执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束. 例 ...

最新文章

  1. Bash之break、continue和return命令在循环中的作用
  2. Vue教程1 【Vue核心】
  3. 第十一天 • 库塔山植物园
  4. 软件设计方法--契约式设计Design by contract
  5. px、em、pt之间的区别与互相转换
  6. oracle存储过程获取异常信息码和异常信息
  7. Spring Cloud构建微服务架构—服务消费Ribbon
  8. excel公式:用countif、match、index合并同类项
  9. 专题实验 字符集(全球化支持)
  10. B2.Java代码查错
  11. 算天数什么时候加一什么时候不加一_陌陌加公会不加公会的区别?
  12. 史蒂芬.霍金:警惕政府“人工智能军备竞赛”
  13. 移动互联网时代,如何优化你的网络 —— 域名解析篇
  14. 正确理解TensorFlow中的logits
  15. Win7 64 NVMe驱动安装
  16. linux校园网设计方案,linux在校园网的应用方案.doc
  17. 服务器已联网 不能远程桌面,几种常见的Windows 服务器无法联网/无法连接远程桌面等故障解决方案...
  18. 图形化开发(五)041-Three.js之Camera相机——target焦点和lookAt()方法、OrthographicCamera正交相机、PerspectiveCamera透视相机、相机插件
  19. 智能DNS - 免费智能DNS解析服务-迄今为止最好用的智能DNS
  20. 用WinDbg探索CLR世界 [4] 方法的调用机制

热门文章

  1. 机器学习《西瓜书》9.4解答——k-means算法:编程实现k均值算法,设置三组不同的k值、三组不同初始中心点,在西瓜数据集4.0上进行实验比较,并讨论什么样的初始中心有助于得到好结果。
  2. html5给图片加圆圈,js+canvas制作的用鼠标绘制圆形图案,可叠加产生不同色
  3. 抖音seo源码开发代码分享
  4. lol帧数不稳定是服务器问题吗,英雄联盟fps忽高忽低怎么办_英雄联盟fps不稳定的解决方法...
  5. 宿舍管理人员使用的宿舍管理软件——C代码
  6. x的平方根 x的n次幂
  7. 中秋节福利还是要送的,不抽奖,只要你看到了就有份
  8. 如何用Python写一个计算器软件 附带效果图
  9. 微信小程序图片显示不全
  10. java程序语言设计课后答案向金海,看看这篇文章吧!