作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为“更新程序”的长期运行进程,它已提交更新(到 ETL 系统)。更新具有通过将上下文管理器添加到更新程序的 ExitStack 来管理的资源要求。某些更新将包括新配置,这意味着必须从堆栈中释放受影响的资源,并且将添加该资源的新配置版本。我需要类似的东西:
with ExitStack() as stack:
ctx_manager = open("file.txt")
f = stack.enter_context(ctx_manager)
...
ctx_pop(ctx_manager, stack) # remove the given context manager from the stack
下面是我已经完成的工作的示例,但它依赖于访问 protected 成员。我希望可能有一个比这更“肮脏”的解决方案:
def ctx_pop(cm, stack):
for item in stack._exit_callbacks:
if item.__self__ is cm:
break
else:
raise KeyError(repr(cm))
stack._exit_callbacks.remove(item)
item(None, None, None)
编辑:添加已知解决方案
最佳答案
您必须使用自己的 pop
方法扩展 ExitStack
:
from contextlib import ExitStack
from collections import deque
class ExitStackWithPop(ExitStack):
def pop(self, cm):
callbacks = self._exit_callbacks
self._exit_callbacks = deque()
found = None
while callbacks:
cb = callbacks.popleft()
if cb.__self__ == cm:
found = cb
else:
self._exit_callbacks.append(cb)
if not found:
raise KeyError("context manager not found")
found(None, None, None)
关于python - 如何从 ExitStack 中删除上下文管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606904/
我是一名优秀的程序员,十分优秀!