Единственный код, который гарантированно вызывается, когда экземпляр генератора просто отбрасывается (сборщик мусора), это методы __del__
для его локальных переменных (если не существует ссылок на эти объекты снаружи) и обратные вызовы для слабых ссылок на его локальные переменные (то же самое). Я рекомендую слабый эталонный маршрут, потому что он неинвазивен (вам не нужен специальный класс с __del__
- просто все, что слабо ссылочно). E.g.:
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!
, по желанию.