代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

需要对generator.close()进行一些解释

  •  2
  • Rick Jim DeLaHunt  · 技术社区  · 5 年前

    我正在阅读python文档 https://docs.python.org/3/reference/expressions.html 关于 generator.close() .

    我对文件的翻译是:

    ##generator.close()

    提高a GeneratorExit 在生成器功能暂停的时刻。

    1. 如果生成器函数随后优雅地退出:

    1.1已经关闭,
    1.2或加薪 发电机出口 (通过不捕获异常),

    close 返回给调用者。

    1. 如果生成器产生一个值 RuntimeError 提高。

    2. 如果生成器引发任何其他异常,则会将其传播给调用者。

    close() 如果生成器因异常或正常退出而已退出,则不执行任何操作。


    我不明白为什么 close() 行为与文档一致。

    >>> def echo(value=None):
    ...     print("Execution starts when 'next()' is called for the first time.")
    ...     try:
    ...         while True:
    ...             try:
    ...                 value = (yield value)
    ...             except Exception as e:
    ...                 value = e
    ...     finally:
    ...         print("Don't forget to clean up when 'close()' is called.")
    ...
    >>> generator = echo(1)
    >>> next(generator)
    Execution starts when 'next()' is called for the first time.
    >>> generator.close()
    Don't forget to clean up when 'close()' is called.
    

    哪条规则适用于 generator.close() 我感到困惑。

    我的理解:

    1. generator.close() 提高a 发电机出口 例外
    2. 发电机出口 被抓住了 except Exception as e: 循环继续
    3. value = (yield value) 执行
    4. 根据规则 2. 上面,a 访问违例 将被提高。

    但事实似乎并非如此。

    请告诉我里面发生了什么事。

    1 回复  |  直到 4 年前
        1
  •  9
  •   MisterMiyagi    5 年前

    GeneratorExit 不继承自 Exception ,但从更根本的角度 BaseException 因此,它不会被你的 except Exception 块。

    所以你的假设2是错误的。生成器通过情况1.3优雅地退出,因为 发电机出口 没有停止。

    1. 这个 发电机出口 被抛出 (yield value) .
    2. 这个 try: except Exception as e: 检查当前异常是否是的子类 例外情况 。既然不是这样,它就会松开。
    3. 这个 while True: 由于当前异常而取消。
    4. 这个 try: finally: 展开,运行其 finally: 块。这将导致显示消息。
    5. 发电机退出时出现电流异常,即。 发电机出口 .
    6. generator.close 检测并抑制 发电机出口 .