问题标签 [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 投票
5 回答
7622 浏览

python - 将重试封装到 `with` 块中

我希望将数据库事务的逻辑封装到一个with块中;将代码包装在事务中并处理各种异常(锁定问题)。这很简单,但是我还想让块封装在某些异常之后重试代码块。我看不到将其整齐地打包到上下文管理器中的方法。

是否可以在with语句中重复代码?

我想这么简单地使用它,这真的很整洁。

我目前正在使用装饰器处理此问题,但我更愿意提供上下文管理器(或实际上两者都提供),因此我可以选择在with块中包装几行代码,而不是包装在装饰器中的内联函数,这就是我目前所做的:

0 投票
2 回答
40400 浏览

python - 在python中打开和关闭文件

我已经读过,当使用以下格式打开文件时

不需要显式关闭文件。有人可以解释为什么会这样吗?此外,如果有人明确关闭文件,它会产生任何不良影响吗?

0 投票
1 回答
2011 浏览

python - 我应该关闭在上下文管理器 __exit__() 函数中传递给我的对象的流(类文件对象)吗?

我有一个对象,我希望能够在其with上使用关键字。我对实现上下文管理器的实用性感到满意,但我正在努力解决最佳实践类型的问题。

该对象是文件的包装器。我计划用字符串(文件的路径)或可以直接处理的类似文件来初始化我的对象(文件中有文件的可能性 - 所以我预见到一个明确的用例这与 BytesIO 等...)

所以__init__看起来像这样:

所以我的问题是,_underlying_stream在我的__exit__()函数中关闭它是最佳实践/可接受/明智吗?当它是一条路径时,这完全是有道理的,但是如果它是一条经过的小溪,我觉得它充其量是不礼貌的,最坏的情况是关闭它是危险的self._underlying_stream——我这样想是否正确,如果是这样,是否有一种巧妙的方法这个?

(注意:我考虑用 a 包装进来的流io.BufferedReader,但事实证明关闭也会关闭底层流......)

0 投票
1 回答
299 浏览

python - 结构:在辅助函数中处理 cd()

在结构中,cd上下文管理器的工作方式类似于

并且该命令将在切换到dir目录后运行。这很好用,但问题是它使用了全局状态。例如,假设我有一个辅助函数,需要使用 cd:

如果我helper从另一个函数调用

它工作正常。但是如果我做类似的事情

它中断了,因为run("come command")from 助手现在运行 frombar/foo而不是 just foo

关于如何解决这个问题的任何提示?我尝试在 cd 中使用绝对路径,但这不起作用。我真正想要的是cd上下文只扩展到函数范围。

0 投票
2 回答
4019 浏览

python - 在上下文处理程序中重新引发异常

从上下文管理器的数据模型文档中:

请注意,__exit__()方法不应重新引发传入的异常;这是调用者的责任。


我有一个临时文件,我想释放它的文件描述符,close但不向磁盘写入任何内容。我直观的解决方案是传递异常,但在文档中不鼓励这样做——当然是有充分理由的。

此外,在这种特殊情况下,我不希望在调用者中进行错误处理,原因有两个:

  • 保持调用者中的代码最少(见下文)
  • 调用者对异常感到满意(快速失败是我们想要的)

上下文管理器的使用如下:


更新:我的问题有点表述不当,因为我的问题实际上归结为:在嵌套的上下文管理器中,如何将异常传递给最外层的 CM?

0 投票
4 回答
390 浏览

python - 以 Python 2.6-/Python 3-neutral 方式嵌套上下文管理器的提示?

我一直在使用很多上下文管理器作为组合各种设置/拆卸情况的干净方式。由于我的部署以 Python 2.6 为目标,这意味着使用contextlib.nested.

最近,我对使用相同的代码库同时支持 Python 2.x 和 Python 3 很感兴趣。这在某些项目中是可能的,但在上下文管理器的情况下我遇到了麻烦,因为:

  1. contextlib.nestedPython 3 不支持
  2. with aa() as a, bb() as b: ...2.6 不支持 Python-3 样式的嵌套上下文管理器(例如)。

这里有一个基本的语法不兼容。由于我无法控制的各种原因,2.7 目前可能难以投入生产,但我想尽可能地对代码进行未来验证,因此对 Python 3 很感兴趣。

任何人都可以建议一种解决方法来支持 2.6 和 3.x 的同一代码库中的嵌套上下文管理器吗?或者这是一个失败的原因?

0 投票
1 回答
311 浏览

python - 将代码作为函数存储在块内,以便稍后在该范围内执行

这似乎是不可能的事情,但我正在尝试实现这样的事情:

所以我想要一些可以在 with 语句中获取块的东西,将该块保存在某处并在每个之前调用它do_thing在使用该范围时在每个函数调用之前调用它。

另一种选择是这样的:

而不是 with 语句。我想,这两种选择都适合我,尽管 with 语句是首选。

我想,这里有一些东西应该做我想做的事,但是当我真正尝试它时,我得到了一个错误。

0 投票
3 回答
3779 浏览

python - 使用 with/as 上下文管理器打开文件列表

注意:我知道

句法。这是一个不同的问题。


给定一个字符串列表,file_names有没有一种方法可以使用with/as来使用单行打开其中的每个文件名。例如:

这当然不起作用,因为它试图在列表中使用上下文管理器。列表的长度可能要到运行时才能知道,例如sys.argv[1:]

0 投票
3 回答
371 浏览

python - python`with`语句用法的其他内置或实际示例?

__enter__有没有人在python的文件对象实现和用例之外有一个真实的__exit__例子?最好是你自己的,因为我想要实现的是一种更好的方式来概念化使用它的情况。

我已经读过这个

而且,这里是 python 文档的链接。

0 投票
2 回答
448 浏览

python - PEP343 'with' 上下文管理器和 django

我正在使用 django 框架工作进行一些应用程序测试,我有一个案例我测试非活动用户是否可以登录,我确实喜欢这样

我的问题是,通过使用PEP343提供的上下文管理器, 我尝试这样做,但我失败了

然后我试着做

它也失败了

有没有办法解决这个问题?还是我必须定义一个将 is_active 设置为 false 的函数?