python中with关键字详解


一、with使用背景

对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(释放)该资源。

比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,如果不关闭会出现什么情况呢?极端情况下会出现 Too many open files 的错误,因为系统允许你打开的最大文件数量是有限的。
同样,对于数据库,如果连接数过多而没有及时关闭的话,就可能会出现 Can not connect to MySQL server Too many connections,因为数据库连接是一种非常昂贵的资源,不可能无限制的被创建。

我们所熟知的try except finally 可以解决上述问题,但这样的结构一多会导致整体代码结构 很臃肿繁琐,不易读、不美观。所以用with…as…语句对其进行简化。

二、with使用方法

with as 语句的结构如下:

with expression [as variable]:
with-block
例:

 with open(file, "w") as f:
        f.write("hello python")

open 方法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会自动调用 f.close() 方法, with 的作用和使用 try/finally 语句是一样的

三、with详解

在这里插入图片描述

四、with的执行顺序

–>首先执行expression里面的__enter__函数,它的返回值会赋给as后面的variable,想让它返回什么就返回什么,只要你知道怎么处理就可以了,如果不写as variable,返回值会被忽略。

–>然后,开始执行with-block中的语句,不论成功失败(比如发生异常、错误,设置sys.exit()),在with-block执行完成后,会执行expression中的__exit__函数。

当with…as语句中with-block被执行或者终止后,这个类对象应该做什么。如果这个码块执行成功,则exception_type,exception_val, trace的输入值都是null。如果码块出错了,就会变成像try/except/finally语句一样,exception_type, exception_val, trace 这三个值系统会分配值。

五、引用文章

1、https://blog.csdn.net/qq_43629857/article/details/115422078
2、https://blog.csdn.net/qiqicos/article/details/79200089?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-79200089-blog-115422078.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-79200089-blog-115422078.pc_relevant_paycolumn_v3&utm_relevant_index=9

`with` 语句是 Python 的一个关键字,用于简化代码的资源管理和异常处理。通常情况下,我们需要在代码打开一个资源(如文件、网络连接等),在使用完毕后关闭或释放该资源。如果使用传统的 `try/finally` 结构,代码可能会变得很冗长,而且容易出错。 利用 `with` 语句可以很好地解决这个问题。当打开一个资源时,我们可以将其放在 `with` 语句,并在 `with` 语句块结束时自动关闭或释放该资源。例如,使用 `with open()` 来打开文件,可以在代码块结束时自动关闭文件: ```python with open('file.txt', 'r') as f: content = f.read() print(content) ``` 在上面的代码,我们使用 `with open()` 语句来打开文件 `file.txt`,并将其赋值给变量 `f`。在 `with` 语句块,我们可以像使用文件对象一样使用 `f`,例如读取文件内容。当 `with` 语句块结束时,Python 会自动关闭文件,无需手动调用 `f.close()`。 除了自动管理资源外,`with` 语句还可以用于异常处理。在 `with` 语句块,如果发生异常,则会自动捕获该异常并执行相应的处理。例如: ```python with open('file.txt', 'r') as f: content = f.read() print(content) # 模拟异常 1 / 0 ``` 在上面的代码,我们在 `with` 语句块模拟了一个除以零的异常。当程序执行到这里时,Python 会自动捕获该异常,并执行相应的处理(如输出错误信息),然后关闭文件。这样可以确保资源被正确地释放,避免资源泄漏和其他异常。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值