python笔记 初识with

64 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 问题

打开1.txt,read读到所有的内容,完成后,要close关闭它。后来有了as后,没加close关闭操作,探索一下,为啥可以省略。如下图:

image.png

2 概念

open函数返回值是个文件对象,这个文件对象呢,可以使用上下文管理的对象。比如with ...。 想这个对象支持上下文管理,需要同时实现__enter____exit__

image.png

3 使用

那上面的with和Demo怎么用呢,如下代码:

class Demo:
    def __enter__(self):
        print("Demo enter")

    def __exit__(self, *args, **kwargs):
        print("Demo exit")

with Demo():
    print("1111")

image.png

顺序是,先执行__enter__,然后在执行with里的逻辑,最后在执行__exit__

在with的上下面都加个print打印,说明只针对with。 image.png

4 异常处理

如下图:假如在执行with里的逻辑时,出现了异常,它依然会执行__enter____exit__。上下文管理的挺安全的。 image.png

那么在试试使用更加极端点的exit方式呢,如下图的执行,它两也会照常执行。这样以后我在遇到这种哪怕出现异常的情况,也可以很淡定的在__exit__中结束,比如读写文件,不管是否异常,最后的关闭操作,或者其他的读取了线程,最后关闭的操作。 image.png

5 总结

认识到了with的好处,之前只是知道with是这么用的,但没想到还可以这么用,并且它上下文管理很安全,哪怕出现异常,也会执行__enter____exit__