Обходной путь для урожайности Python 2.4 не допускается в блоке Try с пунктом, наконец,
-
22-09-2019 - |
Вопрос
Я застрял на 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!
, по желанию.