zoukankan      html  css  js  c++  java
  • 02-python中with的用法

    摘自:https://www.toutiao.com/i6797744580356735499/ 

    with 是一种上下文管理协议,目的在于从流程图中把 try,except 和 finally 关键字和资源分配释放相关代码统统去掉,

    简化 try ... except ... finally 的处理流程。

    with 通过 _enter_ 方法初始化,然后在 _exit_ 中做善后以及处理异常,所以用 with 处理的对象必须有 _enter_() 和 _exit_() 这两个方法,

    其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,exit()方法在语句体执行完毕退出后运行。

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

    线程中锁的自动获取和释放等。

    示例:

    with open("readme.txt", "r") as fp:

      print(fp.read())

    with语句的工作原理:

      紧跟with后面的语句会被求值,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as关键字后面的变量,当with后面的代码块全部被执行完之后,

    将调用前面返回对象的__exit__()方法。with语句最关键的地方在于被求值对象必须有__enter__()和__exit__()这两个方法,

    那我们就可以通过自己实现这两方法来自定义with语句处理异常。

    我们按照这个重写一段:

    class opened(object):

      def _init_(self, filename):

        self.handle=open(filename)

        print("Resource: %s" %filename)

      def _enter_(self):

        print("[enter %s]: Allocate resource." %self.handle)

        return self.handle  # 可以返回不同的对象

      def _exit_(self, exc_type, exc_value, exc_trackback):

        print("[Exit %s]: Free resource." %self.handle)

        if exc_trackback is None:

          print("[Exit %s]: Exited without exception." %self.handle)

          self.handle.close()

        else:

          print("[Exit %s]: Exited eith exception raised." %self.handle)

        return False

    with opened(r"readme.txt", "r") as fp:

      for line in fp.readlines():

        print(line)

    借用别人的成果用一下:

  • 相关阅读:
    记录一次腾讯云服务器进挖矿病毒的事故
    Django组件:django-simple-captcha 使用
    RabbitMQ延迟队列(Python版)
    RabbitMQ CLI 管理工具 rabbitmqadmin(管理)
    Django Rest Framework组件:用户访问次数/频率限制BaseThrottle
    GitLab 持续集成
    Windows10搭建Spark+Python开发环境
    Python 应用自动化部署工具Fabirc
    Prometheus:Prometheus开发中间件Exporter
    qs 和 headers: { "content-type": "application/x-www-form-urlencoded" }, data: qs.stringify(data) 必须同时设置
  • 原文地址:https://www.cnblogs.com/blog-zg/p/12370894.html
Copyright © 2011-2022 走看看