Я прочитал в этот ответ из Возможно ли иметь необязательный оператор with/as в python? что у вас может быть фиктивный модуль записи файлов с contextmanager
. Однако я хочу открыть несколько фиктивных модулей записи файлов в контексте оператора with.
Скажем, я создаю два фиктивных файла: touch a
и touch b
.
Учитывая первую часть скрипта:
#!/usr/bin/python
from contextlib import contextmanager
# File names
fa="a"
fb="b"
# Dummy file handler
none_context = contextmanager(lambda: iter([None]))()
Это дополнение работает с одним фиктивным модулем записи файлов (он печатает 2
):
printing=False
with (open(fa) if printing else none_context) as writter:
print 1 if printing else 2
Это также работает, потому что мы действительно читаем файлы (выводит 1
):
printing=True
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
Однако это не сработает, если мы используем два фиктивных средства записи файлов:
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
Почему это происходит? А также: как я могу заставить эти несколько команд with open
работать с фиктивным средством записи файлов?
def none_context(a=None): return contextmanager(lambda: (x for x in [a]))()
)? - person jonrsharpe   schedule 07.07.2015