2016-03-06 22 views
2

給出一個簡單的發電機:如果調用者對其調用close(),生成器是否可以注意到?

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

它可以用於像:

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

當我在StopIteration例外,對發電機進行close(),所有後續調用next結果。

>>> 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") 
+0

關閉我的頭頂 - 我認爲'gen.close( )''有效''gen.throw(GeneratorExit)'......一段時間沒有必要考慮它 - 或者我可能正在考慮一個PEP - 呃... –

+0

是的,它是'GeneratorExit' - [ RTFM](https://www.python.org/dev/peps/pep-0342/)。 – jonrsharpe

+1

@jonrsharpe謝天謝地 - 我現在還沒有完全老年化:p –

回答

1

由於喬恩在評論中提到,calling close() raises a GeneratorExit 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 
+0

有趣...沒有內部嘗試除了塊,沒有例外....請添加鏈接到其他讀者的Python手冊。謝謝。 – Paebbels

+0

@Paebbels這是因爲它是捕捉異常的發生器工作的一部分(事實上,如果你抓住它並且不重新'喚醒'它會抱怨)。 – jonrsharpe

相關問題