python中with用法讲解

我们都知道打开文件有两种方法:

f = open() with open() as f:

这两种方法的区别就是第一种方法需要我们自己关闭文件;f.close(),而第二种方法不需要我们自己关闭文件,无论是否出现异常,with都会自动帮助我们关闭文件,这是为什么呢?

我们先自定义一个类,用with来打开它:

?

|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Foo(): ``def __enter__(``self``): ``print``(``"enter called"``) ``def __exit__(``self``, exc_type, exc_val, exc_tb): ``print``(``"exit called"``) ``print``(``"exc_type :%s"``%``exc_type) ``print``(``"exc_val :%s"``%``exc_val) ``print``(``"exc_tb :%s"``%``exc_tb) with Foo() as foo: ``print``(``"hello python"``) ``a ``= 1``/``0 ``print``(``"hello end"``) |

执行结果:

?

|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 | enter called Traceback (most recent call last): hello python exit called exc_type :<``class 'ZeroDivisionError'``> exc_val :division by zero ``File "F:/workspaces/python_workspaces/flask_study/with.py"``, line ``25``, ``in <module> ``a ``= 1``/``0 exc_tb :<traceback ``object at ``0x0000023C4EDBB9C8``> ZeroDivisionError: division by zero Process finished with exit code ``1 |

我们看到,执行结果的输入顺序,分析如下:

当我们with Foo() as foo:时,此时会执行__enter__方法,然后进入执行体,也就是:

?

|-------|----------------------------------------------------------------------------|
| 1 2 3 | print``(``"hello python"``) a ``= 1``/``0 print``(``"hello end"``) |

语句,但是在a=1/0出现了异常,with将会中止,此时就执行__exit__方法,就算不出现异常,当执行体被执行完毕之后,__exit__方法仍然被执行一次。

我们回到with open("file")as f: 不用关闭文件的原因就是在__exit__方法中,存在关闭文件的操作,所以不用我们手工关闭文件,with已将为我们做好了这个操作,这就可以理解了。

相关推荐
§ꦿCFོ༉6 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠6 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_967980118 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab8 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure1408 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶9 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神9 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary9 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司9 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k1110 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm