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的模块或者源文件直接可以复制到目标项目目录中,就可以导入使用了. 但是为了 ...
随机推荐
- centos 7.1系统更改Mariadb数据存储位置步骤分享
一.首先确保你要更改Mariadb数据存储的位置的空间够大 现在已将Mariadb存储位置更改到/opt/目录下 1.然后将Mariadb服务stop:systemctl stop mariadb 2 ...
- Linux硬链接和软连接详解
硬链接: 硬链接是通过索引节点inode来进行链接的(关于inode,http://www.cnblogs.com/ZGreMount/p/7653307.html).在Linux(ext2,ext3 ...
- 干了这杯Java之Vector
Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vec ...
- leetcode 697. Degree of an Array
题目: Given a non-empty array of non-negative integers nums, the degree of this array is defined as th ...
- win10 uwp 列表模板选择器
本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...
- 博客发在win10.me
看到了http://www.win10.me/?page_id=58 说可以把自己的文章投给win10.me 我试试 抱着没有的心态 居然可以 我联系九幽,和他们说我写了很多博客,质量不好,他们说好 ...
- UWP应用程序使用Prism框架构建MVVM
在我们创建的UWP解决方案中选择引用->管理NuGet包程序包 NuGet管理包 2. 搜索Prism.Core,并安装 搜索Prism.Core 3. 搜索Prism.Unity,并安装 搜索 ...
- hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)
SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是 ...
- Hadoop(十四)MapReduce原理分析
前言 上一篇我们分析了一个MapReduce在执行中的一些细节问题,这一篇分享的是MapReduce并行处理的基本过程和原理. Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于had ...
- Mysql存在则更新,没有则新增
insert ignore 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回. insert ignore into table(col1,col2) values ('val1 ...