问题标签 [contextmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1148 浏览

python - 在生成器内部时,上下文管理器的 __exit__ 何时触发?

我正在使用生成器作为协程来制作类似于任务调度程序的东西。在下面的代码中,我需要print cleanup确定性地执行。

从我的交互看来,将对象释放到垃圾收集器会导致上下文管理器退出。但是,我知道最好不要依赖 GC 的时间。它真的是 GC 调用__exit__还是另一种机制?

我怎样才能严格强制print 'cleanup'

0 投票
2 回答
1443 浏览

python - Naming convention for context-manager classes ("with" blocks)

Is there a general naming convention for classes or functions that are meant to be used in with block such as

? Something that signals that the class or the result of a function should be used with with?

0 投票
1 回答
314 浏览

python - 可以跳过其块的 with 语句

我厌倦了像这样编写 Python (2.7) 代码:

所以我写了一个生成器,它返回零个或一个对象:

现在我可以使更多的原始代码片段更紧凑,如下所示:

不过,为此目的使用 for 循环看起来很奇怪。我宁愿使用上下文管理器:

但是我想不出任何方法让上下文管理器跳过它管理的代码块。(@contextmanager例如,如果生成器没有产生至少一个值,则装饰器将引发 a RuntimeError。)是否有我遗漏的技巧?

0 投票
1 回答
444 浏览

python - python中的“with”语句,为什么“as”部分必须是单个对象

使用 Python 可以说:

但是这样的with声明:

行不通

必须具备:

我看不出允许第一种形式的实际问题,我的意思是实现或逻辑,解析器不应该有逗号问题(它不会模棱两可),我看不出有什么合乎逻辑的理由。

http://docs.python.org/release/2.5/whatsnew/pep-343.html

http://www.python.org/dev/peps/pep-0343/表明这只是合成糖

0 投票
5 回答
4452 浏览

python - 是否可以访问封闭的上下文管理器?

基本上有三种使用 with 语句的方法:

使用现有的上下文管理器:

创建一个上下文管理器并将其结果绑定到一个变量:

创建一个上下文管理器并丢弃它的返回值:

如果我们get_manager()在上面的三个 with 块中放置了一个函数,是否有任何实现可以返回封闭的上下文管理器,或者至少是它们的__exit__函数?

在第一种情况下显然很容易,但我想不出一种方法让它在其他两种情况下工作。我怀疑是否有可能获得整个上下文管理器,因为值堆栈在SETUP_WITH操作码之后立即弹出。但是,由于__exit__函数存储在块堆栈中SETUP_WITH,有什么方法可以访问它吗?

0 投票
2 回答
12515 浏览

python - python 'with' 语句,我应该使用 contextlib.closure 吗?

这是来自烧瓶教程第 3 步(http://flask.pocoo.org/docs/tutorial/dbinit/#tutorial-dbinit)。我对第 4 行有点好奇。

我必须导入并使用那个 'contextlib.closing()' 方法吗?

当我了解with语句时,许多文章都说它在处理后自动关闭文件,如下所示。(与 Final:thing.close() 相同)

即使我没有像下面那样使用 contextlib.closing() ,有什么区别?它来自版本 2.7.6,谢谢。

0 投票
2 回答
909 浏览

python - 组装一个 Python 上下文管理器:一个难题

我对如何将 Python 上下文管理器可以做的所有事情安排到适当的位置感到困惑。

据我了解,可能用于构建上下文管理器的元素包括:

  • A:总会发生的事情
  • B: C需要一些准备
  • C:创建并建立上下文中使用的对象 X
  • D:在上下文开始之前使用成功建立的 X 做一些事情
  • E:将 X 返回到上下文(供 使用as
  • F:在上下文结束时一切顺利时用 X 结束
  • G:在进入上下文之前处理 C 和 B 失败的后果
  • H:在上下文中处理失败的后果

我想我大致了解了每个元素在上下文管理器函数中的位置,但是对于如何在类中安排它们完全不知所措。

是否有上下文管理器函数和类的模板来显示这些元素中的每一个是否同时出现在函数和(尤其是)类中?我在这里和其他地方查看了许多示例,但没有发现一个全面的示例,而且许多示例使用了我无法始终映射到上面每个构建块的实际代码。


我基本上了解上下文管理器在通过函数实现时的行为方式:

例如,要打开一个文件,该文件应该在成功打开和关闭时写入,但如果出现问题应该清理,我可以写

但我不确定这是对的,我很困惑它如何映射到类的使用__enter()____exit()__类中。是(示意性地):

0 投票
1 回答
233 浏览

python - 上下文管理器和面向对象是否可以有效地用于 GAE 请求处理程序类

我可以在请求处理程序中使用上下文管理器来管理我的变量从 URL 到模板的流吗?

我从这里的这个例子开始

我想用它在处理程序的顶部创建一个类实例,运行计算所需的所有代码,关闭上下文并将类计算的所有变量传递给参数字典,最后传递他们到模板。像:

考虑到我必须在类中执行数据存储查询和一些 memcache 设置/获取,最好的实现是什么?到目前为止,我对 ContextManager 的理解是,该with语句允许您通过上下文方法“程序化”执行一个类,不是吗?我的意思是,在我看来,用于描述流程的魔术方法__init__()>> __enter__()>>似乎是用来描述流程的__exit__()with如果我根据需要初始化变量,则在enter () 中进行查询,然后在 处删除类的实例,在__exit__()我看来,这似乎是在模拟 OO 范式中的过程。

我测试了这样的事情:

foo变量不会打印在模板上,甚至在将其传递给模板之前尝试将 if 转换为字符串(虽然这不是一个大问题,我只想知道为什么)。页面上的结果是:

这种方法有问题吗?有什么注意事项或需要注意的事项吗?以这种方式在处理程序中使用它是正确的方法吗?

0 投票
1 回答
1319 浏览

python - 是否可以访问上下文管理器的 __exit__() 方法中的上下文对象(代码块)?

如果它引发异常(可能多次,可能有延迟),我想在exit () 方法中再次调用代码对象。我知道使用装饰器很容易做到,但我的动机是有时我只想重复一些我不想提取到单独函数并装饰它的代码片段。我正在寻找这些方面的东西:

它会像这样使用:

预期的输出是:

我可以找到一种方法来获取代码对象。上下文管理器属性似乎都没有引用它(我想它并不是真正需要的,因为它的工作只是在之前和之后做一些事情)。

有可能做到吗?

0 投票
0 回答
69 浏览

python - 如何使用 python 上下文管理器“借用”对象

我想创建一个 Python 上下文管理器来充当一种受控的“库”,它可以借出对象,然后在with语句范围退出时将它们取回。

在伪代码中,我在想这样的事情: