Calling __enter__ and __exit__ manually

17 浏览
0 Comments

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__()
    # 重试

这是好的/不好的做法?为什么?

0