python中context可以用于一些需要自动管理逻辑的场景,比如读取文件内容后需要自动关闭文件,对代码块进行自动上锁和解锁等,下面我们就简单介绍下context的使用。
一、context使用语法
context 与 with 一块使用,也可以附加一个 as 语句,如下:
with expression [ as variable ]
code block
二、context 工作原理
- 执行 expression 表达式并返回一个 context 对象;
- 执行 context 对象的 __enter__ 方法;
- 如果有带 as 语句,则 variable 被赋于 __enter__ 方法返回值;
- 执行 code block 代码;
- 执行 context 对象的 __exit__ 方法;
__exit__ 方法有3个参数exc_type, exc_value, exc_tb,无论 code block 中的代码在执行中是否有异常都会执行 __exit__ 方法。
如果 code block 中的代码有抛异常,__exit__ 方法的3个参数值与 sys.exc_info 返回值一样(分别代表异常类型、异常值、堆栈信息),此时如果方法返回 False 则异常会继续往上抛,否则代码继续往下执行。如果 code block 中的代码没有抛异常则3个参数为None。
三、context 实战
open 函数的返回值已经是一个context了,假设 “a.txt” 文件已经存在且当前用户有读权限,则以下示例在 with 代码块执行完后会自动关闭文件:
with open("a.txt") as file:
for line in file:
print(line, end="")
如果我们要自己实现这个 context 该怎么实现呢?其实很简单,只需要按照上面的描述定义一个类就行,如下:
class DemoOpen:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename)
return self.file
def __exit__(self, exc_type, exc_value, exc_tb):
self.file.close()
with DemoOpen("a.txt") as file:
for line in file:
print(line, end="")
是不是很简单,你学会了吗?如果有任何疑问,欢迎评论交流。
本文暂时没有评论,来添加一个吧(●'◡'●)