python with语句

1.with语句使用场景
当异常发生时,往往需要做一些额外操作,如关闭数据库连接,关闭文件句柄等。
一般使用try/catch/finally来完成这些操作,如:
读文件时,可能出现两种异常,打开文件异常,读文件内容异常:

try:
    file=open("fuwuqi.txt")
    data=file.read()
except:
    pass
finally:
    file.close()

with语句写法如下,它可以自动处理上下文环境产生的异常:

with open("fuwuqi.txt") as file:
    data=file.read()

2.with语句工作原理
with后面紧跟的对象obj,必须要有__enter__,__exit__两个方法
with语句会首先调用obj对象的__enter__方法,并将返回值,传给as后面的变量
with里面代码块执行完毕后,将调用obj对象的__exit__方法。
使用示例:

class Sample():
    def __enter__(self):
        return "foo"
    def __exit(self,type,value,trace):
        print "exit"
with Sample() as enter_result:
    print "enter_result:",enter_result

运行结果:

3.with语句处理异常
需要在对象obj中的__exit__方法定义处理异常

class Sample():
    def __enter__(self):
        return self
    def __exit__(self,type,value,trace):
        print "exit"
        print 'type',type
        print 'value',value
        print 'trace',trace
    def div(self,a,b):
        return a/b        
with Sample() as obj:
    obj.div(1,0)

运行结果:

class Sample():
    def __enter__(self):
        return self
    def __exit__(self,type,value,trace):
        print "exit"
        print 'type',type
        print 'value',value
        print 'trace',trace
    def div(self,a,b):
        return a/b        
with Sample() as obj:
    obj.div(1,2)

4.with语句的作用
代码更简洁,异常处理工作可以由对象obj的__exit__方法来完成,
如File对象的__exit__方法,已支持关闭文件句柄,使用with语句,无需捕获异常。

原文地址:https://www.cnblogs.com/shijingjing07/p/7256276.html