Python 如何在with语句中有多个虚拟文件编写器?
我听说你可以用一个虚拟文件编写器。但是,我希望在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]))() 此添加与单个虚拟文件编
触摸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