## 13.4.2 Example

To summarize the interface (`key` is a string, `data` is an arbitrary object):

    import shelve

    d = shelve.open(filename) # open -- file may get suffix added by low-level
                              # library

    d[key] = data   # store data at key (overwrites old data if
                    # using an existing key)
    data = d[key]   # retrieve a COPY of data at key (raise KeyError if no
                    # such key)
    del d[key]      # delete data stored at key (raises KeyError
                    # if no such key)
    flag = d.has_key(key)   # true if the key exists
    klist = d.keys() # a list of all existing keys (slow!)

    # 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

See Also:

Module `anydbm`:
  Generic interface to `dbm`-style databases.

Module `bsddb`:
  BSD `db` database interface.

Module `dbhash`:
  Thin layer around the `bsddb` which provides an `open` function like the other database modules.

Module `dbm`:
  Standard Unix database interface.

Module `dumbdbm`:
  Portable implementation of the `dbm` interface.

Module `gdbm`:
  GNU database interface, based on the `dbm` interface.

Module `pickle`:
  Object serialization used by `shelve`.

Module `cPickle`:
  High-performance version of `pickle`.