Я бы сказал atexit
или попытался бы проверить, можно ли изменить код, чтобы он мог быть выражен с помощью with_statement
, который по умолчанию равен __future__
в 2.5 и в 2.6. 2.5 включает в себя модуль contextlib для упрощения. Я сделал что-то подобное при использовании Canonical's Storm ORM.
из future import with_statement
@contextlib.contextmanager
def start_transaction(db):
db.start()
yield
db.end()
with start_transaction(db) as transaction:
...
В случае не-db, вы можете просто зарегистрировать объекты, которые должны быть сброшены глобальными объектами, а затем использовать нечто подобное. Преимущество этого подхода состоит в том, что он сохраняет явные вещи.