Python上下文管理器 with
对于系统资源的操作,如:文件操作、数据库操作等,我们往往打开文件、连接数据库后忘了将其close掉,这时就可能会引发异常,因此我们常用的做法是:
# coding:utf-8
f = open("a.txt", "w+")
try:
f.write("python")
except IOError:
print("IO ERR")
finally:
f.close()
这段代码的确能解决实际问题,但是看起来有些繁琐冗余,因此Python引入了内置的with模块来简单优雅地解决此类问题。
with open("a.txt", "w+") as f:
f.write("with python")
当执行到with代码块外的时候,系统会自动调用__exit__()方法,with替代了上述代码中的try-finally的功能,其原理是用到了上下文管理器。
所谓的上下文管理器就是实现了 __enter__() 和 __exit__() 方法的对象:
class ContextWith(object):
def __enter__(self):
print("执行__enter__方法") def __exit__(self, exc_type, exc_val, exc_tb):
print("执行__exit__方法") def get_context():
return ContextWith() with get_context() as f:
print("执行with模块内") result:
执行__enter__方法
执行with模块内
执行__exit__方法
上面代码可以看出在执行with时会先调用__enter__方法,然后执行with模块内的,最后退出with模块时会调用__exit__方法,对于上下文管理器,
Python中主要是contextlib模块,它是通过Generator实现的:

contextlib模块主要有:
- ContextDecorator:这是个基类,用于定义基于类的上下文管理器,同时也可以用@ContextDecorator作用于函数上。
- contextmanager:运行上下文的对象,控制着运行上下文的功能,上下文管理器通常由 with 语句触发,也可以直接通过调用contextmanager方法来使用。
- closing:创建上下文管理器,在执行过程离开with语句体时自动执行object.close(),一旦代码块运行完毕,它就会将事件关闭。
- suppress:可以禁止任意数目的异常,如调用 suppress(FileNotFoundError)时,当文件不存在时不会抛出异常。
- ExitStack:维护一个寄存器的栈,当退出with语句时,文件就会关闭,栈会按照相反的顺序调用这些上下文管理器。
Python的with上下文管理器类似于go语言的defer,可以起到简化finally,方便处理异常的作用。
Python上下文管理器 with的更多相关文章
- python 上下文管理器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...
- Python 上下文管理器和else块
最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...
- Python上下文管理器
在Python中让自己创建的函数.类.对象支持with语句,就实现了上线文管理协议.我们经常使用with open(file, "a+") as f:这样的语句,无需手动调用f.c ...
- python上下文管理器ContextLib及with语句
http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能 ...
- Python上下文管理器(Context managers)
上下文管理器(Context managers) 上下文管理器允许你在有需要的时候,精确地分配和释放资源. 使用上下文管理器最广泛的案例就是with语句了.想象下你有两个需要结对执行的相关操作,然后还 ...
- python上下文管理器细读
test 1 上下文管理器,将生成器转化为上下文管理器 import contextlib @contextlib.contextmanager def a(): print(1) yield pri ...
- 吃透Python上下文管理器
什么是上下文管理器? 我们常见的with open操作文件,就是一个上下文管理器.如: with open(file, 'rb') as f: text = f.read() 那上下文管理器具体的定义 ...
- python 上下文管理器contextlib.ContextManager
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
- Python 上下文管理器模块--contextlib
在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib ...
随机推荐
- Hystrix浅谈
Hystrix如何使用很多说明,看了很多博客,却发现能说明一些简单概念的文章就没有. 所以本文不太回去说如何使用 Hystrix ,但是会简明的说一下 一些概念 super(Setter.withGr ...
- Java位运算符浅析
在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率. 位运算符,这个”位”代表这什么? 位:二进制位简称“位”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0 ...
- Confluence 6 从其他备份中恢复数据
一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复. 如果你在恢复压缩的 XML 备份的时候遇 ...
- ncnn编译安装
1.git clone https://github.com/Tencent/ncnn 2.按照wiki说明来编译,根据需要,选择不同的编译方式.在ncnn/CMakeLists.txt中,可选择编译 ...
- NIO(四)
使用非直接缓冲区和直接缓冲区复制同一个文件,看一下时间差别 1.创建非直接缓冲区测试类 package com.cppdy.nio; import java.io.FileInputStream; i ...
- eclipse java ee ide 配置
配置WEB服务器 windows->preferences->server->Runtime-Environments->Add->选择对应版本->选择安装路径-& ...
- java 命令行JDBC连接Mysql
环境:Windows10 + java8 + mysql 8.0.15 + mysql-connector-java-8.0.15.jar mysql驱动程序目录 项目目录 代码: //package ...
- C++ GetComputerName()
关于函数“GetComputerName()”,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85 ...
- C++ Primer 笔记——转发
某些函数需要将其一个或多个实参连同类型不变的转发给其他函数,这种情况下我们需要保持被转发实参的所有性质,包括实参类型是否是const的以及实参是左值还是右值. template <typenam ...
- BZOJ 2818 Gcd(欧拉函数+质数筛选)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 9108 Solved: 4066 [Submit][Status][Discu ...