• python中的with与上下文管理器


    #转载请留言联系

    很多人平时需要打开文件进行读取写入操作时,通常这样:

    f = open('文件路径','w')
    f.write(data)
    f.close

    这样写有一个潜在的问题,如果在调用 write 的过程中,出现了异常进而导致后续代码无法继续执行,close 方法无法被正常调用,因此资源就会一直被该程序占用者释放。那么该如何改进代码呢?

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

    比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最大文件数量是有限的。总之,能够将打开使用的资源 进行自动关闭是一个非常不错的手段。

    那么,怎么才能在不需要的时候自动关闭呢?很简单,用with。

    with open('文件路径','w') as f
    f.write(data)

    with的原理到底是什么呢?怎么这么神奇?

    其实它是通过上下文管理器实现这么一个功能的。

    上下文管理器是什么东西呢?其实上下文管理器和迭代器有点相似。任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器   ,上下文管理器可以使用with简化操作。

    现在来写一个实现文件自动关闭的上下文管理器~

    class File():
        def __init__(self,file_name,mode):
            self.file_name = file_name
            self.mode = mode
    
        def __enter__(self):
            """上文"""
            self.file_name = open(self.file_name,self.mode)
            return self.file_name
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            """下文"""
            self.file_name.close()
    
    with File('./one.txt','w') as f:  #正文
        f.write("大家好")

    “上文”和“下文”对应类中的__enter__和__exit__函数。“正文”就是你的文件处理部分啦。

  • 相关阅读:
    HTML和CSS
    springcloud中配置多数据源
    洛谷 P3800 Power收集(单调队列优化dp)
    洛谷 P2569 [SCOI2010]股票交易(单调队列优化dp)
    洛谷 P3957 [NOIP2017 普及组] 跳房子(二分,单调队列优化dp)
    洛谷 P1419 寻找段落(01分数规划,实数二分,单调队列)
    Prometheus(普罗米修斯)和grafana监控的安装和使用
    AMC如何管理NPL
    linux 正则表达式与字符处理
    react-router-dom switch & match
  • 原文地址:https://www.cnblogs.com/chichung/p/9621141.html
Copyright © 2020-2023  润新知