Kent Johnson schreef:
On Tue, Mar 3, 2009 at 12:18 PM, Timo <timomli...@gmail.com> wrote:
Hello all, I'm using the Shelve module to store dictionaries in a list as a
value of a key.

So:

key = [{'keyA' : 1, 'keyB' : 2}, {'key1' : 1, 'key2' : 2}]

The problem is I can't remove a dictionary from the list.


import shelve

s = shelve.open('file')
try:
  for index, value in enumerate(s['key']):
      if value['keyA'] == 1 and value['keyB'] == 2:
          del value[index]
finally:
  s.close()


If I do some printing in between, I can see the dictionary actually gets
removed, but doesn't get saved. Any ideas why?

From the shelve docs:
By default, mutations to persistent-dictionary mutable entries are not
automatically written back. If the optional writeback parameter is set
to True, all entries accessed are cached in memory, and written back
at close time; 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).

In other words, by default, shelve does not know about changes you
make to mutable values. You can either
- open the shelve with writeback=True
- explicitly store the modified value back into the shelve:
  key = s['key']
  # modify key
  s['key'] = key
  s.close()

Kent
Sorry, I should have known this myself since I do this to append data to it. Stupid mistake. Don't know why I didn't do this when deleting data.
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to