python - 如何在 Python 中将信息与生成器的结尾一起传递?引发 StopIteration(myobj) 未被捕获
问题描述
对于生成器耗尽后返回最终信息的问题,我找到了一个优雅的解决方案,即将所需的内容放入 StopIteration 中。这需要在生成器函数结束时手动引发异常。
但是,似乎不可能从外面抓到。它工作的唯一方法是使用自定义异常,这会破坏对返回值不感兴趣的任何人的生成器协议(for
例如在语句中)。
def generator():
for i in range(3):
print('inside', i)
yield i
print('raising...')
raise StopIteration('<<Some accumulated result.>>')
p = generator()
try:
while True:
print('\n Trying...')
print('outside', next(p))
except StopIteration as e:
print('handling', e.arg
输出:
Trying...
inside 0
outside 0
Trying...
inside 1
outside 1
Trying...
inside 2
outside 2
Trying...
raising...
RuntimeError: generator raised StopIteration
预期输出:
Trying...
inside 0
outside 0
Trying...
inside 1
outside 1
Trying...
inside 2
outside 2
Trying...
raising...
handling ('<<Some accumulated result.>>')
解决方案
实际上,生成器返回值似乎默认放在异常中:
def generator():
for i in range(3):
print('inside', i)
yield i
print('raising...')
return '<<Some accumulated result.>>'
p = generator()
try:
while True:
print('\n Trying...')
print('outside', next(p))
except StopIteration as e:
print('handling', e.args)
输出:
Trying...
inside 0
outside 0
Trying...
inside 1
outside 1
Trying...
inside 2
outside 2
Trying...
raising...
handling ('<<Some accumulated result.>>')
推荐阅读
- python - 在我的 If 语句中,变量不会重置为 0
- python - 在 Python 中改进饼图图形
- html - 导航栏颜色不是全宽
- bootstrap-4 - 带有非流体容器的 Bootstrap 侧边栏
- http - CORS:简单请求的目的是什么?
- html - 为什么 PowerShell 将包含 # 的 HTML 视为注释?
- bash - 进入目录时如何确保使用了同名的自定义工具?
- docker - Docker - Golang 找不到包
- r - 如何将每个数据框放入列表中的每个对应子列表中
- java - 下载 adview 后,Android Studio 中的 Manifest Merger 失败