dan*_*ast 4 python exception generator
我有这个发电机:
def gen():
rounds = 0
for x in xrange(10):
rounds += 1
yield x
print 'Generator finished (%d rounds)' % (rounds)
Run Code Online (Sandbox Code Playgroud)
如果我称之为正常:
for x in gen():
pass
Run Code Online (Sandbox Code Playgroud)
我得到了预期的:
Generator finished (10 rounds)
Run Code Online (Sandbox Code Playgroud)
但如果我打断发电机,我什么也得不到:
for x in gen():
break
Run Code Online (Sandbox Code Playgroud)
我想得到:
Generator interrupted (1 rounds)
Run Code Online (Sandbox Code Playgroud)
是否有可能在发电机本身检测到它已从外部中断?有什么Exception我能抓住来发现这个事件吗?
你不能,因为发电机的默认行为是要被打断所有的时间.每次生成一个值时,生成器都会不断暂停.
换句话说,您对生成器如何工作的理解是不正确的.发电机上的环路完全在发电机的控制之外; 所有它的任务是产生一个下一个值,取消代码取消,直到执行下一个yield表达式.
因此,当没有请求下一个值时,生成器暂停并且不能执行代码以"检测"它没有被要求获得另一个值.
调用生成器函数时会发生什么:
generator_object.next()都会调用..next()调用该方法时,将运行函数体,直到yield遇到表达式.函数体暂停,yield表达式的结果作为.next()方法的结果返回.您可以使用和方法在生成器函数中显式发送消息或引发异常,但是当不迭代生成器对象时,不会发送此类消息或异常.generator_object.send()generator_object.throw()
您可以寻找的一件事是GeneratorExit当生成器对象关闭时,生成器函数内部抛出的异常; 看generator_object.close()方法:
GeneratorExit在生成器功能暂停时提高a
当生成器对象被垃圾收集时(例如,没有任何引用它),该generator_object.close()方法被自动调用:
def gen():
rounds = 0
for x in xrange(10):
rounds += 1
try:
yield x
except GeneratorExit:
print 'Generator closed early after %d rounds' % rounds
raise
print 'Generator finished (%d rounds)' % rounds
Run Code Online (Sandbox Code Playgroud)
演示:
>>> def gen():
... rounds = 0
... for x in xrange(10):
... rounds += 1
... try:
... yield x
... except GeneratorExit:
... print 'Generator closed early after %d rounds' % rounds
... raise
... print 'Generator finished (%d rounds)' % rounds
...
>>> for i in gen():
... break
...
Generator closed early after 1 rounds
Run Code Online (Sandbox Code Playgroud)
这只能起作用,因为返回的生成器对象仅由for循环引用,并在for循环结束时获得.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |