要不要使用上下文管理器?

To use context manager or not?

我在 Python 中从头开始设计一个关系数据库,对数据库的操作涉及很多文件操作。我目前正在做的是在初始化期间以 r+ 模式打开文件,并在关机期间关闭它们,就像这样-

class Table:
    def __init__(self,loc):
        self.file=open(loc,"r+")
    def insert(self,key,value):
        self.file.write((key,value))
        self.file.flush()
        os.fsync()
    def __close__(self):
        self.file.close()

另一种方法是在每次调用插入时使用上下文管理器打开文件,但我认为这会降低效率。 给定上下文,首选的做事方式是什么?

实例 使用 with 块,然后用户可以在基础文件打开时进行多次调用,同时仍确保正确清理。您可以通过使 class 成为上下文管理器来做到这一点。为了方便起见,您可能还想提供一个显式的关闭方法;遵循惯例并将其命名为 close,而不是 __close__(因为没有任何特殊的 dunder 方法具有该名称)。

类似于:

class Table:
    def __init__(self, loc):
        self.file = open(loc, "r+")
    def insert(self, key, value):
        self.file.write((key, value))
        self.file.flush()
        os.fsync(self.file.fileno())
    def close(self):
        self.file.close()
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        self.close()

现在您可以执行以下操作:

with Table('foo/bar/baz.db') as t:
    for i, j in my_data:
        t.insert(i, j)