2015-10-23 2 views
1

Я создаю соединение с базой данных в методе класса __init__ класса Python и хочу убедиться, что соединение закрыто при уничтожении объекта.
Похоже, я могу сделать это в __del__() или сделать класс менеджером контекста и закрыть соединение в __exit__(). Интересно, какой из них более Pythonic.Каков предпочтительный способ закрыть соединение psycopg2, используемое объектом Python?

ответ

1

Похоже, что я могу сделать это в __del__() или сделать класс менеджер контекста и закрыть соединение в __exit__(). Интересно, какой из них более Pythonic.

Я не буду комментировать то, что больше «вещий», так что это весьма субъективный вопрос.

Однако Python не дает очень строгих гарантий при вызове деструктора, что делает контекст/__exit__ подходящим здесь.

+1

Я также использую контекстных менеджеров для этого. Он работает хорошо, но для этого нужно было убедиться, что все мои соединения вызываются через диспетчер контекста, иначе вы их не освободите. Может быть, использовать \ __ exit__ ** и ** \ __ del__? Я этого не делал - написал код для проверки стека и создания исключения, если он не был вызовом менеджера контекста. –

+1

просто не устанавливают соединение вне метода '__enter__'. Задача решена. –

+0

ах, ах. умная. Я посмотрю, если я реорганизую свой код, чтобы сделать это. В противном случае да, контекстные менеджеры классные. Ах, еще одна вещь, они накладывают определенные ограничения на жизненные циклы экземпляра - мои подключения начинаются с представлений django и заканчиваются при отправке ответа. Мне пришлось реорганизовать другие классы, которые, как правило, поддерживали соединения db и вместо этого передавали соединение в качестве параметров для своих методов. –

Смежные вопросы