Calling __enter__ and __exit__ manually
Calling __enter__ and __exit__ manually
我已经谷歌了< a href="https://www.google.com/search?hl=en&ie=UTF-8&q=python%20calling%20__enter__()%20manually">calling __enter__ manually
,但没有找到相关内容。所以让我们假设我有一个使用__enter__
和__exit__
函数(最初用于with
语句)来连接/断开数据库的MySQL连接器类。
我们有一个使用这两个连接的类(例如用于数据同步)。注意:这不是我的真实场景,但它似乎是最简单的例子。
让它们一起工作的最简单的方法是创建一个这样的类:
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) # 一些真实操作函数 # 简单的使用示例 with DataSync() as sync: records = sync.master_connection.fetch_records() sync.slave_connection.push_records(records)
问题: 这样调用__enter__
/__exit__
是否可以(是否有什么问题)?
Pylint 1.1.0对此没有发出任何警告,我也没有找到任何关于此的文章(刚开始的谷歌链接)。
那么这样调用:
try: # 数据库查询 except MySQL.ServerDisconnectedException: self.master_connection.__exit__(None, None, None) self.master_connection.__enter__() # 重试
这是好的/不好的做法?为什么?