source: vendor/python/2.5/Doc/lib/libshelve.tex

Last change on this file was 3225, checked in by bird, 18 years ago

Python 2.5

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