今天做多GPU处理手写数字识别的时候对with方法记得不是很清楚了
平常用的时候仅仅知道with相当于try…expect 抛出异常的作用
对于with来说,其底层的实现原理记忆的并不是很清晰
于是我自己做了一个小代码进行测试,以下就是我定义的代码
########################################################################
class A:
#----------------------------------------------------------------------
def __init__(self):
self.a = 0
#----------------------------------------------------------------------
def __enter__(self):
print("in enter")
#----------------------------------------------------------------------
def __exit__(self, exc_type, exc_val, exc_tb):
print("3 is not div 0")
print("in exit")
if __name__ == "__main__":
a = A()
with a :
print("I'm here")
print(3/0)
print("helel")
不难发现,在执行with中的程序的时候会出现除0报错的问题
但是with的整个流程是什么样的呢?
我们看看运行的结果:
首先当程序运行到with的时候
会进入def __enter__(self):
的方法中
其次会运行with方法中的程序,比如上面的I'm here
但是当运行到 3/0的时候,会发现出现异常了
会直接进入到__exit__
的方法中,打印exit中的内容
最后抛出异常
我们再次假设,如果with中没有异常,还会执行__exit__
的方法么? 答案:是的
我们稍微更改一下代码
class A:
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.a = 0
#----------------------------------------------------------------------
def __enter__(self):
print("in enter")
#----------------------------------------------------------------------
def __exit__(self, exc_type, exc_val, exc_tb):
print("3 is not div 0")
print("in exit")
if __name__ == "__main__":
a = A()
with a :
print("I'm here")
print("3/0")
print("helel")
我们将3/0的代码变成了字符串,这样就不会报错了
打印的结果如下所示:
in enter
I'm here
3/0
3 is not div 0
in exit
helel
通过打印的结果,我们可以得出一个结论就是:
with在执行的过程中,在with中的代码,不论是否报错都将会执行__enter__
和__exit__
函数
但是,当执行到问题程序的时候,会直接进入到__exit__
函数中退出。
猜想基于以上的问题,我们似乎可以把with方法看做是一个线程锁。