我在谷歌上搜索了^{__enter__
和__exit__
函数(最初与with
语句一起使用)来连接/断开与数据库的连接。
让我们有一个使用其中两个连接的类(例如用于数据同步)。注意:这不是我的真实场景,但它似乎是最简单的例子。
最简单的方法是这样上课:
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对此没有发出任何警告,我也没有找到任何关于它的文章(Begging中的google链接)。
打个电话怎么样:
try:
# Db query
except MySQL.ServerDisconnectedException:
self.master_connection.__exit__(None, None, None)
self.master_connection.__enter__()
# Retry
这是好的/坏的做法吗?为什么?
你的第一个例子不是个好主意:
如果
slave_connection.__enter__
引发异常会发生什么情况:master_connection
获取其资源slave_connection
失败DataSync.__enter__
提出异常DataSync.__exit__
不运行master_connection
从未清理过!如果
master_connection.__exit__
抛出异常会发生什么?DataSync.__exit__
提前完成slave_connection
从未清理过!contextlib.ExitStack
可以帮助您:问同样的问题:
如果
slave_connection.__enter__
引发异常会发生什么情况:stack
清除master_connection
如果
master_connection.__exit__
抛出异常会发生什么?slave_connection
在调用之前被清除好吧,如果
slave_connection.__exit__
抛出异常会怎么样?ExitStack
确保调用master_connection.__exit__
无论从属连接发生什么情况直接调用
__enter__
没有问题,但是如果需要在多个对象上调用它,请确保正确清理!我只响应头,即从IPython提示符调用
__enter__
和__exit__
。你可以这样做:注意:当对基础方法
__enter__
和__exit__
有多个调用时,此答案不能正确解释可能的失败。看到埃里克的答案,就知道他是谁。不,这没什么问题。甚至在标准库中也有这样做的地方。就像^{} module :
或者^{} module :
标准库示例不会为两个对象调用
__enter__
/__exit__
,但是如果您有一个对象负责为多个对象而不是一个对象创建/销毁上下文,那么为所有对象调用__enter__
/__exit__
就可以了。唯一可能的问题是正确地处理对您正在管理的对象的
__enter__
__exit__
调用的返回值。对于__enter__
,您需要确保返回的是包装器对象的用户从with ... as <state>:
调用返回所需的state
。对于__exit__
,您需要决定是传播上下文中发生的任何异常(通过返回False
),还是抑制它(通过返回True
)。您的托管对象可以尝试以任何一种方式执行此操作,您需要决定包装器对象的意义。相关问题 更多 >
编程相关推荐