在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. c 与java 反射性能_谈谈Java 反射的快慢
  2. java保存多张图片格式_从多个URL下载多个图像文件并保存到本地计算机(使用R)...
  3. Apache下实现禁止目录浏览
  4. linux服务之DHCP
  5. python自动化开发例子_Python自动化开发从浅入深-语言基础(常用模块)
  6. ASP.NET Core 源码学习之 Logging[3]:Logger
  7. android 图片文字布局,Android自定义控件图片+文字布局
  8. 在网站添加客服QQ,打开临时回话框(不用加为好友)
  9. MIT Scheme编译scm文件
  10. Qt之调用Windows图片查看器预览图片
  11. [CTFHub] Web RCE Write ups
  12. 机器学习之logistic 回归
  13. Zookeeper源码之集群选举
  14. CCF 俄罗斯方块(满分代码 + 解题思路 + 技巧总结)201604 - 2
  15. 感谢国内知名 Android 开发者 「stormzhang」推荐了我的公众号
  16. 江苏大学 操作系统 知识点提纲 期末考试/考研 复习
  17. 联想家悦微型计算机,联想家悦台式电脑拆机知识分享
  18. BEA提出SOA四大策略
  19. 为什么rand()每次产生的随机数都一样
  20. 通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()

热门文章

  1. 类文件具有错误的版本 55.0, 应为 52.0
  2. 初级开发:我还在Android路上披荆斩棘,转眼就被大厂的程序员凡尔赛了
  3. 记账APP:小哈记账4——记账首页页面的制作(1)
  4. Midas/Civil 2011 v2.1 Win32_64-ISO 1CD(通用的结构分析软件)
  5. Python基础学习项目之 简单音乐播放器
  6. 每次10分钟免费网络电话,无限次数
  7. 男孩养志气 女孩养气质
  8. html中flash的简单动画效果,css实现快速炫酷抖动动画效果
  9. r语言chatseries_r中chartseries
  10. php动态模拟时钟,使用canvas制作简易实时动态时钟