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

python - 用语句包装多个函数的pythonic方法是什么

我正在使用 Python 库Fabric进行一些远程服务器维护。Fabric 自动输出对远程和本地命令的所有响应,除非您将命令包装在一对 with 语句中。像这样,在本地机器上,

或者在远程机器上这样:

我正在写一个漫长而复杂的任务,发现自己一遍又一遍地重复着这两个陈述。我想编写一个名为 _mute() 的函数来防止这种重复。它会让我做这样的事情:

我研究了一些解决方案,并且知道“eval”可以为我做到这一点。但是我读到的关于 eval 的每一页都表明,由于安全问题,它几乎总是一个坏主意。我研究了部分,但我不知道如何在我的 _mute 函数中创建一个可调用的参数。我猜这里缺少一个更高级别的 Python 概念。这样做的pythonic方法是什么?感谢您提供的任何方向。

0 投票
2 回答
2347 浏览

python - 在正文中的代码之前调用上下文管理器出口

我一直在尝试用 Python 制作自己的上下文管理器。我看到一些奇怪的行为很可能是由于我的实施。

我看到__exit__在“with”上下文中的语句之前调用的代码。例如,这里是代码片段:

这是个例外:

我将调试放入上下文管理器的所有__enter____exit__和 update 方法中。看起来像是__exit__在 update() 之前调用的。这没有任何意义,所以我必须遗漏一些简单的东西。

这是我的简单上下文管理器类:

0 投票
7 回答
21737 浏览

python - 在上下文管理器 __enter__() 中捕获异常

__exit__()即使有异常,是否可以确保调用该方法__enter__()

编辑

这是我能得到的最接近的...

事后看来,上下文管理器可能不是最好的设计决策

0 投票
1 回答
6242 浏览

python - 使用 threading.Lock 作为上下文管理器

线程模块的文档中它说:

该模块提供的所有具有acquire()release()方法的对象都可以用作with语句的上下文管理器。该acquire()方法将在进入块时release()调用,并在退出块时调用。

我想知道它是在阻塞模式还是非阻塞模式下调用的?

0 投票
1 回答
1140 浏览

python - 捕获上下文管理器期间发生的异常 - Python

可能重复:
使用带有 try-except 块的 python“with”语句

open用来在 Python 中打开一个文件。我将文件处理封装在一个with语句中,如下所示:

这样,即使抛出异常,我也可以确定我的文件已关闭。

但是,我想处理打开文件失败(OSError抛出一个)的情况。一种方法是将整个with块放在一个try:. 只要文件处理代码不抛出 OSError,它就可以工作。

它可能看起来像:

这当然行不通,而且真的很难看。有这样做的聪明方法吗?

谢谢

PS:我正在使用python 3.3

0 投票
1 回答
793 浏览

python - 使用 contextlib.contextmanager 继承

给定一个班级

你如何继承它?

0 投票
2 回答
3842 浏览

python - functools.wraps 不允许我用 Python 3 中的类包装函数

我想为一些将文件作为第一个参数的函数编写一个装饰器。装饰器必须实现上下文管理器协议(即将包装的函数变成上下文管理器),所以我想我需要用一个类来包装函数。

我对装饰器模式并没有真正的经验,并且以前从未实现过上下文管理器,但是我编写的内容适用于 Python 2.7,如果我注释掉该wraps行,它也适用于 Python 3.3。

取消注释该wraps行时出现的错误发生在内部update_wrapper

我知道文档并没有说我什至可以用functools.wraps这样的类来包装函数,但话又说回来,它只适用于 Python 2。有人可以解释一下这个回溯到底告诉我什么以及我应该做什么wraps在两个版本的Python上实现效果?


编辑:我错了。上面的代码没有做我想要的。我希望能够在没有 with的情况下使用该函数,例如内置函数open

上面的代码将修饰函数转换为上下文管理器。我希望能够做到:

所以我的代码版本应该大概如下所示:

随意评论我忽略的任何事情。

注意:JF Sebastian 的课程版本似乎可以工作:

我基本上wraps从课堂上删除了并改为return CManager

0 投票
2 回答
11276 浏览

python - 依赖 python 的 with...as 语句是一种好习惯吗

我很好奇依赖 python 的 with...as 语句是否被认为是安全或良好的做法。例如打开文件时:

所以在这个例子中我忽略了显式调用myFile.close()但是我可以假设它是在 python通过调用 objects方法退出with...as语句时调用的。__exit__()依赖这个是好的做法/安全吗,还是总是明确地调用会更好file.close()

0 投票
4 回答
10341 浏览

python - 带线程的 Python 超时上下文管理器

我有timeout上下文管理器,它与信号完美配合,但它在多线程模式下引发错误,因为信号只在主线程中工作。

我见过装饰器实现,timeout但我不知道如何yield在派生自threading.Thread. 我的变种不起作用。

0 投票
3 回答
7488 浏览

python - 如何使用上下文管理器避免在python中使用__del__?

众所周知,python__del__方法不应该用于清理重要的东西,因为不能保证调用此方法。另一种方法是使用上下文管理器,如几个线程中所述。

但是我不太明白如何重写一个类来使用上下文管理器。详细地说,我有一个简单的(非工作)示例,其中包装类打开和关闭设备,并且在类的实例超出其范围(异常等)的任何情况下都应关闭设备。

第一个文件mydevice.py是用于打开和关闭设备的标准包装类:

这个类被另一个类使用myclass.py

我的问题:当我在mydevice.pywith__enter____exit__方法中实现上下文管理器时,如何处理这个类myclass.py?我需要做类似的事情

但是如何处理呢?也许我忽略了一些重要的事情?或者我可以只在函数中使用上下文管理器,而不是作为类范围内的变量吗?