Python 如何在with语句中有多个虚拟文件编写器?

Python 如何在with语句中有多个虚拟文件编写器?,python,iterator,with-statement,Python,Iterator,With Statement,我听说你可以用一个虚拟文件编写器。但是,我希望在with语句上下文中打开多个虚拟文件编写器 假设我创建两个虚拟文件:触摸a和触摸b 鉴于脚本的第一部分: #!/usr/bin/python from contextlib import contextmanager # File names fa="a" fb="b" # Dummy file handler none_context = contextmanager(lambda: iter([None]))() 此添加与单个虚拟文件编

我听说你可以用一个虚拟文件编写器。但是,我希望在with语句上下文中打开多个虚拟文件编写器

假设我创建两个虚拟文件:
触摸a
触摸b

鉴于脚本的第一部分:

#!/usr/bin/python

from contextlib import contextmanager

# File names
fa="a"
fb="b"

# Dummy file handler
none_context = contextmanager(lambda: iter([None]))()
此添加与单个虚拟文件编写器一起工作(它打印
2
):

这也是可行的,因为我们确实在读取文件(它打印
1
):

但是,如果我们使用两个虚拟文件编写器,它将不起作用:

printing=False
with (open(fa, "r") if printing else none_context) as writter, \
    (open(fb, "r") if printing else none_context) as another_writter:
    print 1 if printing else 2
它显示了错误:

Traceback (most recent call last):
  File "dummy_opener.py", line 23, in <module>
    with (open(fa, "r") if printing else none_context) as writter, \
  File "/usr/lib64/python2.7/contextlib.py", line 19, in __enter__
    raise RuntimeError("generator didn't yield")
RuntimeError: generator didn't yield
回溯(最近一次呼叫最后一次):
文件“dummy_opener.py”,第23行,在
以(open(fa,r)如果打印其他无上下文)作为写入程序\
文件“/usr/lib64/python2.7/contextlib.py”,第19行,输入__
raise RUNTIMERROR(“生成器未屈服”)
运行时错误:生成器未生成

为什么会这样?还有:我如何才能使这个带有open命令的多个
与虚拟文件编写器一起工作?

您的代码失败,因为您在第一次调用时已经使用了迭代器,如果您在块中调用
none\u context()
,则原始代码可以工作:

none_context = contextmanager(lambda: iter([None]))
printing=False

with open(fa, "r") if printing else none_context() as writter, \
    open(fb, "r") if printing else none_context() as another_writter:
    print 1 if printing else 2
您可以使用原始代码看到,如果为每个打开项添加
None
,则代码将按预期工作:

none_context = contextmanager(lambda: iter([None,None,None]))()
printing=False

with open(fa, "r") if printing else none_context as writter, \
    open(fb, "r") if printing else none_context as another_writter,\
    open(fb, "r") if printing else none_context as another_writer3:
    print 1 if printing else 2

您是否尝试过注释中的“更健壮”版本(
def none_context(a=none):return contextmanager(lambda:[a]中x的x)(
)?@jornsharpe它可以工作,谢谢!不过,我仍然想知道为什么我的方法不起作用。
none_context = contextmanager(lambda: iter([None]))
printing=False

with open(fa, "r") if printing else none_context() as writter, \
    open(fb, "r") if printing else none_context() as another_writter:
    print 1 if printing else 2
none_context = contextmanager(lambda: iter([None,None,None]))()
printing=False

with open(fa, "r") if printing else none_context as writter, \
    open(fb, "r") if printing else none_context as another_writter,\
    open(fb, "r") if printing else none_context as another_writer3:
    print 1 if printing else 2