for item in my_list:
if item.flavor == 'banana':
break
else:
raise ValueError('No banana flavor found!')
try:
dangerous_call()
after_call()
except OSError:
log('OSError...')
try:
dangerous_call()
except OSError:
log('OSError...')
else:
after_call()
>>> with open('mirror.py') as fp: # fp绑定到打开的文件上,因为文件的__enter__方法返回self
... src = fp.read(60) # 从fp中读取一些数据
...
>>> len(src)
>>> fp # fp变量依然可以使用
<_io.TextIOWrapper name='mirror.py' mode='r' encoding='UTF-8'>
>>> fp.closed, fp.encoding # 可以读取fp对象的属性
(True, 'UTF-8')
>>> fp.read(60) # 但是不能在fp上执行I/O操作,因为在with块的结尾,调用了TextIOWrappper.__exit__方法把文件关闭了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
>>> from mirror import LookingGlass
>>> with LookingGlass() as what: # 上下文管理器是LookingGlass类的实例;Python在上下文管理器上调用__enter__方法,把返回结果绑定在what上
... print('Alice, Kitty and Snowdrop') # 打印一个字符串,然后打印what变量的值
... print(what)
...
pordwonS dna yttiK ,ecilA # 打印出的内容是反向的
YKCOWREBBAJ
>>> what # 现在,with块已经执行完毕,可以看出,__enter__方法返回的值,即存储在what变量中的值是字符串'JABBERWOCKY'
'JABBERWOCKY'
>>> print('Back to normal.') # 输出不在是反向的了
Back to normal.
class LookingGlass:
def __enter__(self): # 除了 self 之外,Python调用__enter__方法时不窜入其他参数
import sys
self.original_write = sys.stdout.write # 把原来的 sys.stdout.write 方法保存在一个实例属性中,供后面使用
sys.stdout.write = self.reverse_write # 为 sys.stdout.write 打猴子补丁,替换成自己编写的方法
return 'JABBERWOCKY' # 返回 'JABBERWOCKY' 字符串,这样才有内容存入目标变量 what
def reverse_write(self, text): # 这是用于取代 sys.stdout.write 的方法,把 text 参数的内容反转,然后调用原来的方法实现
return self.original_write(text[::-1])
def __exit__(self, exc_type, exc_val, traceback): # 如果一切正常,Python会调用__exit__方法传入的参数是三个None,如果抛出异常,则三个参数是异常的数据
import sys
sys.stdout.write = self.original_write # 还原成原来的sys.studout.write方法
if exc_type is ZeroDivisionError: # 如果有异常,而且是 ZeroDivisionError 类型,打印一个消息
print('Please DO NOT divide by zero!')
return True # 然后返回 True,告诉解释器,异常已经处理
>>> from mirror import LookingGlass >>> manager = LookingGlass() # 实例化并审查manager实例,等同于 with LookingGlass() as manager >>> manager <mirror.LookingGlass object at 0x2a578ac> >>> monster = manager.__enter__() # 在上下文管理器中调用__enter__()方法,把结果存储在monster中 >>> monster == 'JABBERWOCKY' # monster的值是字符串'JABBERWOCKY',打印出来的True标识符是反向,因为用了猴子补丁 eurT >>> monster 'YKCOWREBBAJ' >>> manager >ca875a2x0 ta tcejbo ssalGgnikooL.rorrim< >>> manager.__exit__(None, None, None) # 调用manager.__exit__,还原成之前的stdout.write >>> monster 'JABBERWOCKY'
import contextlib
@contextlib.contextmanager # 应用 contextmanager 装饰器
def looking_glass():
import sys
original_write = sys.stdout.write # 贮存原来的 sys.stdout.write 方法
def reverse_write(text): # 定义自定义的 reverse_write 函数;在闭包中可以访问 original_write
original_write(text[::-1])
sys.stdout.write = reverse_write # 把 sys.stdout.write 替换成 reverse_write
yield 'JABBERWOCKY' # 产出一个值,这个值会绑定到 with 语句中 as 子句的目标变量上
sys.stdout.write = original_write # 控制权一旦跳出 with 块,继续执行 yield 语句之后的代码;这里是恢复成原来的 sys. stdout.write 方法
with looking_glass() as what: # 直接通过上下文管理器实现with的功能
print('Alice, Kitty and Snowdrop')
print(what)
print(what)
pordwonS dna yttiK ,ecilA YKCOWREBBAJ JABBERWOCKY
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 msg = '' #创建一个变量,用于保存可能出现的错误消息; try: yield 'JABBERWOCKY' except ZeroDivisionError: #处理 ZeroDivisionError 异常,设置一个错误消息 msg = 'Please DO NOT divide by zero!' finally: sys.stdout.write = original_write # 撤销对 sys.stdout.write 方法所做的猴子补丁 if msg: print(msg) # 如果设置了错误消息,把它打印出来
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有