深入浅析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 相关文章推荐
python实现逆序输出一个数字的示例讲解
Jun 25 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
由面试题加深对Django的认识理解
Jul 19 Python
详解python中的index函数用法
Aug 06 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
TensorFlow tensor的拼接实例
Jan 19 Python
如何基于python实现归一化处理
Jan 20 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 Python
python 安全地删除列表元素的方法
Mar 16 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实现智能文件类型检测的实现代码
2011/08/02 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
js实现拖拽效果
2015/02/12 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
JS中的BOM应用
2018/02/02 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
python定时器使用示例分享
2014/02/16 Python
Python 列表(List)操作方法详解
2014/03/11 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Django logging配置及使用详解
2019/07/23 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
活动志愿者自荐信
2014/01/27 职场文书
班级寄语大全
2014/04/10 职场文书
安全环保演讲稿
2014/08/28 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
四年级小学生评语
2014/12/26 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python