python笔记:with与上下文管理器

with 语句是 Pyhton 提供的一种简化语法,适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,with 语句主要是为了简化代码操作。

上下文管理器

  • 上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境。
  • 任何实现了__enter__() 和__exit__()的对象都是上下文管理器
  • 上文:正常代码执行前的操作;下文:正常代码执行后的操作,如出现异常或结束/关闭的代码
  • 上下文管理器可以用with关键字来保证文件可以关闭,是try/finally的替代方式
class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

obj = Foo()

with obj:
    print('正在执行')

实例化一个对象
进入
正在执行
退出

因为我们在定义Foo时,定义了__enter__和__exit__方法,那么我们实例化的对象obj就是一个上下文管理器

with 上下文管理器:
 语句体

当with遇到上下文管理器,就会在执行语句体之前,先执行上下文管理器的__enter__方法,一般用来处理操作前的内容,比如一些创建对象,初始化等;然后再执行语句体,执行完语句体后,最后执行__exit__方法,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等,其整体流程如下:。

  1. 调用enter 方法,进行预处理操作
    2.执行用户操作
    3.调用exit方法,完成清理操作

2.调用上下文管理器的__enter__ ()方法时;如果使用了 as 子句,则将__enter__() 方法的返回值赋值给 as 子句中的目标

with 上下文管理器 as target:
代码语句体

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')
        # return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

with Foo() as obj:
    print(obj,type(obj))
    print('正在执行')

在这里插入图片描述
把上面代码中我们注释掉的那一行代码取消注释,结果如下
在这里插入图片描述
with后面必须跟一个上下文管理器,如果使用了as,则是把上下文管理器的 enter() 方法的返回值赋值给 target,target 可以是单个变量,或者由“()”括起来的元组(不能是仅仅由“,”分隔的变量列表,必须加“()”)

with与异常处理

with语句类似以下功能
  try :
		语句体
  except:
		exit()
  finally:
  	其它

with语句会将异常的type,value和traceback传递给__exit__方法,让__exit__方法来处理异常。出现异常时,如果 exit 返回 False(默认不写返回值时,即为False),则会重新抛出异常,让with 之外的语句逻辑来处理异常,这也是通用做法;如果返回 True,则忽略异常,不再对异常进行处理,继续执行后面的代码。

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')
     # return True

obj = Foo()

with obj:
    raise ImportError
    print('正在执行')

结果如下:
在这里插入图片描述
把上面代码中我们注释掉的那一行代码取消注释,结果如下:
在这里插入图片描述

常见的一种文件读取方式:

with open("/tmp/foo.txt") as file:
data = file.read()

  1. 在执行 with 语句时,首先执行 with 后面的 open 代码
  2. 执行完代码后,会将代码的结果通过 as 保存到 f 中 【enter方法的返回值】
  3. 然后在下面实现真正要执行的操作
  4. 在操作后面,并不需要写文件的关闭操作,文件会在使用完后自动关闭 【exit方法执行】

这里使用了 with 语句,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后已经关闭了打开的文件句柄。如果使用传统的 try/finally 范式,则要使用类似如下代码:

somefile = open(r'somefileName')
try:
    for line in somefile:
        print line
        # ...more code
finally:
    somefile.close()

比较起来,使用 with 语句可以减少编码量。

其它:

with只能配合上下文管理器使用,常见的上下文管理器有

file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore

参考链接:
1.https://www.cnblogs.com/huchong/p/8268765.html

猜你喜欢

转载自blog.csdn.net/qq_44804542/article/details/115980557
今日推荐