我用google搜索了calling __enter__ manually
但沒有運氣。因此,讓我們假設我有MySQL連接器類,它使用__enter__
和__exit__
函數(最初與with
語句一起使用)連接/從數據庫斷開連接。手動調用__enter__和__exit__
而且讓我們有一個使用其中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沒有對此發出任何警告,也沒有發現任何有關它的文章(谷歌鏈接在開始)。
而關於調用什麼:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
這是一個好/壞的做法?爲什麼?
我會說其優良的,看到的[我們都同意的成年人在這裏(https://mail.python.org/pipermail/tutor/2003-October/025932.html),或者你可以使用類似[ExitStack](https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack),它會爲你打電話。 – matsjoyce 2014-10-29 16:31:11
無論如何,在with語句中都會調用\ _ \ _ exit \ _ \ _方法,而手動調用這些方法時不會這樣。 – XORcist 2014-10-29 16:35:04
@XORcist我已經添加了示例用法示例...在提供的案例中(我相信)您必須手動調用它。 – Vyktor 2014-10-29 16:38:39