python with 详解

1. 先看一个例子

with open('./test.txt', 'wb') as f:

    f.write('aaaaaaaaaaaa')

上例等价于下面的代码:

f = open('./test.txt', 'wb')

try:

    f.write('aaaaaaaaaaaa')

except Exception:

    pass

finally:

    f.close

可见, 当使用with时,with open('./test.txt', 'wb') as f:

就是将open出来的文件描述符as为f,之后再对f进行写数据,写完数据后with这个上下文管理器会将f进行close, 并且能够捕获异常

因此with是一个上下文管理器


2. with上下文管理器原理

我们通过自定义一个类来理解with的原理。

class ContextManager(object):

    def __enter__(self): #进入with语句时调用

        print("__enter__ called")


    def __exit__(self, exc_type, exc_val, exc_tb): #离开with语句时调用

        print('__exit__ called')

        print('exc_type: %s' % exc_type) #异常类型

        print('exc_val: %s' % exc_val)        #异常值

        print('exc_tb: %s' % exc_tb)            #异常追踪信息


#debug1

with ContextManager() as cm:

    print('hello python')


#debug 2

with ContextManager() as cm:

    a = 1 / 0

    print('hello python')

    

你可能感兴趣的:(python with 详解)