python with 详解

2020-03-03  本文已影响0人  如果仲有听日

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')

    

上一篇下一篇

猜你喜欢

热点阅读