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之上下文管理的更多相关文章

  1. Python之上下文管理器

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之上下文管理器 #http://python.jobbole.com/82620/ #语法形式: ...

  2. python之上下文管理、redis的发布订阅、rabbitmq

    使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...

  3. python基础之上下文管理器

    前言 关于计算器运行的上下文的概念,我的理解也不是很深:按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行.下面谈谈pyth ...

  4. Flask之上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

  5. flask之上下文管理

    简单来说,falsk上下文管理可以分为三个阶段: 1.请求进来时,将请求鞋底的相关数据放入上下文管理中进行管理 2.在视图函数中,要去上下文管理中取值 3.请求响应之后,要将上下文管理中的数据清除 详 ...

  6. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  7. flask源码解析之上下文为什么用栈

    楔子 我在之前的文章<flask源码解析之上下文>中对flask上下文流程进行了详细的说明,但是在学习的过程中我一直在思考flask上下文中为什么要使用栈完成对请求上下文和应用上下文的入栈 ...

  8. python 黑魔法 ---上下文管理器(contextor)

    所谓上下文 计算机上下文(Context)对于我而言,一直是一个很抽象的名词.就像形而上一样,经常听见有人说,但是无法和现实认知世界相结合. 最直观的上下文,莫过于小学的语文课,经常会问联系上下文,推 ...

  9. Python的包管理工具

    Python的包管理工具 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么使用包管理 Python的模块或者源文件直接可以复制到目标项目目录中,就可以导入使用了. 但是为了 ...

随机推荐

  1. Windows系统下使用Jenkins 自动发布 .NET core到Linux平台下Docker

    准备工作(安装过程可以百度,已安装的可以跳过) a)     安装Jenkins,安装包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/windows ...

  2. win10 UWP 获取系统信息

    获取系统信息 Windows.System.Profile.AnalyticsVersionInfo analyticsVersion = Windows.System.Profile.Analyti ...

  3. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

  4. SQL数据库的基础操作

    一,认识SQL数据库 美国Microsoft公司推出的一种关系型数据库系统.SQLServer是一个可扩展的.高性能的.为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有 ...

  5. 如何高效的编写Verlog HDL——菜鸟版

    工欲善其事.必先利其器!要想高效的编写verilog没有一个好的编辑器可不行,所以我这里推荐两款十分好用的编辑器Notepad++和Gvim,这两款编辑器由于其强大的添加插件的功能,所以深受代码工作者 ...

  6. Tomcat 笔记-配置域名

    编辑/etc/hosts文件,添加域名: 127.0.0.1 localhost 127.0.1.1 ubuntu # The following lines are desirable for IP ...

  7. IDEA-最简单的struts2项目 关于lib项目的默认位置

    文件结构 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...

  8. python参考手册一书笔记之第一篇上

    在python2和python3的版本差异很大输出hello world的方法在2里支持在3里就不支持了. print 'hello world' #在2中支持 print ('hello world ...

  9. 2.动手实操Apache ZooKeeper

    Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 在本节中,我们将讲解如何下载并安装Apache ZooKeeper,以便我们可以直接开始使用ZooKeeper. 本部分旨在通过提供详细的安装和使 ...

  10. Hibternate框架笔记

    Hibernate框架 配置 配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...