深入浅析python with语句简介


Posted in Python onApril 11, 2018

with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍)。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

术语

要使用 with 语句,首先要明白上下文管理器这一概念。有了上下文管理器,with 语句才能工作。

在python中读写操作资源,最后需要释放资源。可以使用try…finally结构实现资源的正确释放,python提供了一个with语句能更简便的实现释放资源。

1. python像文件的操作open等已经可以直接使用with语句

2. 可以自定义一个支持with语句对象

3. 使用contextlib也可以使用with语句对象

4. 针对需要close操作的对象with的使用

示例代码中有4种使用标注

# 自定义支持with语句的对象
class DummyRes:
  def __init__(self, tag):
    self.tag = tag
  def __enter__(self):
    print("Enter >>> {}".format(self.tag))
    return self
  def __exit__(self, exc_type, exc_value, exc_tb):
    print("Exit <<< {}".format(self.tag))
    if exc_tb is None:
      print("Exit without Exception {}".format(self.tag))
      return False
    else:
      print("Exit with Exception {}".format(self.tag))
      return True
# 支持closing 上下文with语句对象
class Closing:
  def __init__(self, thing):
    self.thing = thing
  def __enter__(self):
    return self
  def __exit__(self, exc_type, exc_value, exc_tb):
    self.thing.close()
class ClosingDemo:
  def __init__(self):
    self.acquire()
  def acquire(self):
    print("Acquire RES")
  def close(self):
    print("Close RES")
from contextlib import contextmanager
class ContextDemo:
  def __init__(self):
    print("Context Demo init")
    raise Exception
    print("Context Demo init")
  def print(self):
    print("Context Demo print 1")
    #raise Exception
    print("Context Demo print 2")
  def close(self):
    print("Context Demo close")
def context_demo():
  print("context demo in")
  raise Exception
  print("context demo out")
@contextmanager
def demo():
  print("Allocate Resoures")
  try:
    yield context_demo
  finally:
    print("raise exception")
  #yield "*** contextmanager demo ***"
  print("Free Resoures")
if __name__ == "__main__":
  # 1. 使用with语句 (自动关闭文件)
  with open("test.txt", "w") as f:
    f.write("write test")
  # 2. 自动定义with语句
  with DummyRes("test") as res:
    print("With body 1")
    raise Exception
    print("With body 2")
  # 3. 利用contextlib定义with语句
  with demo():
    print("exc demo")
  # 4. closing 上下文 (适合有close操作的情况)
  with Closing(ClosingDemo()):
    print("Use Resoures")

总结

以上所述是小编给大家介绍的python with语句简介,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python3遍历目录树实现方法
May 22 Python
python选择排序算法实例总结
Jul 01 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Python设计模式之命令模式简单示例
Jan 10 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python @property装饰器原理解析
Jan 22 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
python实战之用emoji表情生成文字
May 08 Python
python实现微信自动回复功能
Apr 11 #Python
Python实现检测文件MD5值的方法示例
Apr 11 #Python
python 输出上个月的月末日期实例
Apr 11 #Python
Python简单计算文件MD5值的方法示例
Apr 11 #Python
pandas 获取季度,月度,年度首尾日期的方法
Apr 11 #Python
python+pandas生成指定日期和重采样的方法
Apr 11 #Python
python dataframe astype 字段类型转换方法
Apr 11 #Python
You might like
合格的PHP程序员必备技能
2015/11/13 PHP
如何打开php的gd2库
2017/02/09 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
Python while 循环使用的简单实例
2016/06/08 Python
Python 画出来六维图
2019/07/26 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Django如何批量创建Model
2020/09/01 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
员工考核管理制度
2014/02/02 职场文书
会计岗位描述
2014/02/22 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
财务部绩效考核方案
2014/05/04 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js