如果调用者对生成器调用了close(),生成器会注意到吗?

2024-10-02 22:35:35 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个简单的生成器:

def myGenerator(max):
    for i in range(max):
        yield i

它的用法如下:

>>> gen = myGenerator(10)
>>> next(gen)
0
>>> next(gen)
1

当我在生成器上执行close()时,对next的所有后续调用都会导致StopIteration异常。你知道吗

>>> gen.close()
>>> next(gen)
StopIteration exception

发电机能注意到吗?yield不会引发异常。我在找这样的东西:

def myGenerator(max):
    for i in range(max):
        try:
            yield i
        except CloseIteration as ex:
            print("I got closed")

Tags: in用法forclosedefexceptionrangemax
1条回答
网友
1楼 · 发布于 2024-10-02 22:35:35

正如Jon在评论中提到的calling ^{} raises a ^{} exception,您可以关注:

In [1]: def mygenerator(max):
   ...:     try:
   ...:         for i in range(max):
   ...:             yield i
   ...:     except GeneratorExit:
   ...:         print('I got closed')
   ...:         raise
   ...:     

In [2]: gen = mygenerator(10)

In [3]: next(gen)
Out[3]: 0

In [4]: next(gen)
Out[4]: 1

In [5]: gen.close()
I got closed

相关问题 更多 >