Введение

Примеры

Пример кода для полки

Чтобы положить объект на полку, сначала импортируйте модуль, а затем назначьте значение объекта следующим образом:

 import shelve 
 database = shelve.open(filename.suffix) 
 object = Object() 
 database['key'] = object  

Чтобы подвести итог интерфейса (ключ - строка, данные - произвольный объект):

import shelve

d = shelve.open(filename)  # open -- file may get suffix added by low-level
                           # library

d[key] = data              # store data at key (overwrites old data if
                           # using an existing key)
data = d[key]              # retrieve a COPY of data at key (raise KeyError
                           # if no such key)
del d[key]                 # delete data stored at key (raises KeyError
                           # if no such key)

flag = key in d            # true if the key exists
klist = list(d.keys())     # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]        # this works as expected, but...
d['xx'].append(3)          # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']             # extracts the copy
temp.append(5)             # mutates the copy
d['xx'] = temp             # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()                  # close it 

Создание новой полки

Самый простой способ использовать сукно это через класс DbfilenameShelf. Он использует anydbm для хранения данных. Вы можете использовать класс непосредственно, или просто позвоните shelve.open ():

 import shelve

s = shelve.open('test_shelf.db')
try:
    s['key1'] = { 'int': 10, 'float':9.5, 'string':'Sample data' }
finally:
    s.close()

 

Чтобы снова получить доступ к данным, откройте полку и используйте ее как словарь:

     import shelve

    s = shelve.open('test_shelf.db')
    try:
        existing = s['key1']
    finally:
        s.close()

print existing

 

Если вы запустите оба примера сценария, вы должны увидеть:

 $ python shelve_create.py
$ python shelve_existing.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}

 

Модуль дБмВта не поддерживает множество приложений , пишущие в те же базу данных одновременно. Если вы знаете, что ваш клиент не будет изменять полку, вы можете указать полке открыть базу данных только для чтения.

 import shelve

s = shelve.open('test_shelf.db', flag='r')
try:
    existing = s['key1']
finally:
    s.close()

print existing

 

Если ваша программа пытается изменить базу данных, пока она открыта только для чтения, генерируется исключение ошибки доступа. Тип исключения зависит от модуля базы данных, выбранного anydbm при создании базы данных.

Write-назад

По умолчанию полки не отслеживают изменения изменчивых объектов. Это означает, что если вы изменяете содержимое элемента, хранящегося на полке, вы должны явно обновить полку, сохранив элемент снова.

 import shelve

s = shelve.open('test_shelf.db')
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

 

В этом примере словарь в key1 снова не сохраняется, поэтому при повторном открытии полки изменения не сохраняются.

 $ python shelve_create.py
$ python shelve_withoutwriteback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

 

Чтобы автоматически отследить изменения в энергозависимых объектах, хранящихся на полке, откройте полку с включенной обратной записью. Флаг обратной записи заставляет полку запоминать все объекты, извлеченные из базы данных с использованием кэша в памяти. Каждый объект кеша также записывается обратно в базу данных, когда полка закрыта.

 import shelve

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
    print s['key1']
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

 

Хотя это снижает вероятность ошибки программиста и может сделать постоянство объектов более прозрачным, использование режима обратной записи может быть нежелательным в каждой ситуации. Кэш-память потребляет дополнительную память, пока полка открыта, и приостановка записи каждого кэшированного объекта обратно в базу данных, когда он закрыт, может занять дополнительное время. Поскольку невозможно определить, были ли кэшированные объекты изменены, они все записываются обратно. Если ваше приложение читает данные больше, чем пишет, обратная запись добавит больше накладных расходов, чем вы могли бы захотеть.

$ python shelve_create.py
$ python shelve_writeback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}

Синтаксис

Параметры

Примечания