| Fred Drake | 295da24 | 1998-08-10 19:42:37 +0000 | [diff] [blame] | 1 | \section{\module{shelve} --- | 
| Thomas Wouters | f831663 | 2000-07-16 19:01:10 +0000 | [diff] [blame] | 2 | Python object persistence} | 
| Fred Drake | b91e934 | 1998-07-23 17:59:49 +0000 | [diff] [blame] | 3 |  | 
| Fred Drake | ffbe687 | 1999-04-22 21:23:22 +0000 | [diff] [blame] | 4 | \declaremodule{standard}{shelve} | 
| Thomas Wouters | f831663 | 2000-07-16 19:01:10 +0000 | [diff] [blame] | 5 | \modulesynopsis{Python object persistence.} | 
| Fred Drake | b91e934 | 1998-07-23 17:59:49 +0000 | [diff] [blame] | 6 |  | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 7 |  | 
|  | 8 | A ``shelf'' is a persistent, dictionary-like object.  The difference | 
|  | 9 | with ``dbm'' databases is that the values (not the keys!) in a shelf | 
|  | 10 | can be essentially arbitrary Python objects --- anything that the | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 11 | \refmodule{pickle} module can handle.  This includes most class | 
|  | 12 | instances, recursive data types, and objects containing lots of shared | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 13 | sub-objects.  The keys are ordinary strings. | 
| Fred Drake | 9ab2b2ec | 1997-12-15 21:59:33 +0000 | [diff] [blame] | 14 | \refstmodindex{pickle} | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 15 |  | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 16 | \begin{funcdesc}{open}{filename\optional{,flag='c'\optional{,protocol=\code{None}\optional{,writeback=\code{False}}}}} | 
| Skip Montanaro | 1f7a271 | 2003-01-21 01:52:39 +0000 | [diff] [blame] | 17 | Open a persistent dictionary.  The filename specified is the base filename | 
|  | 18 | for the underlying database.  As a side-effect, an extension may be added to | 
|  | 19 | the filename and more than one file may be created.  By default, the | 
|  | 20 | underlying database file is opened for reading and writing.  The optional | 
| Raymond Hettinger | 6880431 | 2005-01-01 00:28:46 +0000 | [diff] [blame] | 21 | {}\var{flag} parameter has the same interpretation as the \var{flag} | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 22 | parameter of \function{anydbm.open}. | 
|  | 23 |  | 
|  | 24 | By default, version 0 pickles are used to serialize values. | 
|  | 25 | The version of the pickle protocol can be specified with the | 
|  | 26 | \var{protocol} parameter. \versionchanged[The \var{protocol} | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 27 | parameter was added]{2.3} | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 28 |  | 
|  | 29 | By default, mutations to persistent-dictionary mutable entries are not | 
|  | 30 | automatically written back.  If the optional \var{writeback} parameter | 
|  | 31 | is set to {}\var{True}, all entries accessed are cached in memory, and | 
|  | 32 | written back at close time; this can make it handier to mutate mutable | 
|  | 33 | entries in the persistent dictionary, but, if many entries are | 
|  | 34 | accessed, it can consume vast amounts of memory for the cache, and it | 
|  | 35 | can make the close operation very slow since all accessed entries are | 
|  | 36 | written back (there is no way to determine which accessed entries are | 
|  | 37 | mutable, nor which ones were actually mutated). | 
|  | 38 |  | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 39 | \end{funcdesc} | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 40 |  | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 41 | Shelve objects support all methods supported by dictionaries.  This eases | 
|  | 42 | the transition from dictionary based scripts to those requiring persistent | 
|  | 43 | storage. | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 44 |  | 
| Georg Brandl | bd77da6 | 2005-08-25 22:40:16 +0000 | [diff] [blame] | 45 | One additional method is supported: | 
|  | 46 | \begin{methoddesc}[Shelf]{sync}{} | 
|  | 47 | Write back all entries in the cache if the shelf was opened with | 
|  | 48 | \var{writeback} set to \var{True}. Also empty the cache and synchronize | 
|  | 49 | the persistent dictionary on disk, if feasible.  This is called automatically | 
|  | 50 | when the shelf is closed with \method{close()}. | 
|  | 51 | \end{methoddesc} | 
|  | 52 |  | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 53 | \subsection{Restrictions} | 
| Guido van Rossum | 5680b95 | 1995-02-16 16:29:01 +0000 | [diff] [blame] | 54 |  | 
|  | 55 | \begin{itemize} | 
|  | 56 |  | 
|  | 57 | \item | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 58 | The choice of which database package will be used | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 59 | (such as \refmodule{dbm}, \refmodule{gdbm} or \refmodule{bsddb}) depends on | 
|  | 60 | which interface is available.  Therefore it is not safe to open the database | 
|  | 61 | directly using \refmodule{dbm}.  The database is also (unfortunately) subject | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 62 | to the limitations of \refmodule{dbm}, if it is used --- this means | 
|  | 63 | that (the pickled representation of) the objects stored in the | 
|  | 64 | database should be fairly small, and in rare cases key collisions may | 
|  | 65 | cause the database to refuse updates. | 
| Fred Drake | 9ab2b2ec | 1997-12-15 21:59:33 +0000 | [diff] [blame] | 66 | \refbimodindex{dbm} | 
|  | 67 | \refbimodindex{gdbm} | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 68 | \refbimodindex{bsddb} | 
| Guido van Rossum | 5680b95 | 1995-02-16 16:29:01 +0000 | [diff] [blame] | 69 |  | 
|  | 70 | \item | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 71 | Depending on the implementation, closing a persistent dictionary may | 
|  | 72 | or may not be necessary to flush changes to disk.  The \method{__del__} | 
|  | 73 | method of the \class{Shelf} class calls the \method{close} method, so the | 
|  | 74 | programmer generally need not do this explicitly. | 
| Guido van Rossum | d188358 | 1995-02-15 15:53:08 +0000 | [diff] [blame] | 75 |  | 
| Guido van Rossum | 5680b95 | 1995-02-16 16:29:01 +0000 | [diff] [blame] | 76 | \item | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 77 | The \module{shelve} module does not support \emph{concurrent} read/write | 
| Guido van Rossum | 470be14 | 1995-03-17 16:07:09 +0000 | [diff] [blame] | 78 | access to shelved objects.  (Multiple simultaneous read accesses are | 
|  | 79 | safe.)  When a program has a shelf open for writing, no other program | 
|  | 80 | should have it open for reading or writing.  \UNIX{} file locking can | 
|  | 81 | be used to solve this, but this differs across \UNIX{} versions and | 
|  | 82 | requires knowledge about the database implementation used. | 
| Guido van Rossum | 5680b95 | 1995-02-16 16:29:01 +0000 | [diff] [blame] | 83 |  | 
|  | 84 | \end{itemize} | 
| Fred Drake | c859350 | 1998-08-24 18:46:14 +0000 | [diff] [blame] | 85 |  | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 86 | \begin{classdesc}{Shelf}{dict\optional{, protocol=None\optional{, writeback=False}}} | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 87 | A subclass of \class{UserDict.DictMixin} which stores pickled values in the | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 88 | \var{dict} object. | 
|  | 89 |  | 
|  | 90 | By default, version 0 pickles are used to serialize values.  The | 
|  | 91 | version of the pickle protocol can be specified with the | 
|  | 92 | \var{protocol} parameter. See the \module{pickle} documentation for a | 
|  | 93 | discussion of the pickle protocols. \versionchanged[The \var{protocol} | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 94 | parameter was added]{2.3} | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 95 |  | 
|  | 96 | If the \var{writeback} parameter is \code{True}, the object will hold a | 
|  | 97 | cache of all entries accessed and write them back to the \var{dict} at | 
|  | 98 | sync and close times.  This allows natural operations on mutable entries, | 
|  | 99 | but can consume much more memory and make sync and close take a long time. | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 100 | \end{classdesc} | 
|  | 101 |  | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 102 | \begin{classdesc}{BsdDbShelf}{dict\optional{, protocol=None\optional{, writeback=False}}} | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 103 |  | 
|  | 104 | A subclass of \class{Shelf} which exposes \method{first}, | 
|  | 105 | \method{next}, \method{previous}, \method{last} and | 
|  | 106 | \method{set_location} which are available in the \module{bsddb} module | 
|  | 107 | but not in other database modules.  The \var{dict} object passed to | 
|  | 108 | the constructor must support those methods.  This is generally | 
|  | 109 | accomplished by calling one of \function{bsddb.hashopen}, | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 110 | \function{bsddb.btopen} or \function{bsddb.rnopen}.  The optional | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 111 | \var{protocol} and \var{writeback} parameters have the | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 112 | same interpretation as for the \class{Shelf} class. | 
|  | 113 |  | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 114 | \end{classdesc} | 
|  | 115 |  | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 116 | \begin{classdesc}{DbfilenameShelf}{filename\optional{, flag='c'\optional{, protocol=None\optional{, writeback=False}}}} | 
| Skip Montanaro | 1f7a271 | 2003-01-21 01:52:39 +0000 | [diff] [blame] | 117 |  | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 118 | A subclass of \class{Shelf} which accepts a \var{filename} instead of | 
|  | 119 | a dict-like object.  The underlying file will be opened using | 
|  | 120 | {}\function{anydbm.open}.  By default, the file will be created and | 
|  | 121 | opened for both read and write.  The optional \var{flag} parameter has | 
|  | 122 | the same interpretation as for the \function{open} function.  The | 
| Raymond Hettinger | 1bc82f8 | 2004-12-05 03:58:17 +0000 | [diff] [blame] | 123 | optional \var{protocol} and \var{writeback} parameters | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 124 | have the same interpretation as for the \class{Shelf} class. | 
|  | 125 |  | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 126 | \end{classdesc} | 
| Fred Drake | c859350 | 1998-08-24 18:46:14 +0000 | [diff] [blame] | 127 |  | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 128 | \subsection{Example} | 
|  | 129 |  | 
|  | 130 | To summarize the interface (\code{key} is a string, \code{data} is an | 
|  | 131 | arbitrary object): | 
|  | 132 |  | 
|  | 133 | \begin{verbatim} | 
|  | 134 | import shelve | 
|  | 135 |  | 
|  | 136 | d = shelve.open(filename) # open -- file may get suffix added by low-level | 
|  | 137 | # library | 
|  | 138 |  | 
|  | 139 | d[key] = data   # store data at key (overwrites old data if | 
|  | 140 | # using an existing key) | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 141 | data = d[key]   # retrieve a COPY of data at key (raise KeyError if no | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 142 | # such key) | 
|  | 143 | del d[key]      # delete data stored at key (raises KeyError | 
|  | 144 | # if no such key) | 
|  | 145 | flag = d.has_key(key)   # true if the key exists | 
|  | 146 | list = d.keys() # a list of all existing keys (slow!) | 
|  | 147 |  | 
| Martin v. Löwis | 153c9e4 | 2003-04-19 20:59:03 +0000 | [diff] [blame] | 148 | # as d was opened WITHOUT writeback=True, beware: | 
|  | 149 | d['xx'] = range(4)  # this works as expected, but... | 
|  | 150 | d['xx'].append(5)   # *this doesn't!* -- d['xx'] is STILL range(4)!!! | 
|  | 151 | # having opened d without writeback=True, you need to code carefully: | 
|  | 152 | temp = d['xx']      # extracts the copy | 
|  | 153 | temp.append(5)      # mutates the copy | 
|  | 154 | d['xx'] = temp      # stores the copy right back, to persist it | 
|  | 155 | # or, d=shelve.open(filename,writeback=True) would let you just code | 
|  | 156 | # d['xx'].append(5) and have it work as expected, BUT it would also | 
|  | 157 | # consume more memory and make the d.close() operation slower. | 
|  | 158 |  | 
| Skip Montanaro | 190613c | 2003-01-21 01:38:47 +0000 | [diff] [blame] | 159 | d.close()       # close it | 
|  | 160 | \end{verbatim} | 
|  | 161 |  | 
| Fred Drake | c859350 | 1998-08-24 18:46:14 +0000 | [diff] [blame] | 162 | \begin{seealso} | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 163 | \seemodule{anydbm}{Generic interface to \code{dbm}-style databases.} | 
| Skip Montanaro | 3bf99e3 | 2002-12-08 18:36:24 +0000 | [diff] [blame] | 164 | \seemodule{bsddb}{BSD \code{db} database interface.} | 
|  | 165 | \seemodule{dbhash}{Thin layer around the \module{bsddb} which provides an | 
|  | 166 | \function{open} function like the other database modules.} | 
| Fred Drake | 0155370 | 1999-04-05 19:46:21 +0000 | [diff] [blame] | 167 | \seemodule{dbm}{Standard \UNIX{} database interface.} | 
|  | 168 | \seemodule{dumbdbm}{Portable implementation of the \code{dbm} interface.} | 
|  | 169 | \seemodule{gdbm}{GNU database interface, based on the \code{dbm} interface.} | 
| Fred Drake | c859350 | 1998-08-24 18:46:14 +0000 | [diff] [blame] | 170 | \seemodule{pickle}{Object serialization used by \module{shelve}.} | 
| Fred Drake | ffbe687 | 1999-04-22 21:23:22 +0000 | [diff] [blame] | 171 | \seemodule{cPickle}{High-performance version of \refmodule{pickle}.} | 
| Fred Drake | c859350 | 1998-08-24 18:46:14 +0000 | [diff] [blame] | 172 | \end{seealso} |