例如,这里是非内联代码:
with x:
do(stuff)
我可以像这样在一行中完成:
with x: do(stuff)
但是我想知道是否有办法做这样的事情(内联):
a = [(lambda x: with x: do(stuff))(x) for x in someList]
编辑:
详细来说,假设我有一个对象列表,每个对象都有自己的上下文。这意味着 do(stuff) 与 with x 一起使用时会有不同的行为,上面的语句将遍历该列表中的每个对象,输入它们的上下文,运行 do (stuff),然后继续下一个。
因为我试过这样做是行不通的,我想知道是否有任何方法可以做到这一点,以及如何做到这一点。
上述代码的扩展版本看起来像这样(并且有效):
a = []
for x in someList:
with x: a.append( do(stuff) )
请您参考如下方法:
好吧,既然你对解决方法没问题,那么more-itertools.with_iter可能是您最好的选择。
注意:它是第 3 方软件包,因此如果您还没有安装它,则需要安装它
from more_itertools import with_iter
a = [do(stuff) for _ in with_iter(x)]
#your example lacks what do and x really are/do so this comprehension is inferred
如果您不想使用第 3 方包,那么所有 with_iter做的是:
def with_iter(context_manager):
with context_manager as iterable:
yield from iterable
所以这很容易自己实现。
