Python之上下文管理
http://www.cnblogs.com/coser/archive/2013/01/28/2880328.html
上下文管理协议为代码块提供包含初始化和清理操作的上下文环境。即便代码块发生异常,清理操作也会被执行。
Context对象
*__enter__:初始化环境,返回上下文对象
*__exit__:执行清理操作。返回True时,将阻止异常向外传递
#!/usr/bin/env python26
#-*- coding:utf-8 -*- class MyContext(object):
def __init__(self,*args):
self._data = args
def __enter__(self):
print "__enter__"
return self._data #不一定要返回上下文对象自身 def __exit__(self,exc_type,exc_value,traceback):
if exc_type:
print "Exception:",exc_value
print "__exit__" return True#阻止异常向外传递
with MyContext(1,2,3) as data: #将__enter__返回的对象赋给data
print data
print '*'*30 with MyContext(1,2,3): #发生异常,显示并拦截
raise Exception("data error!") 输出:
__enter__
(1, 2, 3)
__exit__
******************************
__enter__
Exception: data error!
__exit__
上面的模式,需要重写__enter__和__exit__,比较麻烦。contextlib可以解决这个问题。
contextlib
标准库contextlib提供一个contextmanager装饰器,用来简化上下文类型开发。
#!/usr/bin/env python26
#-*- coding: utf-8 -*- from contextlib import contextmanager @contextmanager
def closing(o):
print "__enter__"
yield o print "__exit__"
o.close() with closing(open("readme.txt","r")) as f:
print f.readline(),
contextmanger替我们创建Context对象,并利用yield切换执行过程。
*通过__enter__调用closing函数,将yield结果作为__enter__返回值
*yield让出closing执行权限,转而执行with代码块
*执行完毕,__exit__发生消息,通知yield恢复执行closing后续代码
contextmanger让我们少写很多代码,因为不是自己写__exit__,所以得额外处理异常。
上下文管理协议的用途很广,比如:
1、Synchronized:为代码块提供lock/unlock线程同步;
2、DBContext:为代码块中的逻辑提供共享的数据库连接,并负责关闭连接。
此处先记着,待等到实际应用的时候再更新相关的理解。
具体的例子
1、计算函数的执行时间:
import time
class Context(object):
def __init__(self):
self.start = None
self.end = None
def __enter__(self):
self.start = time.time()
print "Start"
return self
def __exit__(self, exctype, excvalue, traceback):
print "exit"
self.end = time.time()
print "End:"
print 'Cost:%d' % (self.end - self.start)
return self
def test():
return Context()
with test():
print 'int test'
time.sleep(2)
输出结果:
Start
int test
exit
End:
Cost:2
2、使用装饰器的方式
#在装饰器内部使用with语法
def with_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
with Context():
return func(*args, **kwargs)
return wrapper @with_decorator
def test_decorator():
Python之上下文管理的更多相关文章
- Python之上下文管理器
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之上下文管理器 #http://python.jobbole.com/82620/ #语法形式: ...
- python之上下文管理、redis的发布订阅、rabbitmq
使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...
- python基础之上下文管理器
前言 关于计算器运行的上下文的概念,我的理解也不是很深:按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行.下面谈谈pyth ...
- Flask之上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- flask之上下文管理
简单来说,falsk上下文管理可以分为三个阶段: 1.请求进来时,将请求鞋底的相关数据放入上下文管理中进行管理 2.在视图函数中,要去上下文管理中取值 3.请求响应之后,要将上下文管理中的数据清除 详 ...
- .Net组件程序设计之上下文
.Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...
- flask源码解析之上下文为什么用栈
楔子 我在之前的文章<flask源码解析之上下文>中对flask上下文流程进行了详细的说明,但是在学习的过程中我一直在思考flask上下文中为什么要使用栈完成对请求上下文和应用上下文的入栈 ...
- python 黑魔法 ---上下文管理器(contextor)
所谓上下文 计算机上下文(Context)对于我而言,一直是一个很抽象的名词.就像形而上一样,经常听见有人说,但是无法和现实认知世界相结合. 最直观的上下文,莫过于小学的语文课,经常会问联系上下文,推 ...
- Python的包管理工具
Python的包管理工具 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么使用包管理 Python的模块或者源文件直接可以复制到目标项目目录中,就可以导入使用了. 但是为了 ...
随机推荐
- HDU1257 最少拦截系统 (贪心+STL+二分)
第一次在博客园写博客,好紧张 .博客搬家居然很多代码成了乱码,欲哭无泪,妈咪. 开学东西太多了吧,没时间写备注,有点时候只能贴个代码,以后有时间再加备注吧,只贴代码不是好习惯. 咦,贪心怎么写,我只会 ...
- TableView的性能优化
现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好 ...
- 简易js模板引擎
前面 js 模板引擎有很多很多,我以前经常用 art-template ,有时候也会拿 vue 来当模板引擎用. 直到...... 年初的时候,我还在上个项目组,那时候代码规范是未经允许不能使用 [外 ...
- js实现微信朋友圈模糊图片功能
本人第一次写文章 ,写的不好大家就凑合着看吧. 界面的简单效果. 主要html如下 <div id="content"> <!--模糊图片--> <i ...
- 【装逼利器效率软件】一张图问你想不想用Launchy
简述:Launchy博客园很多文章,长篇大论文字太多. 一张图问你想不想用? 长话多说: 一.设置Launchy扫描目录,安装后会默认,个人推荐自定义目录比较好 二.自行建立快捷方式别名文件夹,存放各 ...
- win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置
写在前面的话: 再弄这个之前,我对python也好,tensorflow也好几乎是0认知的,所以配置这个环境的时候,走了不少弯路,整整耗费了一个星期的时间才搭配完整这个环境,简直了...然而最气的是, ...
- Linux下PHP连接MS SQLServer的办法
Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般 ...
- 快速排序算法分析--C++版
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试喜欢考这个. 快速排序是C.R.A.Hoar ...
- 【转】话说C语言const用法
原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...
- Java Condition
在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现, ...