Ho cercato su google calling __enter__ manually
ma senza fortuna. Immaginiamo quindi di avere classe di connessione MySQL che utilizza le funzioni __enter__
e __exit__
(originariamente utilizzate con l'istruzione with
) per connettersi/disconnettersi da un database.Chiamare manualmente __enter__ e __exit__
E abbiamo una classe che utilizza 2 di queste connessioni (ad esempio per la sincronizzazione dei dati). Nota: questo non è il mio scenario reale, ma sembra essere l'esempio più semplice.
modo più semplice per far funzionare il tutto insieme è classe come questa:
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: Va bene (è qualcosa che non va) per chiamare __enter__
/__exit__
manualmente come questo?
Pylint 1.1.0 non ha pubblicato alcun avviso, né ho trovato alcun articolo a riguardo (link di Google all'inizio).
E che dire di chiamata:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
questa è una buona/cattiva pratica? Perché?
Direi che va bene, vedi come [siamo tutti adulti consenzienti qui] (https://mail.python.org/pipermail/tutor/2003-October/025932.html), oppure potresti usare qualcosa come [ExitStack] (https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack), che eseguirà la chiamata per te. – matsjoyce
Il metodo \ _ \ _ exit \ _ \ _ verrà chiamato comunque con l'istruzione with, non così quando si chiamano questi metodi manualmente, afaik. – XORcist
@XORcist Ho aggiunto un esempio di utilizzo di esempio ... Nel caso previsto (credo) devi chiamarlo manualmente. – Vyktor