Обходной путь для урожайности Python 2.4 не допускается в блоке Try с пунктом, наконец,

StackOverflow https://stackoverflow.com/questions/2339358

Вопрос

Я застрял на Python2.4, поэтому я не могу использовать пункт, наконец, с генераторами или yield. Анкет Есть ли способ обойти это?

Я не могу найти никаких упоминаний о том, как обойти это ограничение в Python 2.4, и я не большой поклонник обходных путей, о которых я думал (в основном с участием __del__ И попытка убедиться, что он работает в разумное время), не очень привлекательно.

Это было полезно?

Решение

Вы можете дублировать код, чтобы избежать блока, наконец,:

try:
  yield 42
finally:
  do_something()

Становится:

try:
  yield 42
except:  # bare except, catches *anything*
  do_something()
  raise  # re-raise same exception
do_something()

(Я не пробовал это на Python 2.4, вам, возможно, придется посмотреть на sys.exc_info вместо повторно утверждение выше, как в raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2].)

Другие советы

Единственный код, который гарантированно будет вызван, когда экземпляр генератора просто заброшен (собирается мусор), - это __del__ Методы его локальных переменных (если нет ссылок на эти объекты снаружи) и обратные вызовы для слабых ссылок на его локальные переменные (то же самое). Я рекомендую слабый справочный маршрут, потому что он неинвазивный (вам не нужен специальный класс с __del__ - Просто все, что слабо ссылается). Например:

import weakref

def gen():
  x = set()
  def finis(*_):
    print 'finis!'
  y = weakref.ref(x, finis)
  for i in range(99):
    yield i

for i in gen():
  if i>5: break

это печатает finis!, по желанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top