问题标签 [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.
python - 将重试封装到 `with` 块中
我希望将数据库事务的逻辑封装到一个with
块中;将代码包装在事务中并处理各种异常(锁定问题)。这很简单,但是我还想让块封装在某些异常之后重试代码块。我看不到将其整齐地打包到上下文管理器中的方法。
是否可以在with
语句中重复代码?
我想这么简单地使用它,这真的很整洁。
我目前正在使用装饰器处理此问题,但我更愿意提供上下文管理器(或实际上两者都提供),因此我可以选择在with
块中包装几行代码,而不是包装在装饰器中的内联函数,这就是我目前所做的:
python - 在python中打开和关闭文件
我已经读过,当使用以下格式打开文件时
不需要显式关闭文件。有人可以解释为什么会这样吗?此外,如果有人明确关闭文件,它会产生任何不良影响吗?
python - 我应该关闭在上下文管理器 __exit__() 函数中传递给我的对象的流(类文件对象)吗?
我有一个对象,我希望能够在其with
上使用关键字。我对实现上下文管理器的实用性感到满意,但我正在努力解决最佳实践类型的问题。
该对象是文件的包装器。我计划用字符串(文件的路径)或可以直接处理的类似文件来初始化我的对象(文件中有文件的可能性 - 所以我预见到一个明确的用例这与 BytesIO 等...)
所以__init__
看起来像这样:
所以我的问题是,_underlying_stream
在我的__exit__()
函数中关闭它是最佳实践/可接受/明智吗?当它是一条路径时,这完全是有道理的,但是如果它是一条经过的小溪,我觉得它充其量是不礼貌的,最坏的情况是关闭它是危险的self._underlying_stream
——我这样想是否正确,如果是这样,是否有一种巧妙的方法这个?
(注意:我考虑用 a 包装进来的流io.BufferedReader
,但事实证明关闭也会关闭底层流......)
python - 结构:在辅助函数中处理 cd()
在结构中,cd
上下文管理器的工作方式类似于
并且该命令将在切换到dir
目录后运行。这很好用,但问题是它使用了全局状态。例如,假设我有一个辅助函数,需要使用 cd:
如果我helper
从另一个函数调用
它工作正常。但是如果我做类似的事情
它中断了,因为run("come command")
from 助手现在运行 frombar/foo
而不是 just foo
。
关于如何解决这个问题的任何提示?我尝试在 cd 中使用绝对路径,但这不起作用。我真正想要的是cd
上下文只扩展到函数范围。
python - 在上下文处理程序中重新引发异常
从上下文管理器的数据模型文档中:
请注意,
__exit__()
方法不应重新引发传入的异常;这是调用者的责任。
我有一个临时文件,我想释放它的文件描述符,close
但不向磁盘写入任何内容。我直观的解决方案是传递异常,但在文档中不鼓励这样做——当然是有充分理由的。
此外,在这种特殊情况下,我不希望在调用者中进行错误处理,原因有两个:
- 保持调用者中的代码最少(见下文)
- 调用者对异常感到满意(快速失败是我们想要的)
上下文管理器的使用如下:
更新:我的问题有点表述不当,因为我的问题实际上归结为:在嵌套的上下文管理器中,如何将异常传递给最外层的 CM?
python - 以 Python 2.6-/Python 3-neutral 方式嵌套上下文管理器的提示?
我一直在使用很多上下文管理器作为组合各种设置/拆卸情况的干净方式。由于我的部署以 Python 2.6 为目标,这意味着使用contextlib.nested
.
最近,我对使用相同的代码库同时支持 Python 2.x 和 Python 3 很感兴趣。这在某些项目中是可能的,但在上下文管理器的情况下我遇到了麻烦,因为:
contextlib.nested
Python 3 不支持with aa() as a, bb() as b: ...
2.6 不支持 Python-3 样式的嵌套上下文管理器(例如)。
这里有一个基本的语法不兼容。由于我无法控制的各种原因,2.7 目前可能难以投入生产,但我想尽可能地对代码进行未来验证,因此对 Python 3 很感兴趣。
任何人都可以建议一种解决方法来支持 2.6 和 3.x 的同一代码库中的嵌套上下文管理器吗?或者这是一个失败的原因?
python - 将代码作为函数存储在块内,以便稍后在该范围内执行
这似乎是不可能的事情,但我正在尝试实现这样的事情:
所以我想要一些可以在 with 语句中获取块的东西,将该块保存在某处并在每个之前调用它do_thing
在使用该范围时在每个函数调用之前调用它。
另一种选择是这样的:
而不是 with 语句。我想,这两种选择都适合我,尽管 with 语句是首选。
我想,这里有一些东西应该做我想做的事,但是当我真正尝试它时,我得到了一个错误。
python - 使用 with/as 上下文管理器打开文件列表
注意:我知道
句法。这是一个不同的问题。
给定一个字符串列表,file_names
有没有一种方法可以使用with
/as
来使用单行打开其中的每个文件名。例如:
这当然不起作用,因为它试图在列表中使用上下文管理器。列表的长度可能要到运行时才能知道,例如sys.argv[1:]
python - python`with`语句用法的其他内置或实际示例?
__enter__
有没有人在python的文件对象实现和用例之外有一个真实的__exit__
例子?最好是你自己的,因为我想要实现的是一种更好的方式来概念化使用它的情况。
我已经读过这个。
python - PEP343 'with' 上下文管理器和 django
我正在使用 django 框架工作进行一些应用程序测试,我有一个案例我测试非活动用户是否可以登录,我确实喜欢这样
我的问题是,通过使用PEP343提供的上下文管理器, 我尝试这样做,但我失败了
然后我试着做
它也失败了
有没有办法解决这个问题?还是我必须定义一个将 is_active 设置为 false 的函数?