[英]Python: Coroutines - StopIteration exception
我正在尝试使用.send()
来喂字典。 我的代码段如下
def coroutine(func):
def start(*args, **kwargs):
cr = func(*args, **kwargs)
next(cr)
return cr
return start
@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")
di = {}
gobj = putd(di)
gobj.send({"plan" : "shuttle"})
gobj.close()
而且我相信我可以正确处理该exception
,但是仍然遇到StopIteration
异常。
scratch.py
Traceback (most recent call last):
via coroutines adding a key : value to dictionary
{'plan': 'shuttle'}
File "scratch.py", line 39, in <module>
gobj.send({"plan" : "shuttle"})
StopIteration
Process finished with exit code 1
我是否无法正确处理该异常,还是缺少某些内容? 非常感谢您的帮助。
您的协程在首次发送/屈服后退出。 这会生成一个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
异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.