Несмотря на интерфейс, напоминающий словари, файлы DBM в действительности отображаются в один или более внешних файлов. Например, при использовании интерфейса dbm в Python 3.1 для Windows создаются два файла — movie.dir и movie.dat — когда создается файл DBM с именем movie, а при последующих операциях открытия создается еще файл movie.bak. Если Python имеет доступ к другому базовому интерфейсу файлов с доступом по ключу, на компьютере могут появиться другие внешние файлы.
Технически модуль dbm является интерфейсом к той файловой системе типа DBM, которая имеется в Python.
• При открытии существующего файла DBM модуль dbm пытается определить создавшую его систему с помощью функции dbm.whichdb. Вывод делается на основе содержимого самой базы данных.
• При создании нового файла dbm пытается загрузить интерфейсы доступа к файлам по ключу в строго определенном порядке. Согласно документации он пытается загрузить интерфейс dbm.bsd, dbm.gnu, dbm.ndbm или dbm.dumb и использовать первый, который будет благополучно загружен. При их отсутствии Python автоматически использует универсальную реализацию с именем dbm.dumb, которая, в действительности, конечно же не является «тупой» («dumb»), но не отличается такой производительностью и надежностью, как другие реализации.
В будущих версиях Python этот порядок выбора реализации может измениться, и могут даже появиться дополнительные альтернативы. Однако обычно о таких вещах не приходится беспокоиться, если не удалять файлы, которые создает ваша система DBM, или не перемещать их между компьютерами с различными конфигурациями. Если вас волнует проблема пере но си мо сти файлов DBM (как будет показано дальше, то же самое относится к файлам хранилищ shelve), вам необходимо позаботиться о настройке компьютеров, чтобы на них были установлены одни и те же интерфейсы DBM, или положиться на интерфейс dumb. Например, пакет поддержки Berkeley DB (он же bsddb), используемый интерфейсом dbm.bsd, достаточно широко распространен и обладает высокой степенью переносимости.
Обратите внимание, что файлы DBM иногда требуется закрывать явно, в формате, приведенном в последней строке в табл. 17.1. Некоторые файлы DBM не требуют вызова метода закрытия, но другим он нужен, чтобы записать изменения из буфера на диск. В таких системах файл может оказаться поврежден, если не выполнить закрытие. К несчастью, используемая по умолчанию поддержка DBM в старых версиях Python для Windows, dbhash (она же bsddb), является как раз той системой DBM, которая требует вызова метода закрытия во избежание потери данных. Как правило, всегда следует закрывать файлы DBM явно после внесения изменений и перед выходом из программы, чтобы обойти возможные проблемы — по сути, это операция подтверждения изменений («commit»). Данное правило распространяется и на хранилища shelve, с которыми мы познакомимся далее в этой главе.
Последние изменения: Не забывайте также передавать строку ‘c’ во втором аргументе в вызов dbm.open, чтобы заставить интерпретатор создать файл, если он еще не существует. Прежде этот аргумент подразумевался по умолчанию, но теперь это не так. Аргумент ‘c’ не требуется передавать при открытии файлов-хранилищ, создаваемых модулем shelve, обсуждаемых далее, — для них по-прежнему по умолчанию используется режим ‘c’ «открыть или создать», если отсутствует аргумент, определяющий режим открытия. Модулю dbm можно передавать также другие строки, определяющие режим открытия, включая ‘n’, в котором всегда создается новый файл, и ‘r’, определяющий доступ к файлу только для чтения, — по умолчанию используется режим создания нового файла. За дополнительной информацией обращайтесь к руководству по стандартной библиотеке Python.Кроме того, в Python 3.X все элементы, ключи и значения сохраняются как строки bytes, а не str, как мы уже видели (что, как оказывается, удобно при работе с сериализованными объектами в хранилищах shelve, обсуждаемых ниже). В этой версии интерпретатора более не доступен компонент bsddb, бывший ранее стандартным, однако он доступен как независимое стороннее расширение, которое можно загрузить из Интернета, а при его отсутствии Python переходит на использование собственной реализации файлов DBM. Поскольку правила выбора базовой реализации DBM могут изменяться со временем, вы всегда должны обращаться за дополнительной информацией к руководствам по библиотеке Python, а также к исходному программному коду стандартного модуля dbm.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011