gpt4 book ai didi

python - 使用列表理解在 Python 2.7 中使用多个 with 语句

转载 作者:行者123 更新时间:2023-11-28 22:34:37 25 4
gpt4 key购买 nike

问题:

我有兴趣在 Python 中内部做一个列表理解 with语句,这样我就可以用最少的语法同时打开多个上下文管理器。我正在寻找适用于 Python 2.7 的答案。

考虑以下代码示例。我想使用 with 同时对任意长列表中的变量进行声明,最好以语法清晰的方式进行。

def do_something(*args):
contexts = {}
with [open(arg) as contexts[str(i)] for i, arg in enumerate(args)]:
do_another_thing(contexts)

do_something("file1.txt", "file2.txt")

有谁知道是否有办法在 with 中包含列表理解? Python 2.7 中的声明?


类似问题的答案:

以下是我已经看过的一些内容,并解释了为什么它们不适合我的目的:

对于 Python 2.6-,我可以使用 contextlib.nested完成这个有点像:

def do_something(*args):
contexts = {}
with nested(*[open(arg) for arg in args]) as [contexts[str(i)] for i in range(len(args))]:
do_another_thing(contexts)

但是,这在 Python 2.7+ 中已被弃用,因此我认为使用它是一种不好的做法。

相反,新语法是在 this SO answer 上给出的,以及 this SO answer :

with A() as a, B() as b, C() as c:
doSomething(a,b,c)

但是,我需要能够处理任意输入列表,就像我上面给出的示例一样。这就是为什么我赞成列表理解。

对于 Python 3.3+this SO answer描述了如何使用 ExitStack 来实现这一点.但是,我正在使用 Python 2.7。

还有this solution ,但我宁愿不编写自己的类来完成此任务。

是否有希望将列表理解和 with 结合起来? Python 2.7 中的语句?

更新 1-3:更新示例以更好地强调我正在寻找的功能

更新 4:找到另一个 similar question 。这个有一个答案也暗示ExitStack , 2.7 中没有的功能。

最佳答案

自己做这件事真的很棘手,尤其是处理打开或关闭文件时发生的异常。我建议只获得像 contextlib2 这样的图书馆实现了 contextlib.ExitStack 功能。然后你可以做

with contextlib2.ExitStack() as stack:
files = [stack.enter_context(open(arg)) for arg in args]
...

就像您使用 Python 3 中的 contextlib.ExitStack 一样,一切都会为您正确处理。

关于python - 使用列表理解在 Python 2.7 中使用多个 with 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38834827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com