Ваша сопрограмма выходит после первой отправки / выхода.Это генерирует StopIteration
, и вы не можете обработать его в самой сопрограмме, но только при вызове send
.Из документов:
Метод send () возвращает следующее значение, полученное генератором, или вызывает StopIteration, если генератор выходит без выдачи другого значения.
@coroutine
def putd(di):
print("via coroutines adding a key : value to dictionary")
try:
item = yield
for key, value in item.items():
if key in di:
print("Key : {0} already exists".format(key))
else:
di[key] = value
print(di)
except StopIteration :
print("yield frame got closed")
# here is an implicit return None which terminates the coroutine
Полагаю, вы хотите, чтобы сопрограмма оставалась в живых, принимая столько посылок, сколько вы хотите, до явного закрытия :
@coroutine
def putd(di):
print("via coroutines adding a key : value to dictionary")
try:
while True:
item = yield
for key, value in item.items():
if key in di:
print("Key : {0} already exists".format(key))
else:
di[key] = value
print(di)
except GeneratorExit:
print("yield frame got closed")
Обратите внимание, что теперь исключение GeneratorExit
перехвачено.