第15章 上下文管理器和else块
#《流流畅的Python》第15章 上下文管理器和else块
#15.1 先做这个,再做那个:if语句之外的else块
#else子句不仅能在if语句中使用,还能在for、while和try语句中使用。
#for/else、while/else和try/else的语义关系紧密,不过与if/else差别很大。
#可是,在循环中,else的语义恰好相反:“运行这个循环,然后做那件事。
#在Python中,try/except不仅用于处理错误,还常用于控制流程。
#EAFP取得原谅比获得许可容易(easier to ask for forgiveness than permission)。
#15.2 上下文管理器和with块
#上下文管理器协议包含 __enter__ 和 __exit__ 两个方法。
#with语句开始运行时,会在上下文管理器对象上调用 __enter__ 方法。
#with语句运行结束后,会在上下文管理器对象上调用 __exit__ 方法,以此扮演finally子句的角色。
with open('mirror.py')as fp: #fp绑定到打开的文件上,因为文件的__enter__方法返回self。
src=fp.read(60) #从fp中读取一些数据。
print(len(src))
print(fp) #fp变量仍然可用。
print(fp.closed,fp.encoding) #可以读取fp对象的属性。
fp.read()#但是不能在fp上执行I/O操作,因为在with块的末尾,调用TextIOWrapper.__exit__方法把文件关闭了。
#示例15-2 测试LookingGlass上下文管理器类
class LookingClass:
def __enter__(self):
import sys
self.original_write=sys.stdout.write
sys.stdout.write=self.reverse_write
return 'JABBERWOCKY'
def reverse_write(self,text):
self.original_write(text[::-1])
def __exit__(self, exc_type, exc_value, exc_traceback):
# 如果一切正常Python调用__exit__方法时传入的参数是None,None, None;如果抛出了异常,这三个参数是异常数据,
import sys
sys.stdout.write=self.original_write
if exc_traceback is ZeroDivisionError:
print('Please DO NOT divide by zero')
return True
with LookingClass() as what:
print("Alice,kitty and Snowdrop") #pordwonS dna yttik,ecilA
print(what) #YKCOWREBBAJ
print(what) #JABBERWOCKY
print('Back to normal') #Back to normal
#示例15-4 在with块之外使用LookingGlass类
manager=LookingClass()
print(manager) #<__main__.LookingClass object at 0x004B5AB0>
monster=manager.__enter__()
print(monster=='JABBERWOCKY') #eurT
print(monster) #YKCOWREBBAJ
print(manager) #>0BA50400x0 ta tcejbo ssalCgnikooL.__niam__<
print(monster) #JABBERWOCKY'
#15.3 contextlib模块中的实用工具
#closing如果对象提供了close()方法,但没有实现__enter__/__exit__协议,那么可以使用这个函数构建上下文管理器。
#suppress构建临时忽略指定异常的上下文管理器。
#@contextmanager这个装饰器把简单的生成器函数变成上下文管理器,这样就不用创建类去实现管理器协议了。
#ContextDecorator这是个基类,用于定义基于类的上下文管理器。这种上下文管理器也能用于装饰函数,在受管理的上下文中运行整个函数。
#ExitStack这个上下文管理器能进入多个上下文管理器。with 块结束时,ExitStack 按照后进先出的顺序调用栈中各个上下文管理器的__exit__ 方法。
#如果事先不知道 with 块要进入多少个上下文管理器,可以使用这个类。例如,同时打开任意一个文件列表中的所有文件。
#15.4 使用@contextmanager
#在使用 @contextmanager 装饰的生成器中,yield语句的作用是把函数的定义体分成两部分:
#yield语句前面的所有代码在with块开始时(即解释器调用 __enter__ 方法时)执行,yield语句后面的代码在with 块结束时(即调用 __exit__ 方法时)执行。
import contextlib
@contextlib.contextmanager
def looking_glass():
import sys
original_write=sys.stdout.write
def reverse_write(text):
original_write(text[::-1])
sys.stdout.write=reverse_write
yield 'JABBERWOCKY'
sys.stdout.write=original_write
with looking_glass() as what:
print('Alice,kitty and Snowdrop') #pordwonS dna yttik,ecilA
print(what) #YKCOWREBBAJ
print(what) #JABBERWOCKY
#示例 15-8用于原地重写文件的上下文管理器
import csv
with inplace(csvfilename,'r',newline='') as(infh,outfh):
reader=csv.reader(infh)
writer=csv.writer(outfh)
for row in reader:
row += ['new','columns']
writer.writerow(row)
#15.5 本章小结
#除了自动关闭打开的文件之外,with语句还有很多用途。
#@contextmanager装饰器优雅且实用,把三个不同的Python特性结合到了一起:函数装饰器、生成器和with语句。
第15章 上下文管理器和else块的更多相关文章
- 流畅的python第十五章上下文管理器和else块学习记录
with 语句和上下文管理器for.while 和 try 语句的 else 子句 with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文.这么做能避免错误并减少样板代码, ...
- Python 上下文管理器和else块
最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...
- 上下文管理器和else块
一.if 语句之外的 else块 else 子句不仅能在 if 语句中使用,还能在for.while和try语句中使用. (1)for :仅当 for 循环运行完毕时(即 for 循环没有被break ...
- 『流畅的Python』第15章:上下文管理器和else块
- 【Python】【上下文管理器】
"""#[备注]#1⃣️try :仅当try块中没有异常抛出时才运行else块.#2⃣️for:仅当for循环运行完毕(即for循环没有被break语句终止)才运行els ...
- 流畅python学习笔记:第十五章:上下文管理器
在开始本章之前,我们首先来谈谈try-excep..final模块.在Python中,进行异常保护的最多就是用try..except..final.首先来看下下面的代码.进行一个简单的除法运算.为了防 ...
- python上下文管理器ContextLib及with语句
http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能 ...
- python之with语句结合上下文管理器
所谓上下文管理器即在一个类中重写了__enter__方法和__exit__方法的类就可以成为上下文管理器类. 我们可以通过with语句结合上下文管理器简化一些操作. 使用with语句结合自定义上下文管 ...
- Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码
我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...
随机推荐
- java 操作zookeeper
java 操作zookeeper(一) 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper ...
- string类的一些函数方法
1.请查看String.equals()方法的实现代码,注意学习其实现方法: (1)源程序: public class StringEquals { /** * @param args the com ...
- css3动画:执行前不显示,执行后显示
今天做一个轮播,轮播图上使用animation.需求是当滚动到当前图片时,图片中的div从无到有逐渐显示, 遇到的问题是:页面刷新时,此图片上的div可以从无到有,但第二次滚动到此图片时,总是先显示一 ...
- TZOJ 2018 SPF(连通图割点和分成的连通块)
描述 Consider the two networks shown below. Assuming that data moves around these networks only betwee ...
- static 构造函数的认识
最近,看到一道面试题,如下 class Class1 { ; static Class1() { count++; } public Class1() { count++; } } Class1 on ...
- 非线性优化(高翔slam---第六讲 )
1.线性最小二乘问题 2.非线性最小二乘问题 因为它非线性,所以df/dx有时候不好求,那么可以采用迭代法(有极值的话,那么它收敛,一步步逼近): 这样求导问题就变成了递归逼近问题,那么增量△xk如何 ...
- 直接提交一个form表单后台返回一个新页面通过target属性可以放到iframe当中
问题描述: 我想提交一个form表单后台直接返回一个新页面,但是当前页面还不想被替换掉: 解决方案: 在页面中添加一个iframe将form表单的target属性设置为iframe的id这样的话返回的 ...
- PAT 1043 输出PATest(20)(代码+思路)
1043 输出PATest(20)(20 分) 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按"PATestPATest...."这样的顺序输出 ...
- LED
LED 时间限制: 1 Sec 内存限制: 128 MB 题目描述 数字显示器题目描述:最近学校晚上文化广场的人很多哇,原因是晚上大屏幕会放电影.无聊的艾神和x73也决定一起去文化大广场看一场电影, ...
- Luogu 2051[AHOI2009]中国象棋 - DP
Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 ...