Использовать контекстный менеджер или нет? - PullRequest
0 голосов
/ 30 мая 2020

Я проектирую реляционную базу данных с нуля в 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()

Альтернативный способ сделать это - открывать файл при каждом вызове для вставки используя диспетчер контекста, но я предполагаю, что это убьет эффективность. Каким будет предпочтительный способ действий с учетом контекста?

1 Ответ

1 голос
/ 30 мая 2020

Используйте блок with для экземпляра , и тогда пользователь может иметь несколько вызовов, пока базовый файл открыт, при этом обеспечивая надлежащую очистку. Вы можете сделать это, сделав класс диспетчером контекста. Для удобства вы также можете предложить явный метод закрытия; следуйте соглашению и назовите его 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()
    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)
...