【问题标题】:Variable Number of With Statements [duplicate]可变数量的With语句[重复]
【发布时间】:2012-08-29 13:12:22
【问题描述】:

有什么方法可以格式化 with 语句,以便我可以建立可变数量的上下文?就像,有时我想要四个带有语句,但有时我可能只想要两个。事实上,我面临调用我可以使用但不是的所有对象的虚拟版本的前景,然后将我的代码嵌套在 16 个语句中,其中虚拟对象填充我不使用的语句。由于我使用的是 Python 2.6.6,甚至不支持压缩语法。

顺便说一句,with 语句真的是获得有效清理代码的唯一方法吗?真的没有其他方法可以获得类似于析构函数的任何东西,但像标准的__del__ 方法那样使用不会出错?

【问题讨论】:

  • 至于其他获得清理代码的方法,在更简单的情况下,总是可以使用“try”语句的“finally”子句。

标签: python with-statement


【解决方案1】:

contextlib.nested 就是为此而生的。

文档中的示例:

from contextlib import nested

with nested(*managers):
    do_something()

【讨论】:

  • 还值得指出with A() as a, B() as b: suite 表单
  • 是的,但这不适用于可变数量的上下文,也不适用于 Python 2.6
  • 一个真正的问题是,由于 with 语句现在接受多种形式,contextlib.nested 从 Python 3.3 开始将被标记为已弃用——即使它是唯一可能的(干净的)方式来做OP 要求。
  • 这里的问题是如何创建管理器,以确保在创建最后一个时抛出的异常不会让所有其余的依赖于他们的__del__() 进行清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2020-11-09
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多