Użyłem go pod numerem calling __enter__ manually
, ale bez powodzenia. Wyobraźmy sobie, że mam klasę złączy MySQL , która używa funkcji __enter__
i __exit__
(pierwotnie używana z instrukcją with
) do łączenia/rozłączania z bazą danych.Wywołanie __enter__ i __exit__ ręcznie
I mamy klasę, która wykorzystuje 2 z tych połączeń (na przykład do synchronizacji danych). Uwaga: to nie jest mój prawdziwy scenariusz, ale wydaje się być najprostszym przykładem:.
Najprostszym sposobem, aby to wszystko działa razem jest klasa tak:
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: Czy to w porządku (jest coś nie w porządku), aby wywołać __enter__
/__exit__
ręcznie jak to?
Pylint 1.1.0 nie wydał żadnych ostrzeżeń na ten temat, ani nie znalazłem żadnego artykułu na ten temat (link google na początku).
A co dzwoni:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
Czy to dobry/zły praktyki? Czemu?
Powiedziałbym, że to dobrze, widzisz jako [wszyscy tutaj zgadzamy się na dorosłych] (https://mail.python.org/pipermail/tutor/2003-October/025932.html), lub możesz użyć czegoś podobnego [ExitStack] (https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack), który wykona zaproszenie dla ciebie. – matsjoyce
Metoda \ _ \ _ exit \ _ \ _ będzie wywoływana w instrukcji with w każdym razie, nie w przypadku ręcznego wywoływania tych metod, afaik. – XORcist
@XORcist Dodałem przykładowy przykład użycia ... W dostarczonym przypadku (uważam), musisz wywołać to ręcznie. – Vyktor