上下文管理

1. try...except...finally
import traceback
def exe_try():
try:
print("code start")
raise ImportError
return 1

except KeyError as e:
print("keyerror")
print(e)
return 2
except :
print("error")
print(traceback.format_exc())
return 3
finally:
print("over")
return 4

print(exe_try())


可以持续使用except 去捕获异常。finally:表示必须要去执行的地方,注意,当return放在try ... except。。。finally中的时候,程序肯定会取finally中的return的值,而且程序不管怎么样,都会去执行finally的程序。

2. 上下文管理器---with

__enter__ __exit__


# 上下文管理器协议
class Sample:
def __enter__(self):
print('enter')
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print('exit')

def dosomething(self):
print('do something')

with Sample() as sample:
print(sample)


符合上下文管理协议,均可以使用with进行操作。
处理流程:Sample()实例化的过程中,执行的是__enter__里面的语句,获取的值是__enter__的返回值,即可以理解为sample=self,在执行完with里面的语句的时候,执行的是__exit__里面的语句(不管里面是否有报错,都会去执行__exit__的语句),所以可以自我去实现很多上下文管理器,例如数据库的连接,django中事务的手动回滚等等一些需要关闭的操作


3, contextlib简化上下文管理器---使用装饰器将生成器包装成上下文管理器


import contextlib

@contextlib.contextmanager# 使用装饰器将函数变成一个上下文管理器
def file_open(file_name): #这个函数必须是一个生成器
print('file open')# enter里面的逻辑
yield {1:2}
print('file end')#exit之后的逻辑

with file_open('111.txt') as fh:
print('file process')

原文地址:https://www.cnblogs.com/wenshu/p/12267098.html