I've googled calling __enter__ manually
but with no luck. So let's imagine I have MySQL connector class that uses __enter__
and __exit__
functions (originally used with with
statement) to connect/disconnect from a database.
And let's have a class that uses 2 of these connections (for example for data sync). Note: this is not my real-life scenario, but it seems to be the simplest example.
Easiest way to make it all work together is class like this:
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: Is it okay (is there anything wrong) to call __enter__
/__exit__
manually like this?
Pylint 1.1.0 didn't issue any warnings on this, nor have I found any article about it (google link in the beggining).
And what about calling:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
Is this a good/bad practice? Why?