问题标签 [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 - 用语句包装多个函数的pythonic方法是什么
我正在使用 Python 库Fabric进行一些远程服务器维护。Fabric 自动输出对远程和本地命令的所有响应,除非您将命令包装在一对 with 语句中。像这样,在本地机器上,
或者在远程机器上这样:
我正在写一个漫长而复杂的任务,发现自己一遍又一遍地重复着这两个陈述。我想编写一个名为 _mute() 的函数来防止这种重复。它会让我做这样的事情:
我研究了一些解决方案,并且知道“eval”可以为我做到这一点。但是我读到的关于 eval 的每一页都表明,由于安全问题,它几乎总是一个坏主意。我研究了部分,但我不知道如何在我的 _mute 函数中创建一个可调用的参数。我猜这里缺少一个更高级别的 Python 概念。这样做的pythonic方法是什么?感谢您提供的任何方向。
python - 在正文中的代码之前调用上下文管理器出口
我一直在尝试用 Python 制作自己的上下文管理器。我看到一些奇怪的行为很可能是由于我的实施。
我看到__exit__
在“with”上下文中的语句之前调用的代码。例如,这里是代码片段:
这是个例外:
我将调试放入上下文管理器的所有__enter__
、__exit__
和 update 方法中。看起来像是__exit__
在 update() 之前调用的。这没有任何意义,所以我必须遗漏一些简单的东西。
这是我的简单上下文管理器类:
python - 在上下文管理器 __enter__() 中捕获异常
__exit__()
即使有异常,是否可以确保调用该方法__enter__()
?
编辑
这是我能得到的最接近的...
事后看来,上下文管理器可能不是最好的设计决策
python - 捕获上下文管理器期间发生的异常 - Python
我open
用来在 Python 中打开一个文件。我将文件处理封装在一个with
语句中,如下所示:
这样,即使抛出异常,我也可以确定我的文件已关闭。
但是,我想处理打开文件失败(OSError
抛出一个)的情况。一种方法是将整个with
块放在一个try:
. 只要文件处理代码不抛出 OSError,它就可以工作。
它可能看起来像:
这当然行不通,而且真的很难看。有这样做的聪明方法吗?
谢谢
PS:我正在使用python 3.3
python - 使用 contextlib.contextmanager 继承
给定一个班级
你如何继承它?
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
:
python - 依赖 python 的 with...as 语句是一种好习惯吗
我很好奇依赖 python 的 with...as 语句是否被认为是安全或良好的做法。例如打开文件时:
所以在这个例子中我忽略了显式调用myFile.close()
但是我可以假设它是在 python通过调用 objects方法退出with...as
语句时调用的。__exit__()
依赖这个是好的做法/安全吗,还是总是明确地调用会更好file.close()
python - 带线程的 Python 超时上下文管理器
我有timeout
上下文管理器,它与信号完美配合,但它在多线程模式下引发错误,因为信号只在主线程中工作。
我见过装饰器实现,timeout
但我不知道如何yield
在派生自threading.Thread
. 我的变种不起作用。
python - 如何使用上下文管理器避免在python中使用__del__?
众所周知,python__del__
方法不应该用于清理重要的东西,因为不能保证调用此方法。另一种方法是使用上下文管理器,如几个线程中所述。
但是我不太明白如何重写一个类来使用上下文管理器。详细地说,我有一个简单的(非工作)示例,其中包装类打开和关闭设备,并且在类的实例超出其范围(异常等)的任何情况下都应关闭设备。
第一个文件mydevice.py
是用于打开和关闭设备的标准包装类:
这个类被另一个类使用myclass.py
:
我的问题:当我在mydevice.py
with__enter__
和__exit__
方法中实现上下文管理器时,如何处理这个类myclass.py
?我需要做类似的事情
但是如何处理呢?也许我忽略了一些重要的事情?或者我可以只在函数中使用上下文管理器,而不是作为类范围内的变量吗?