Я googled calling __enter__ manually
, но не повезло. Поэтому представьте себе, что у меня есть класс соединителей MySQL, который использует функции __enter__
и __exit__
(первоначально используемые с оператором with
) для подключения/отключения от базы данных.
И пусть у вас есть класс, который использует 2 из этих соединений (например, для синхронизации данных). Примечание: это не мой реальный сценарий, но это, пожалуй, самый простой пример.
Самый простой способ заставить все работать вместе - это класс:
class DataSync(object):
def __init__(self):
self.master_connection = MySQLConnection(param_set_1)
self.slave_connection = MySQLConnection(param_set_2)
def __enter__(self):
self.master_connection.__enter__()
self.slave_connection.__enter__()
return self
def __exit__(self, exc_type, exc, traceback):
self.master_connection.__exit__(exc_type, exc, traceback)
self.slave_connection.__exit__(exc_type, exc, traceback)
# Some real operation functions
# Simple usage example
with DataSync() as sync:
records = sync.master_connection.fetch_records()
sync.slave_connection.push_records(records)
Q: нормально ли (что-то не так), чтобы вызвать __enter__
/__exit__
вручную, как это?
Pylint 1.1.0 не выдавал никаких предупреждений об этом, и я не нашел статьи об этом (ссылка google в начале).
А как насчет вызова:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
Это хорошая/плохая практика? Почему?