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

python - 使用上下文管理器似乎改变了对变量的访问

我有一个工作程序,它为列表的每个项目(比如一本书)调用一个 API,以获取有关该书的元数据。它将 book : metadata 存储在 dict 中以供使用。这会导致用户在元数据收集期间等待,因此避免过多调用我将字典保存到 CSV 并在进行上述 API 调用之前加载它,以确保我只在必要时得到响应。

但是,当我引入上下文管理器来读取持久化的字典,然后在函数(“gatherfiles()”)中执行调用逻辑时,第三个函数不再可以访问它。

当我在主函数中调用时,我可以看到收集文件()返回了字典,但是当我进行第三次函数调用(对“pickabook()”)时,我得到一个键错误,我看到一个空字典。

我在下面放了一个经过编辑的代码版本。我的猜测是,上下文管理器以某种方式改变了范围(因此它将一个 shimdict 视为全局,一个视为本地),但鉴于我可以在线阅读的内容,这似乎并不正确。那么这里有什么不丑的想法吗?


----在下面编辑----我认为我的问题不够明确。如果删除了上下文管理器,我可以访问“pickabook()”中的字典“shimdict”,即我使用以下代码:

所以我完全明白我可以使用全局或将本地字典传递给函数来解决这个问题,但我想知道为什么添加上下文管理器会改变行为。

0 投票
2 回答
801 浏览

python - 带有 sudo 的结构上下文管理器

是否有可能拥有一个仅保留先前run执行状态的上下文管理器。在代码中:

编辑:不是一个可行的解决方案,这是我所期望的

我正在尝试运行多个命令,但想在每个命令之间保持状态?

我尝试使用前缀上下文管理器,但它不适用于 shell_env 上下文管理器:运行此代码时

我希望我ENV被设置然后运行我应该设置env2但前缀在 shell_env 之前运行的应用程序?

0 投票
0 回答
177 浏览

python - 防止 wxPython 吞下 SIGINT 上的上下文管理器退出

似乎 wxPython 正在以一种阻止上下文管理器__exit__调用发生的方式拦截任何 SIGINT。有没有办法解决这种行为?

这是一个演示该问题的小型测试程序:

如果像这样运行它并按 Ctrl+C,则不会生成任何输出。如果将 wx 代码更改为 sleep 语句并按 Ctrl+C,则上下文管理器会执行预期的操作。

0 投票
1 回答
346 浏览

python - Python“with”语句堆积

我倾向于经常使用 Python 的“with”语句。主要用于在我将一些文件符号链接或复制到目录后清理目录,因为即使 python 脚本崩溃,任务仍然会执行。这是我的函数的一个示例,可以与“with”语句一起使用。

我使用这些语句的方式往往会很快堆积起来。

有没有更好的方法可以像强大的“with”语句一样轻松和安全地完成上述操作?

0 投票
2 回答
397 浏览

python - 为什么生成器不是上下文管理器?

生成器可以管理资源,例如通过yield从上下文管理器内部 'ing。一旦close()调用生成器的方法(或引发异常),资源就会被释放。

由于最后很容易忘记调用close(),我认为为此使用上下文管理器(以及处理潜在的异常)是显而易见的。我知道我可以使用它,但是在语句contextlib.closing中直接使用生成器不是更好吗?with

为什么生成器应该是上下文管理器?

0 投票
1 回答
29 浏览

python - Python - 异常似乎正在跳过 with 块

以下是相关的代码:

好的,所以把这一切都写出来,我现在明白发生了什么。我用装饰器创建的 contextmanager 中的exit方法正在运行,但是这当然不会将流返回到我的生成器。

那么我应该怎么做呢?

0 投票
2 回答
803 浏览

python - 如何将子上下文的管理委托给父级

假设我们有一个类“A”,它本身就充当上下文管理器,所以它实现了

界面。客户端代码直接使用with语句生成“A”对象是有效的。

现在,我们还有另一个类“B”,它封装了其他功能,也使用了“A”对象。

如果我们也想让“B”充当上下文管理器,那么管理它的“A”实例的正确方法是什么?

是否应该在“B”上调用__enter__和(分别)调用它的 A 对象实例?或者,还有更好的方法?__exit____enter____exit__

举一个具体的例子(这不是我在我的应用程序中使用的,这只是我想到的第一个非抽象例子)考虑两个类

  • DatabaseConnection
  • DatabaseConnectionPool

单独使用一个是有效DatabaseConnection的,因此DatabaseConnection实现了上下文管理器接口。

DatabaseConnectionPool使用了几个DatabaseConnections以及其他一些零碎的东西。使用DatabaseConnectionPool(即“with”)应该对它的实例进行设置和拆除DatabaseConnection(以及它可能想做的任何其他事情)

更新: 我编写了一些测试代码,希望能提供以下输出:

但我得到以下信息:

代码:

关于如何使这项工作的任何想法?

0 投票
0 回答
131 浏览

python - 如何在 Python 中编写三块上下文管理器?

我有许多利用上下文管理器模式的功能:

我使用 anExitStack来调用所有这些上下文管理器。

我正在考虑这种模式:

我一直在查看源代码,并认为我会以某种方式对其进行修改。有没有很好的方法来实现这一点?我的另一个选择是为每个返回上下文管理器的类添加一个方法。添加方法的缺点是代码的直观线性视图丢失了,因为中间的东西将在不同的方法中,而不是放在初步和最终的东西之间,我认为这更合乎逻辑。


根据要求,更多代码:

0 投票
2 回答
1800 浏览

python - sh.cd 使用上下文管理器

这是我基本上想做的事情:

我收到以下错误

我在这里想念什么?是否有替代解决方案可以在上下文中更改目录?

0 投票
1 回答
721 浏览

python - 使用 urllib.request.urlopen 发出请求时,使用 contextlib.closure 是否有优势?

为了说明我的问题,这是一个不使用的基本请求contextlib

并且使用相同的请求contextlib

据我所知,这两个请求具有相同的结果:检索数据,请求在代码块完成后自动关闭,并且raw_data即使在请求关闭后也可以访问。那么,当使用 发出请求时urllib.request.urlopen,使用有优势contextlib.closing还是多余?一种方法是否更 Pythonic 和/或更常见?