Документация Python неофициальный перевод

shelve.md

211 строк · 12.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.0/library/shelve.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `shelve` – сохранение объектов Python89«Полка» (shelf) – это постоянный объект, похожий на словарь. Отличие от баз данных «dbm» в том, что значения (не ключи!) в полке могут быть практически произвольными объектами Python – всем, что поддерживает модуль [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle). Сюда входят большинство экземпляров классов, рекурсивные типы данных и объекты, содержащие множество общих подобъектов. Ключи – обычные строки.1011#### `[shelve.open]shelve.open(filename[, flag='c'[, protocol=None[, writeback=False]]])`1213Открывает постоянный словарь. Указанное имя файла является базовым именем для базового файла базы данных. Как побочный эффект, к имени файла может быть добавлено расширение и может быть создано более одного файла. По умолчанию базовый файл базы данных открывается для чтения и записи. Необязательный параметр *flag* имеет ту же интерпретацию, что и параметр *flag* в функции [`dbm.open()`](https://python-all.ru/3.0/library/dbm.html#dbm.open).1415По умолчанию для сериализации значений используются pickle версии 3. Версию протокола pickle можно указать с помощью параметра *протокол*.1617По умолчанию изменения изменяемых записей постоянного словаря не сохраняются автоматически. Если необязательный параметр *writeback* установлен в *True*, все записи, к которым обращались, кешируются в памяти и записываются обратно при закрытии; это может упростить изменение изменяемых записей в постоянном словаре, но если обращаться к большому количеству записей, это может потреблять огромные объёмы памяти для кеша, а также сделать операцию закрытия очень медленной, поскольку все записи, к которым обращались, записываются обратно (нет способа определить, какие из этих записей изменяемые и какие были действительно изменены).1819Объекты Shelve поддерживают все методы, поддерживаемые словарями. Это облегчает переход от скриптов, основанных на словарях, к тем, что требуют постоянного хранения.2021Поддерживается один дополнительный метод:2223#### `[shelve.Shelf.sync]Shelf.sync()`2425Записывает обратно все записи из кеша, если словарь был открыт с2627*writeback*2829, установленным в3031*True*3233. Также очищает кеш и синхронизирует постоянный словарь на диске, если это возможно. Этот метод вызывается автоматически при закрытии словаря с помощью3435`close()`3637.3839## Ограничения4041>4243- Выбор того, какой пакет базы данных будет использоваться (например, [`dbm.ndbm`](https://python-all.ru/3.0/library/dbm.html#module-dbm.ndbm) или [`dbm.gnu`](https://python-all.ru/3.0/library/dbm.html#module-dbm.gnu)), зависит от того, какой интерфейс доступен. Поэтому небезопасно открывать базу данных напрямую с помощью [`dbm`](https://python-all.ru/3.0/library/dbm.html#module-dbm). Кроме того, база данных, к сожалению, подвержена ограничениям [`dbm`](https://python-all.ru/3.0/library/dbm.html#module-dbm), если она используется – это означает, что (сериализованное (pickle) представление) объектов, хранящихся в базе данных, должно быть достаточно маленьким, и в редких случаях коллизии ключей могут привести к тому, что база данных откажется обновляться.44- В зависимости от реализации закрытие постоянного словаря может быть или не быть необходимым для сброса изменений на диск. Метод [`__del__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__del__) класса [`Shelf`](https://python-all.ru/3.0/library/shelve.html#shelve.Shelf) вызывает метод `close()`, поэтому программисту обычно не нужно делать это явно.45- Модуль `shelve` не поддерживает *параллельный* доступ на чтение и запись к сохранённым объектам. (Одновременный доступ нескольких программ только на чтение безопасен.) Когда программа открыла хранилище для записи, никакая другая программа не должна открывать его для чтения или записи. Для решения этой проблемы можно использовать файловую блокировку Unix, но она различается в разных версиях Unix и требует знания используемой реализации базы данных.4647#### `[shelve.Shelf]class shelve.Shelf(dict[, protocol=None[, writeback=False]])`4849Подкласс `collections.MutableMapping`, который хранит сериализованные (pickled) значения в объекте *dict*.5051По умолчанию для сериализации значений используется версия 0 pickle. Версию протокола pickle можно указать через параметр *protocol*. См. документацию [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle) для обсуждения протоколов pickle.5253Если параметр *writeback* равен `True`, объект будет хранить кэш всех полученных записей и записывать их обратно в *dict* при синхронизации и закрытии. Это позволяет естественным образом работать с изменяемыми записями, но может потреблять гораздо больше памяти и замедлить синхронизацию и закрытие.5455#### `[shelve.BsdDbShelf]class shelve.BsdDbShelf(dict[, protocol=None[, writeback=False]])`5657Подкласс5859[`Shelf`](https://python-all.ru/3.0/library/shelve.html#shelve.Shelf)6061, который предоставляет методы6263`first()`6465,6667[`next()`](https://python-all.ru/3.0/library/functions.html#next)6869,7071`previous()`7273,7475`last()`7677и7879`set_location()`8081, доступные в модуле8283`bsddb`8485, но не в других модулях баз данных. Объект8687*dict*8889, передаваемый конструктору, должен поддерживать эти методы. Обычно это достигается вызовом одной из функций9091`bsddb.hashopen()`9293,9495`bsddb.btopen()`9697или9899`bsddb.rnopen()`100101. Необязательные параметры102103*протокол*104105и106107*writeback*108109имеют ту же интерпретацию, что и для класса110111[`Shelf`](https://python-all.ru/3.0/library/shelve.html#shelve.Shelf)112113.114115#### `[shelve.DbfilenameShelf]class shelve.DbfilenameShelf(filename[, flag='c'[, protocol=None[, writeback=False]]])`116117Подкласс118119[`Shelf`](https://python-all.ru/3.0/library/shelve.html#shelve.Shelf)120121, который принимает имя файла122123*filename*124125вместо объекта, похожего на словарь. Базовый файл будет открыт с помощью126127[`dbm.open()`](https://python-all.ru/3.0/library/dbm.html#dbm.open)128129. По умолчанию файл будет создан и открыт для чтения и записи. Необязательный параметр130131*flag*132133имеет ту же интерпретацию, что и для функции134135[`open()`](https://python-all.ru/3.0/library/functions.html#open)136137. Необязательные параметры138139*protocol*140141и142143*writeback*144145имеют ту же интерпретацию, что и для класса146147[`Shelf`](https://python-all.ru/3.0/library/shelve.html#shelve.Shelf)148149.150151## Пример152153Обобщая интерфейс (`key` – строка, `data` – произвольный объект):154155```python156import shelve157158d = shelve.open(filename) # open -- файл может получить суффикс, добавленный низкоуровневой159                          # библиотекой160161d[key] = data   # сохраняет данные по ключу (перезаписывает старые данные, если162                # используется существующий ключ)163data = d[key]   # извлечь копию данных по ключу (вызывает KeyError, если такого ключа нет)164                # такого ключа)165del d[key]      # удалить данные, хранящиеся по ключу (вызывает KeyError166                # если такого ключа нет)167flag = key in d   # true, если ключ существует168klist = d.keys() # список всех существующих ключей (медленно!)169170# так как d был открыт БЕЗ writeback=True, внимание:171d['xx'] = range(4)  # это работает как ожидается, но...172d['xx'].append(5)   # *это не работает!* -- d['xx'] по-прежнему range(4)!!!173174# открыв d без writeback=True, нужно писать код аккуратно:175temp = d['xx']      # извлекает копию176temp.append(5)      # изменяет копию177d['xx'] = temp      # сохраняет изменённую копию обратно для сохранения178179# или, d=shelve.open(filename,writeback=True) позволил бы просто написать180# d['xx'].append(5) и это бы работало как ожидается, НО это также бы181# потребляло больше памяти и замедляло операцию d.close().182183d.close()       # закрыть его184```185186> **См. также**187>188> **Модуль [`dbm`](https://python-all.ru/3.0/library/dbm.html#module-dbm)**189>190> Общий интерфейс для баз данных типа191>192> `dbm`193>194> .195>196> **Модуль [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle)**197>198> Сериализация объектов, используемая модулем199>200> `shelve`201>202> .203>204> **Модуль `cPickle`**205>206> Высокопроизводительная версия207>208> [`pickle`](https://python-all.ru/3.0/library/pickle.html#module-pickle)209>210> .211