Как определить, завершился ли цикл for с исключением или перерывом внутри итератора - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь выполнить очистку в своем генераторе, но только если тело цикла вызвало исключение, а не завершено с break:

def f():
  for v in [1,2,99,4]:
    try:
      yield v
    except GeneratorExit:
      # how to determine whether generator exited via an exception?
      print("generator exited")
      raise

Однако я не нашелспособ узнать разницу между break и exception внутри итератора.

Т.е. будет выведен следующий код

for v in f():
  if v == 99:
    break

:

generator exited

И этот код

for v in f():
  if v == 99:
    raise Exception("boom")

будетвывод:

 generator exited
 ---------------------------------------------------------------------------
 Exception: boom

Таким образом, снаружи генератора разница заметна, но я не могу найти способ наблюдать это внутри корпуса генератора f()

1 Ответ

0 голосов
/ 04 июня 2018

Может быть, это поможет?

def f():
    for v in [1,2,99,4]:
        try:
            if v == 99:
                raise Exception('Boom!')
            yield v
        except:
            print("generator exited")
        else:
            print("generator not exited")

for value in f():
    print(value)

===========================================================================

Возможно, я все еще неполучить проблему.В любом случае, вот моя вторая попытка:

import sys

class MyException(Exception):
    pass

def f():
    a = input('Break, except, loop, or quit (b/e/l/q)? ' ).strip().lower()
    if a == 'q':
        sys.exit()
    if a == 'l':
        pass    # just the normal loop
    for v in [1, 2, 99, 4]:
        if a == 'b':
            break
        try:
            if a == 'e':
                raise MyException
            yield v
        except MyException:
            print('Inside Generator: MyException')
            return
    else:
        print('Inside Generator: loop terminated!')
        return
    print('Inside Generator: break')

for value in f():
    print(value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...