Source code for asab.pdict
import collections
import os
import shelve
[docs]class PersistentDict(dict):
"""
The persistent dictionary works as the regular Python dictionary but the content of the dictionary is stored in the file.
You cat think of a ``PersistentDict`` as a simple `key-value store <https://en.wikipedia.org/wiki/Key-value_database>`_.
It is not optimized for a frequent access. This class provides common ``dict`` interface.
*Warning*: You must explicitly `load()` and `store()` content of the dictionary
*Warning*: You can only store objects in the persistent dictionary that are serializable.
"""
def __init__(self, path):
super().__init__()
# Create directory, if needed
dirname = os.path.dirname(path)
if not os.path.isdir(dirname):
os.makedirs(dirname)
self._path = path
def __delitem__(self, key):
super().__delitem__(key)
with shelve.open(self._path) as d:
del d[key]
[docs] def load(self) -> None:
"""
Load content of file as dictionary.
"""
with shelve.open(self._path) as d:
for key, value in d.items():
self[key] = value
[docs] def store(self) -> None:
"""
Explicitly store content of persistent dictionary to file
"""
with shelve.open(self._path) as d:
for key, value in self.items():
d[key] = value
[docs] def update(self, other=(), **kwds) -> None:
"""
Update D from mapping/iterable E and F.
* If E present and has a .keys() method, does: for k in E: D[k] = E[k]
* If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
* In either case, this is followed by: for k, v in F.items(): D[k] = v
Inspired by a https://github.com/python/cpython/blob/3.8/Lib/_collections_abc.py
"""
if isinstance(other, collections.Mapping):
for key in other:
self[key] = other[key]
elif hasattr(other, "keys"):
for key in other.keys():
self[key] = other[key]
else:
for key, value in other:
self[key] = value
for key, value in kwds.items():
self[key] = value