Попробуйте преобразовать полку в dict()
и затем выбрать ее:
sdb = shelve.open('foo.db')
sdb['abc'] = {'a': 1, 'b': 2}
tmp = cPickle.dumps(dict(sdb), 2)
print cPickle.loads(tmp)
{'abc': {'a': 1, 'b': 2}}
Обновлено : (Ответ на вопрос в комментариях): dict
может скопироватьзначения ключа из любого объекта сопоставления, поэтому, если этот объект реализует методы keys
и __getitem__
, он будет работать.Поскольку полка является объектом сопоставления, конструктор копирования dict
может считывать значения ключей с полки, тогда вы можете выбрать полученный диктет и отправить его другим хостам.
В приведенном ниже примере показан минимальный интерфейс dict
, необходимый для копирования объекта:
class Foo(object):
def __init__(self):
self.value = 0
def keys(self):
return ['a', 'b']
def __getitem__(self, key):
v = self.value
self.value += 1
return self.value
foo = Foo()
print dict(foo)
print dict(foo)
Вывод
{'a': 1, 'b': 2}
{'a': 3, 'b': 4}
Обновление : вдобавить содержимое диктанта обратно на полку, используйте update()
:
d = {'a': 1, 'b': 2}
s = shelve.open('foo.db')
s.update(d)
print s
{'a': 1, 'b': 2}