Python - with语句 - 写一个支持with方法调用的类

Python - with语句 - 写一个支持with方法调用的类

前言

使用语句with open('a.txt', 'r') as f:可以自动关闭文件句柄,使用语句with torcu.no_grad()可以不计算梯度。

我学Py的时候咋好像没学过openno_grad是怎么实现的?

于是今日了解了一下。

实现一个my_with,计算语句执行用时

其实不难,写一个类,写两个函数__enter__(with代码块被调用之前执行)、__exit__(结束时候执行)。然后就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time


class time_counter:
def __enter__(self):
self.start = time.time()

def __exit__(self, exc_type, exc_value, traceback):
self.end = time.time()
print(f"time consume: {self.end - self.start}s")


with time_counter():
for i in range(int(1e7)):
i += 1

运行结果:

1
time consume: 0.7823185920715332s

那“as”语句呢?

只需要给__enter__函数加个返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import time


class time_counter:
def __enter__(self) -> int:
self.start = time.time()
return 1

def __exit__(self, exc_type, exc_value, traceback):
self.end = time.time()
print(f"time consume: {self.end - self.start}s")


with time_counter() as a:
print(a)
for i in range(int(1e7)):
i += 1

运行结果:

1
2
1
time consume: 0.7726781368255615s

关于__exit__函数的三个参数:

  • exc_type:异常的类型,如果with块中没有异常发生,则为None
  • exc_value:异常的值,即Exception的实例,如果没有异常发生,则为None
  • traceback:一个traceback对象,它封装了异常的调用栈信息,如果没有异常发生,则为None

End

官方文档:https://docs.python.org/3/reference/compound_stmts.html#with

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/138576722


Python - with语句 - 写一个支持with方法调用的类
https://blog.letmefly.xyz/2024/05/08/Other-Python-WithStatement-write1classSupportingWith/
作者
Tisfy
发布于
2024年5月8日
许可协议