要不要使用上下文管理器?
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)
我在 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)