Python3中with用法

      Python中的with语句用于用上下文管理器(context manager)定义的方法包装块的执行,它允许将常见的try…except…finally使用模式封装起来以方便重用。

      在Python中,在处理非托管资源(unmanaged resources)(如文件流)时使用with关键字。它允许确保你在使用资源的代码完成运行时”清理”资源,即使抛出异常也是如此。它为try/finally块提供”语法糖”(syntactic sugar)。

      with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的”清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

      要在用户定义的对象中使用with语句,你只需在对象方法中添加__enter__()和__exit__()方法。

      with语法:

with EXPRESSION [as TARGET]:
    SUITE

      with语句执行过程如下:

      (1).评估上下文表达式以获得上下文管理器;

      (2).上下文管理器的__enter__()被加载以备后用;

      (3).上下文管理器的__exit__()被加载以备后用;

      (4).上下文管理器的__enter__()方法被调用;

      (5).如果TARGET包含在with语句中,则将__enter__()的返回值赋值给它。with语句保证如果__enter__()方法没有错误返回,那么__exit__()将始终被调用。因此,如果在赋值给TARGET列表的过程中发生错误,它将被视为SUITE中发生的错误。__enter__()方法是可以带返回值的,默认返回None。

      (6).SUITE被执行;

      (7).上下文管理器的__exit__()方法被调用。如果异常导致SUITE退出,则其类型、值和回溯(traceback)将作为参数传递给__exit__();否则,传递3个None。__exit__()方法也是可以带返回值的,这个返回值应该是一个布尔类型True或False,默认为None(即False)。如果为False,异常会被抛出,用户需要进行异常处理。如果为True,则表示忽略该异常。

      如果SUITE因异常退出,并且__exit__()方法返回的值为False,则触发异常。如果返回值为True,则异常被抑制,并继续执行with语句之后的语句。

      如果SUITE因异常以外的任何原因退出,则__exit__()的返回值将被忽略,并在所采取的退出类型的正常位置继续执行。

      以上内容主要翻译于:https://docs.python.org/3/reference/compound_stmts.html#the-with-statement

      以下为测试代码:

class FileWriter(object):
    def __init__(self, file_name):
        print("run __init__")
        self.file_name = file_name

    def __enter__(self):
        print("run __enter__")
        self.file = open(self.file_name, 'w')
        return self.file

    def __exit__(self, type, value, traceback):
        print("run __exit__")
        print("type:", type); print("value:", value); print("traceback:", traceback)
        self.file.close()

print("test FileWriter:")
with FileWriter('tmp.txt') as f:
    print("start write")
    f.write('hello world')
    print("end write")

class ExceptionTest(object):
    def __enter__(self):
        print("run __enter__")
        return self

    def __exit__(self, type, value, traceback):
        print("run __exit__")
        print("type:", type); print("value:", value); print("traceback:", traceback)
        return False # return True # 注意返回True和False的区别:返回True则跳过异常,继续执行with语句之后的语句

    def divide_by_0(self):
        v = 10/0

print("\ntest ExceptionTest")
with ExceptionTest() as ex:
    ex.divide_by_0()

print("test finish")

      执行结果如下:

 

      GitHubhttps://github.com/fengbingchun/Python_Test

Python中的with语句用于自动关闭文件、网络连接等资源。使用with语句可以自动管理资源的分配和释放,提高代码的可读性和可维护性。 with语句的语法如下: ``` with expression [as variable]: with-block ``` 其中,expression表示需要被管理的资源,如文件对象、网络连接对象等。as variable是可选的,用于给资源起一个别名,方便在with-block中使用。 with-block是需要被执行的代码块,当with-block执行完毕时,Python会自动调用expression的__exit__方法来释放资源。 以下是一个读取文件的示例: ``` with open('file.txt', 'r') as f: data = f.read() print(data) ``` 在这个示例中,open()函数返回一个文件对象,我们将其作为expression传递给with语句。在with-block中,我们使用f.read()方法读取文件内容,并打印到控制台。当with-block执行完毕时,Python会自动调用f的__exit__方法,关闭文件。 with语句还可以嵌套使用,以管理多个资源。例如,我们可以同时管理一个文件和一个网络连接: ``` with open('file.txt', 'r') as f, socket.socket() as s: data = f.read() s.connect(('localhost', 8080)) s.send(data.encode('utf-8')) ``` 在这个示例中,我们使用逗号将两个expression连接起来,使用with语句同时管理文件和网络连接。在with-block中,我们读取文件内容并发送到网络连接,当with-block执行完毕时,Python会自动关闭文件和网络连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值