Question

I am working with Shelve in Python and I am having an issue:

In [391]: x
Out[391]: {'broken': {'position': 25, 'page': 1, 'letter': 'a'}}

In [392]: x['broken'].update({'page':1,'position':25,'letter':'b'})

In [393]: x
Out[393]: {'broken': {'position': 25, 'page': 1, 'letter': 'a'}}

I don't understand why its not updating? Any thoughts?

Was it helpful?

Solution

This is covered in the documentation. Basically, the keyword parameter writeback to shelve.open is responsible for this:

If the optional writeback parameter is set to True, all entries accessed are also cached in memory, and written back on sync() and close(); this can make it handier to mutate mutable entries in the persistent dictionary, but, if many entries are accessed, it can consume vast amounts of memory for the cache, and it can make the close operation very slow since all accessed entries are written back (there is no way to determine which accessed entries are mutable, nor which ones were actually mutated).

Example from the same page:

d = shelve.open(filename) # open -- file may get suffix added by low-level
                          # library
# as d was opened WITHOUT writeback=True, beware:
d['xx'] = range(4)  # this works as expected, but...
d['xx'].append(5)   # *this doesn't!* -- d['xx'] is STILL range(4)!

# 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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top