对系统资源使用上下文管理器是否是错误的?

Mik*_*son 2 python with-statement

试图更深入地理解事物。

如果我打开一个文件、一个网络请求、张量流会话或任何可以用with语句处理的东西;有没有什么时候我不应该使用with声明?

例如,是否有某个时候我应该使用更通用/通用的try except结构?

我真正的问题是,真正的底层结构是什么with?我读了一些很好的有用提示以及文档本身,但对我来说,它的一些内部工作原理仍然with有点像黑魔法。我试图揭开神奇成分的神秘面纱。

Tad*_*sen 5

我总是通过 Python 增强提案 (PEP) 来理解 Python 中的概念,因为与文档相比,它们更关注事物的概念推理,并且通常直接解决:

  • 新功能/更改的原因。
  • 如何使用现有代码完成它/它如何影响现有代码。

因为您对实施方面感兴趣,所以这里是PEP 343 的相关努力 - “with”声明

规范:“with”声明

提出了一个新的语句,其语法如下:

with EXPR as VAR:
    BLOCK
Run Code Online (Sandbox Code Playgroud)

(省略段落 - 与这个问题无关)

上述声明的翻译是:

mgr = (EXPR)
exit = type(mgr).__exit__  # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
    try:
        VAR = value  # Only if "as VAR" is present
        BLOCK
    except:
        # The exceptional case is handled here
        exc = False
        if not exit(mgr, *sys.exc_info()):
            raise
        # The exception is swallowed if exit() returns true
finally:
    # The normal and non-local-goto cases are handled here
    if exc:
        exit(mgr, None, None, None)
Run Code Online (Sandbox Code Playgroud)

因此,with 语句的内部工作原理与构造完全一样try: finally,只是使用更清晰的语法,使得更难忘记关闭文件等。