shelve
представляет собой модуль из стандартной библиотеки Python. Док ясно о том, что: значения (! А не ключи) в полке может быть по существу произвольные объекты Python - все, что модуль рассол может обрабатывать ... Ключи обычные строки
По строительной полке будет только принимать строки как ключи.
Shove по-прежнему находится в Бета-версии в соответствии с документацией от pypi, и я не видел никаких доказательств того, что он поддерживает что-либо другое, что строка для ключа (ошибка object has no attribute 'rstrip'
не думает, что это не так).
Если бы я был вами, я бы придерживался хорошо известного shelve
и просто обернул его ключевым слоем сериализации. Как предложил Падрейк Каннингем, pickle
должен выполнить эту работу.
Вот (не тщательно протестированы) возможная реализация:
class tuple_dict(collections.MutableMapping):
class iterator(collections.Iterator):
def __init__(self, d):
self.it = d.udict.__iter__()
def __iter__(self):
return self
def next(self):
return pickle.loads(next(self.it))
def __init__(self, udict):
self.udict = udict
def __getitem__(self, key):
ukey = pickle.dumps(key)
return self.udict[ukey]
def __setitem__(self, key, value):
ukey = pickle.dumps(key)
self.udict[ukey] = value
def __delitem__(self, key):
ukey = pickle.dumps(key)
del self.udict[ukey]
def keys(self):
return [ pickle.loads(key) for key in self.udict.keys() ]
def __iter__(self):
return self.iterator(self)
def __len__(self):
return len(self.udict)
def __contains__(self, key):
return pickle.dumps(key) in self.udict
def sync(self):
self.udict.sync()
def close(self):
self.udict.close()
Вы могли бы использовать его таким образом:
import shelve
underlying_d = shelve.open('tmp/test.db')
d = tuple_dict(underlying_d)
d будет принимать кортеж в качестве ключей и магазинов, которые все в нижележащих полка.
NB: если позже вы захотите использовать другую реализацию сохранения, если реализация является сопоставлением (тип типа dict), вы можете повторно использовать tuple_dict
, просто изменив методы закрытия и синхронизации (спецификация полки), но что будет требуемый другим имплантантом. Фактически, помимо этих двух методов tuple_dict просто обертывает обычный dict - и как таковой любой класс отображения ...
Вы пробовали рассол? –
... какой * "ошибка" *? – jonrsharpe
@PadraicCunningham Я хотел бы иметь простоту доступа к данным только с помощью 'data [tuple (key1, key2)] = 3', так как он предоставляется с помощью полки и форсунки. Я подумал с рассолом, я могу загрузить или сохранить весь словарь –