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

python - 可以有条件地使用“with”语句吗?

我有一个大致如下结构的 Python 函数,它计算一些结果并将它们写入文件:

现在我并不总是想将结果写入文件 - 有时我只想计算它们并将它们返回。使“write_result”有条件很容易,但是还有一种方法可以使“with”语句中的文件创建依赖于条件吗?(我知道我可以明确地处理文件的打开和关闭,但我会产生创建“with”语句以避免的“try/finally”开销。)

有没有一个优雅的解决方案?

编辑添加: 我可能过于简化了这个例子。我没有写入任意文件,而是使用matplotlib.backends.backend_pdf.PdfPages链接),并在每一步中添加一个图(PDF 中的新页面)。特别是,这意味着我无法使用 重新打开 PDF 文件PdfPages,因为它会被覆盖。

0 投票
1 回答
364 浏览

python - python: sudo 上下文管理器?

有没有可能的方法来实现一个sudo上下文管理器,它使用 sudoers 系统作为另一个用户运行封闭范围?

我怀疑sudo(8)可执行文件在这里对我有帮助,但也许有一些我可以绑定的 C 级接口?


动机:我几乎可以将这个 shell 脚本完全移植到 python 中,甚至不需要任何子进程,除非我现在必须system('sudo sh -c "echo %i > /dev/thatfile"' % value). 如果可以的话,那就太优雅了with sudo(), open('/dev/thatfile', 'w') as thatfile: thatfile.write(str(value))

0 投票
0 回答
59 浏览

python - 上下文管理器中的上下文管理器

我有一个上下文管理器,S3TempFile它获取一个本地文件,将其上传到 s3,让您使用 s3 文件,并在退出时从 s3 中删除该文件。

我想创建另一个 , S3TempRecordsFile,它需要一个记录列表,对它们进行一些处理,输出到本地文件,将其上传到 s3,让您使用 s3 文件,并在退出时从 s3 和 on 中删除文件本地磁盘。

正如你所看到的,第二个做了一些额外的事情 S3TempFile。我想S3TempFile重用S3TempRecordsFile. 我该怎么做?我不能使用within 语句S3TempRecordsFile来创建一个S3TempFile实例,因为我们只想在退出S3TempRecordsFile上下文时退出那个实例。

0 投票
2 回答
118 浏览

python - 如何根据上下文管理器的参数省略代码块?

让我们看看这个例子:

有没有办法在基于参数的上下文管理器中执行代码块( ),例如:当 arg2 不为 False 时?print 'Executed'

0 投票
1 回答
80 浏览

python - 对 Python 中 try 和 with 的正确顺序感到困惑

我在这里读到,建议使用和(至少对于基本任务)with open(filename)而不是使用对,并且使用.open(filename)filename.close()try

Q1:如果我的理解是正确的,正确的顺序是什么?

或者

Q2:如果我还想插入一些代码来弹出文件处理错误的弹出窗口,哪种情况更好?(对于找不到文件或其他东西)

0 投票
2 回答
269 浏览

python - 如何使用'with'从上下文管理器中获取“结果”

我找到了一个文件锁定类的演示(这里:https ://groups.google.com/forum/#!topic/pug-pe/mQr7KX-cenU ),但我不太了解使用它的机制。

我相信这会说“如果传入的文件不存在,请打开它。完成后,将其删除。

演示的用途是:

它工作正常 - 如果我在看到“我在这里,我正在睡觉 10 秒......”时运行脚本,如果我在那 10 秒内再次运行它,我会看到“一次只能运行一个脚本. 脚本被 /tmp/my_script.lock 锁定”。然而,要使用文件锁,人们通常希望在做某事之前“等到获得锁”。但是,“sys.exit()”似乎阻止了这种情况。似乎我想以某种方式将'with'包装在一个while循环中?就像是:

但我不明白如何从 FileLock 获取返回值。有人可以解释如何做到这一点吗?

0 投票
4 回答
689 浏览

python - 可选重定向 I/O 的上下文管理器

我经常遇到这样的情况,即根据某些命令行参数,输入可能来自文件或标准输入。输出也是如此。我真的很喜欢 python 3 中的上下文管理器的工作方式,因此尝试将我的所有open调用作为某些with语句的一部分。但在这种情况下,我遇到了麻烦。

已经很笨拙了,输入和输出我都必须满足四种组合。我想要一些更简单的东西,例如

python 标准库中是否有类似 DummyManager 的东西?实现上下文管理器协议但仅从其__enter__方法返回固定值的东西?我猜这样一个类最有可能的位置是contextlib,因为我在那里没有找到类似的东西,所以也许没有这样的东西。您可以建议其他优雅的解决方案吗?

0 投票
3 回答
221 浏览

python - python中的错误处理程序

我很难找到“pythonic”的方法来做到这一点:我需要用相同的try-except模式捕获不同的代码块。要捕获的块彼此不同。目前,我在代码的几个点中重复相同的try-except模式,并带有一长串异常。

有一个很好的方法可以使用with 语句上下文管理器装饰器来解决这个问题:

但是,如果我需要知道块中是否存在异常,会发生什么?即是否有任何替代方法可以为try-except-else做类似前面的 with block的事情?

一个用例示例:

我可以以pythonic的方式做类似的事情以避免一次又一次地重复相同的try-except模式吗?

0 投票
1 回答
596 浏览

python - 从父函数返回而不引发异常的上下文管理器

return上下文管理器可以在处理异常时导致它所在的功能吗?

我有 try-except 模式,这对我正在编写的几种方法很常见,我希望用上下文管理器将其干燥。如果存在Exception.

这是我当前实现的示例:

有没有办法干燥 try-except 以便任务处理函数SomeError在引发时返回?

注意:任务处理程序由库中的代码调用,该库不处理任务处理程序函数生成的异常。

这是一次尝试,但它会导致UnboundLocalError

是否可以使用上下文管理器来干燥这种模式,或者是否有替代方案?

0 投票
5 回答
3016 浏览

python - 在 Python 中临时更改变量的值

Python 3.4 提供了这个简洁的工具来临时重定向标准输出:

代码不是超级复杂,但我不想一遍又一遍地编写它,特别是因为一些想法已经进入它使其可重入:

我想知道是否有一种通用的方法可以使用该with语句来临时更改变量的值。sys来自aresys.stderr和的另外两个用例sys.excepthook

在一个完美的世界中,这样的事情会起作用:

我怀疑我们能否做到这一点,但也许这样的事情是可能的:

我可以通过扎根 in 来完成这项工作globals(),但没有人会选择使用它。

更新:虽然我认为我的“foo = 10”示例阐明了我想要做的事情,但它们并没有传达实际的用例。这里有两个:

  1. 重定向stderr,很像redirect_stdout
  2. 临时更改 sys.excepthook。我以交互方式进行了大量开发,当我向异常钩子添加一些东西时(通过将原始函数包装在我自己的一个函数中,例如,使用日志记录模块记录异常),我通常希望它在某个时候被删除。这样我就不会有越来越多的包装自己的函数副本。这个问题面临一个密切相关的问题。