问题标签 [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 回答
2317 浏览

python - 为什么我的 contextmanager-function 不像我在 python 中的 contextmanager 类那样工作?

在我的代码中,我需要能够正确打开和关闭设备,因此需要使用上下文管理器。虽然上下文管理器通常被定义为具有__enter____exit__方法的类,但似乎也有可能装饰一个函数以与上下文管理器一起使用(参见最近的一篇文章另一个很好的例子)。

在以下(工作)代码片段中,我实现了两种可能性;只需要将注释行与另一行交换:

我尝试的是运行代码并使用CTRL-C. 当我Wrap在上下文管理器中使用该类时,该__exit__方法按预期调用(在终端中打印文本“关闭”),但是当我使用该wrap函数尝试相同的操作时,文本“关闭”不会打印到终端。

我的问题:代码片段是否有问题,我是否遗漏了什么,或者为什么print("close")没有使用装饰函数调用该行?

0 投票
2 回答
8293 浏览

python - py.test - 如何在 funcarg/fixture 中使用上下文管理器

密切相关: 在 python 中,是否有在 setup/teardown 中使用上下文管理器的好习惯


我有一个上下文管理器,用于在测试中修复时间/时区。我想将它放在 pytest funcarg 中(或夹具,我们使用的是pytest2.2.3,但我可以向后翻译)。我可以这样做:

...但它有点恶心。在相关的 Q jsbueno中指出:问题是您的代码没有规定在__exit__发生异常时正确调用对象的方法。

他的回答使用了元类方法。但这对于 pytest 来说并不是那么有用,因为 pytest 通常测试只是函数,而不是类。那么解决这个问题的 pytest-y 方法是什么?涉及运行测试钩子的东西?

0 投票
3 回答
9832 浏览

python - 使用可变数量的上下文管理器替代 contextlib.nested

我们的代码根据运行时参数调用可变数量的上下文管理器:

但是,contextlib.nested自 Python 2.7 起已弃用

Python 'with' 语句中 Multiple variables的答案表明它contextlib.nested有一些“令人困惑的容易出错的怪癖”,但建议的使用 multiple-managerwith语句的替代方法不适用于可变数量的上下文管理器(并且还会破坏向后兼容性)。

是否有任何替代方案contextlib.nested不被弃用并且(最好)没有相同的错误?

还是我应该继续使用contextlib.nested并忽略警告?如果是这样,我是否应该计划contextlib.nested在将来的某个时间被删除?

0 投票
2 回答
113 浏览

python - 仅使用 for 循环遍历文件是否是一种好的形式?

我遇到了一些遍历文件中行的代码,如下所示:

这是一个更 Pythonic 的版本,例如:

它使用更少的缩进级别,所以看起来更好,但它是一样的吗?据我所知,with基本上添加了一个finally: f.close()或一些东西来确保在离开块后清理对象。当第一个for循环结束(或者被 a 缩短break)并且变量超出范围时,是否会发生同样的事情?我可以从第一段代码中得到提示并为自己节省一些击键,或者更确切地说,我应该修复它吗?

0 投票
1 回答
353 浏览

python - 如何嵌套任意数量的 Python 文件上下文管理器?

我想采用任意数量的路径来表示嵌套的 tar 档案,并对最里面的档案执行操作。麻烦的是,嵌套可以是任意的,所以我需要的上下文管理器的数量也是任意的。

举个例子:

我不能使用该with语句的嵌套语法,因为可以嵌套任意数量的级别。我不能使用contextlib.nested,因为文档在那里说:

...使用nested()打开两个文件是一个编程错误,因为如果在打开第二个文件时抛出异常,第一个文件将不会立即关闭。

有没有办法使用语言结构来做到这一点,还是我需要手动管理我自己的打开文件对象堆栈?

0 投票
1 回答
1443 浏览

python - Python中的多行带子句

如何将withPython 中的长子句分散到多行?现在,我有

我想遵循谷歌的 Python 风格指南,它禁止反斜杠继续。

0 投票
1 回答
460 浏览

python - With-Statement and Threading : 使函数在运行前执行

这个问题是以下问题的后续:With statement and python threading

我一直在尝试使用 python 线程 api。我有这段代码适用于我想要实现的目标:---->在调用 python 线程上运行之前执行函数。

但是要做到这一点,我总是要在run()方法中调用time.sleep(1),使其继续执行execute()。否则线程退出而没有函数分配和执行。有没有更好的方法来实现这种类型等待?

0 投票
1 回答
962 浏览

python - 发送到使用 contextlib.contextmanager 定义的上下文管理器

假设我有一个上下文管理器:

如何发送z到上下文管理器?

我试过:

但我得到了 StopIteration,这可能是因为send产量?

0 投票
3 回答
22387 浏览

python - 如何在 Python 中使用套接字作为上下文管理器?

似乎做这样的事情是很自然的:

但是 Python 没有为套接字实现上下文管理器。我可以轻松地将它用作上下文管理器吗?如果可以,如何使用?

0 投票
1 回答
243 浏览

python - 如何在 python 中使用上下文管理器

下面是一段假设的代码

在这种情况下,我希望当使用块 db.close()退出时,会调用 db 并将 db 标记为垃圾收集。

在工作中,我开始看到这段代码突然出现。

我不知道你是否应该像java中的new关键字一样使用with 。有人可以指导我找到任何可以解释使用 with 时可以/不应该/不应该做什么的好文档吗?

PS 日志消息实际上是那么蹩脚:-)