from __future__ import with_statement

# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#with和contextlib

#对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如:

"""

关闭一个文件,

释放一个锁

创建一个临时代码补丁

在特殊环境中运行受保护代码

-----------

with语句覆盖了这些场景,为在一个代码块前后调用 一些代码提供了一种简单方法,如:

f=file('files.txt','r')

try:

for line in f:

if line .startswith('#'):

continue

print line

finally:

f.close()

from __future__ import with_statement#在2.5之前需要

with f('f.py') as s:

for i in s:

if i.startswith('#'):

continue

print i

它的相关描述在www.python.org /dev/peps/pep-0343中可以找到

与这个语句兼容的其他来自thread和threadubg模块类

thread as s

threading as s1

s.LockType

s1.Lock

s1.RLock

s1.Condition

s1.Semaphore

s1.BoundedSemaphore

"""

#这些类实现2个:__enter__和__exit__,都来自于with协议,例如:

class Context(object):

def __enter__(self):

print '__eenter__'

def __exit__(self, exc_type, exc_val, exc_tb):

print '__exit__(*)'

if exc_type is None:

print 'with no error'

else:

print 'with an error(%s)'%(exc_val)

with Context():

print '__enter__'

with Context():

print '__exit__(*)'

raise  TypeError('i am the bug')

"""

__exit__将获取代码块中发生错误时填入3个参数,如果未出现错误,那么这3个参数都被设置这None,当发生一个错误时,__exit__不应该重新抛出这个错误,因为这是调用者责任

,但是它可以通过返回True来避免这个异常,这个用来实现一些特殊使用场景,但对于大部场景使得而言,这个方法正确行为执行与finally类似清理工作,

不管代码块中发生什么,都不返回任何东西

"""

#contextlib模块

#为了给with语句的提供一些辅助类,标准库添加 了一个模块,名为contextmanager这个一个装饰器,增加包含以yield语句分开的__nter__和__exit__两部分生成器

from contextlib import contextmanager

@contextmanager

def conter():

print u'conter()之装饰器'

try:

yield

except Exception,s:

print 'with an error%s'%s

#在此需要重新抛出错误

raise  s

else:

print ' with no error'

"""

如果发生任何异常,该函数需要重新抛出这个异常,以便传递它,注意:contxt在需要时可以有一些参数,只要它们在调用中提供这些参数即可,这个小的

辅助类简化了常规基于类的上下文API,正如生成器使用基于类的迭代器API所做一样

这个模块提供了另外辅助类

closing(element)是由contextmanager装饰函数,它将输入一个元素,然后在退出时调用该元素close方法

nested(c1,c2,...)这是一个合并上下文并使用它们创建嵌套with调用函数.

"""

#上下文实例

import  logging

@contextmanager

def logged(k1,l):

#记录器

def _log(f):

def __log(*a,**k):

l(f,a,k)

return f(*a,**k)

return __log

#装饰该类

for attribute in dir(k1):

if attribute.startswith('_'):

continue

elem=getattr(k1,attribute)

setattr(k1,'__logged_%s'%(attribute,elem))

setattr(k1,attribute,_log(elem))

#正常工作

yield k1

#移除日志

for attribute in dir(k1):

if not attribute.startswith('__logged_'):

continue

elem=getattr(k1,attribute)

setattr(k1,attribute[len('__logged_'):],elem)

delattr(k1,attribute)

"""

记录器函数之后可以被用于记录指定上下文中调用API,下一个例子中,调用被添加到一个列表中以跟踪API使用,然后用于执行一些断言

"""

class One(object):

def _private(self):

pass

def one(self,a):

self.two()

a.thing(self)

self._private()

def two(self):

pass

class Two(object):

def thing(self,b):

b.two()

cal=[]

def called(m,a,k):

cal.append(m.in_func.func_name)

with logged(One,cal):

one=One()

two=Two()

one.one(two)

print cal

最新文章

  1. tomcat7 ajax请求服务中文乱码
  2. 自定义UITabBar的两种方式
  3. asp.net GDI+绘制折线
  4. Xcode 6以上版本如何创建一个空的工程(Empty Application)
  5. 用腻了bootstrap的可以试试semantic-ui
  6. GCC 编译使用动态链接库和静态链接库
  7. VS在Release模式下,难道还可以Debug?
  8. 将MFC Grid control封装为DLL的做法及其在DLL中的使用方法
  9. java-枚举一些字典信息的例子
  10. nginx stream 日志设置(Version 1.9.0 +)
  11. 企业类Web原型制作分享-Kraftwerk
  12. P2782 友好城市
  13. 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能
  14. windows环境安装docker,并下载lamp镜像
  15. 帝国CMS给会员注册加入问答验证
  16. Retrofit:类型安全的REST客户端for 安卓&Java
  17. python3 安装win32clipboard 和 win32con 报No matching distribution found for win32con错误
  18. Linux下的Backlight子系统(二)【转】
  19. DM36x IPNC OSD显示中文 --- 基本数据准备篇
  20. C语言中的“>>”和“<<”

热门文章

  1. vue-cli 脚手架总结
  2. Linux备份
  3. Wince修改系统时间问题
  4. javascript正則表達式 "\b"问题
  5. Hadoop动态加入/删除节点(datanode和tacktracker)
  6. correlated subquery and non-correlated subquery
  7. oracle数据库常用查询一
  8. 《第一行代码》学习笔记17-碎片Fragment(2)
  9. 工欲善其事必先利其器---SQL在线可视化模型设计,(还可学习拖拽知识)
  10. 一行代码设置UITableView分割线的长度