blob: f40d583bc2ac7e20bb4d46b044b45c5e1029218e [file] [log] [blame]
Fred Drake2db76802004-12-01 05:05:47 +00001\documentclass{howto}
2\usepackage{distutils}
3% $Id$
4
Fred Drake2db76802004-12-01 05:05:47 +00005
6\title{What's New in Python 2.5}
7\release{0.0}
Andrew M. Kuchling92e24952004-12-03 13:54:09 +00008\author{A.M. Kuchling}
9\authoraddress{\email{amk@amk.ca}}
Fred Drake2db76802004-12-01 05:05:47 +000010
11\begin{document}
12\maketitle
13\tableofcontents
14
15This article explains the new features in Python 2.5. No release date
Andrew M. Kuchling5eefdca2006-02-08 11:36:09 +000016for Python 2.5 has been set; it will probably be released in the
17autumn of 2006.
Fred Drake2db76802004-12-01 05:05:47 +000018
19% Compare with previous release in 2 - 3 sentences here.
20
21This article doesn't attempt to provide a complete specification of
22the new features, but instead provides a convenient overview. For
23full details, you should refer to the documentation for Python 2.5.
24% add hyperlink when the documentation becomes available online.
25If you want to understand the complete implementation and design
26rationale, refer to the PEP for a particular new feature.
27
28
29%======================================================================
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +000030\section{PEP 309: Partial Function Application}
Fred Drake2db76802004-12-01 05:05:47 +000031
Andrew M. Kuchlingb1c96fd2005-03-20 21:42:04 +000032The \module{functional} module is intended to contain tools for
33functional-style programming. Currently it only contains
34\class{partial}, but new functions will probably be added in future
35versions of Python.
36
Andrew M. Kuchling4b000cd2005-04-09 15:51:44 +000037For programs written in a functional style, it can be useful to
38construct variants of existing functions that have some of the
39parameters filled in. Consider a Python function \code{f(a, b, c)};
40you could create a new function \code{g(b, c)} that was equivalent to
41\code{f(1, b, c)}. This is called ``partial function application'',
42and is provided by the \class{partial} class in the new
43\module{functional} module.
44
45The constructor for \class{partial} takes the arguments
46\code{(\var{function}, \var{arg1}, \var{arg2}, ...
47\var{kwarg1}=\var{value1}, \var{kwarg2}=\var{value2})}. The resulting
48object is callable, so you can just call it to invoke \var{function}
49with the filled-in arguments.
50
51Here's a small but realistic example:
52
53\begin{verbatim}
54import functional
55
56def log (message, subsystem):
57 "Write the contents of 'message' to the specified subsystem."
58 print '%s: %s' % (subsystem, message)
59 ...
60
61server_log = functional.partial(log, subsystem='server')
62\end{verbatim}
63
Andrew M. Kuchling6af7fe02005-08-02 17:20:36 +000064Here's another example, from a program that uses PyGTk. Here a
65context-sensitive pop-up menu is being constructed dynamically. The
66callback provided for the menu option is a partially applied version
67of the \method{open_item()} method, where the first argument has been
68provided.
Andrew M. Kuchling4b000cd2005-04-09 15:51:44 +000069
Andrew M. Kuchling6af7fe02005-08-02 17:20:36 +000070\begin{verbatim}
71...
72class Application:
73 def open_item(self, path):
74 ...
75 def init (self):
76 open_func = functional.partial(self.open_item, item_path)
77 popup_menu.append( ("Open", open_func, 1) )
78\end{verbatim}
Andrew M. Kuchlingb1c96fd2005-03-20 21:42:04 +000079
80
81\begin{seealso}
82
83\seepep{309}{Partial Function Application}{PEP proposed and written by
84Peter Harris; implemented by Hye-Shik Chang, with adaptations by
85Raymond Hettinger.}
86
87\end{seealso}
Fred Drake2db76802004-12-01 05:05:47 +000088
89
90%======================================================================
Fred Drakedb7b0022005-03-20 22:19:47 +000091\section{PEP 314: Metadata for Python Software Packages v1.1}
92
Andrew M. Kuchlingd8d732e2005-04-09 23:59:41 +000093Some simple dependency support was added to Distutils. The
94\function{setup()} function now has \code{requires},\code{provides},
95and \code{obsoletes}. When you build a source distribution using the
96\code{sdist} command, the dependency information will be recorded in
97the \file{PKG-INFO} file.
98
99Another new keyword is \code{download_url}, which should be set to a
100URL for the package's source code. This means it's now possible to
101look up an entry in the package index, determine the dependencies for
102a package, and download the required packages.
103
104% XXX put example here
105
106\begin{seealso}
107
108\seepep{314}{Metadata for Python Software Packages v1.1}{PEP proposed
109and written by A.M. Kuchling, Richard Jones, and Fred Drake;
110implemented by Richard Jones and Fred Drake.}
111
112\end{seealso}
Fred Drakedb7b0022005-03-20 22:19:47 +0000113
114
115%======================================================================
Andrew M. Kuchlinga2e21cb2005-08-02 17:13:21 +0000116\section{PEP 342: New Generator Features}
117
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000118As introduced in Python 2.3, generators only produce output; once a
119generator's code was invoked to create an iterator, there's no way to
120pass new parameters into the function when its execution is resumed.
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000121Hackish solutions to this include making the generator's code look at
122a global variable and then changing the global variable's value, or
123passing in some mutable object that callers then modify. Python
1242.5 adds the ability to pass values \emph{into} a generator.
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000125
126To refresh your memory of basic generators, here's a simple example:
127
128\begin{verbatim}
129def counter (maximum):
130 i = 0
131 while i < maximum:
132 yield i
133 i += 1
134\end{verbatim}
135
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000136When you call \code{counter(10)}, the result is an iterator that
137returns the values from 0 up to 9. On encountering the
138\keyword{yield} statement, the iterator returns the provided value and
139suspends the function's execution, preserving the local variables.
140Execution resumes on the following call to the iterator's
141\method{next()} method, picking up after the \keyword{yield}.
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000142
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000143In Python 2.3, \keyword{yield} was a statement; it didn't return any
144value. In 2.5, \keyword{yield} is now an expression, returning a
145value that can be assigned to a variable or otherwise operated on:
Andrew M. Kuchlinga2e21cb2005-08-02 17:13:21 +0000146
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000147\begin{verbatim}
148val = (yield i)
149\end{verbatim}
150
151I recommend that you always put parentheses around a \keyword{yield}
152expression when you're doing something with the returned value, as in
153the above example. The parentheses aren't always necessary, but it's
154easier to always add them instead of having to remember when they're
155needed. The exact rules are that a \keyword{yield}-expression must
156always be parenthesized except when it occurs at the top-level
157expression on the right-hand side of an assignment, meaning
158you can to write \code{val = yield i} but \code{val = (yield i) + 12}.
Anthony Baxterd6151102006-02-28 07:21:42 +0000159% XXX ending of last para makes no sense
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000160
161Values are sent into a generator by calling its
162\method{send(\var{value})} method. The generator's code is then
163resumed and the \keyword{yield} expression produces \var{value}.
164If the regular \method{next()} method is called, the \keyword{yield}
165returns \constant{None}.
166
167Here's the previous example, modified to allow changing the value of
168the internal counter.
169
170\begin{verbatim}
171def counter (maximum):
172 i = 0
173 while i < maximum:
174 val = (yield i)
175 # If value provided, change counter
176 if val is not None:
177 i = val
178 else:
179 i += 1
180\end{verbatim}
181
182And here's an example of changing the counter:
183
184\begin{verbatim}
185>>> it = counter(10)
186>>> print it.next()
1870
188>>> print it.next()
1891
190>>> print it.send(8)
1918
192>>> print it.next()
1939
194>>> print it.next()
195Traceback (most recent call last):
196 File ``t.py'', line 15, in ?
197 print it.next()
198StopIteration
Andrew M. Kuchlingc2033702005-08-29 13:30:12 +0000199\end{verbatim}
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000200
201Because \keyword{yield} will often be returning \constant{None},
202you shouldn't just use its value in expressions unless you're sure
203that only the \method{send()} method will be used.
204
205There are two other new methods on generators in addition to
206\method{send()}:
207
208\begin{itemize}
209
210 \item \method{throw(\var{type}, \var{value}=None,
211 \var{traceback}=None)} is used to raise an exception inside the
212 generator; the exception is raised by the \keyword{yield} expression
213 where the generator's execution is paused.
214
215 \item \method{close()} raises a new \exception{GeneratorExit}
216 exception inside the generator to terminate the iteration.
217 On receiving this
218 exception, the generator's code must either raise
219 \exception{GeneratorExit} or \exception{StopIteration}; catching the
220 exception and doing anything else is illegal and will trigger
221 a \exception{RuntimeError}. \method{close()} will also be called by
222 Python's garbage collection when the generator is garbage-collected.
223
224 If you need to run cleanup code in case of a \exception{GeneratorExit},
225 I suggest using a \code{try: ... finally:} suite instead of
226 catching \exception{GeneratorExit}.
227
228\end{itemize}
229
230The cumulative effect of these changes is to turn generators from
231one-way producers of information into both producers and consumers.
232Generators also become \emph{coroutines}, a more generalized form of
233subroutines; subroutines are entered at one point and exited at
234another point (the top of the function, and a \keyword{return
235statement}), but coroutines can be entered, exited, and resumed at
236many different points (the \keyword{yield} statements).science term
237
238
Andrew M. Kuchlinga2e21cb2005-08-02 17:13:21 +0000239\begin{seealso}
240
241\seepep{342}{Coroutines via Enhanced Generators}{PEP written by
242Guido van Rossum and Phillip J. Eby;
Andrew M. Kuchling07382062005-08-27 18:45:47 +0000243implemented by Phillip J. Eby. Includes examples of
244some fancier uses of generators as coroutines.}
245
246\seeurl{http://en.wikipedia.org/wiki/Coroutine}{The Wikipedia entry for
247coroutines.}
248
249\seeurl{http://www.sidhe.org/~dan/blog/archives/000178.html}{An
250explanation of coroutines from a Perl point of view, written by Dan
251Sugalski.}
Andrew M. Kuchlinga2e21cb2005-08-02 17:13:21 +0000252
253\end{seealso}
254
255
256%======================================================================
Fred Drake2db76802004-12-01 05:05:47 +0000257\section{Other Language Changes}
258
259Here are all of the changes that Python 2.5 makes to the core Python
260language.
261
262\begin{itemize}
Andrew M. Kuchling1cae3f52004-12-03 14:57:21 +0000263
264\item The \function{min()} and \function{max()} built-in functions
265gained a \code{key} keyword argument analogous to the \code{key}
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000266argument for \method{sort()}. This argument supplies a function
Andrew M. Kuchling1cae3f52004-12-03 14:57:21 +0000267that takes a single argument and is called for every value in the list;
268\function{min()}/\function{max()} will return the element with the
269smallest/largest return value from this function.
270For example, to find the longest string in a list, you can do:
271
272\begin{verbatim}
273L = ['medium', 'longest', 'short']
274# Prints 'longest'
275print max(L, key=len)
276# Prints 'short', because lexicographically 'short' has the largest value
277print max(L)
278\end{verbatim}
279
280(Contributed by Steven Bethard and Raymond Hettinger.)
Fred Drake2db76802004-12-01 05:05:47 +0000281
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000282\item Two new built-in functions, \function{any()} and
283\function{all()}, evaluate whether an iterator contains any true or
284false values. \function{any()} returns \constant{True} if any value
285returned by the iterator is true; otherwise it will return
286\constant{False}. \function{all()} returns \constant{True} only if
287all of the values returned by the iterator evaluate as being true.
288
289% XXX who added?
290
291
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000292\item The list of base classes in a class definition can now be empty.
293As an example, this is now legal:
294
295\begin{verbatim}
296class C():
297 pass
298\end{verbatim}
299(Implemented by Brett Cannon.)
300
Fred Drake2db76802004-12-01 05:05:47 +0000301\end{itemize}
302
303
304%======================================================================
305\subsection{Optimizations}
306
307\begin{itemize}
308
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000309\item When they were introduced
310in Python 2.4, the built-in \class{set} and \class{frozenset} types
311were built on top of Python's dictionary type.
312In 2.5 the internal data structure has been customized for implementing sets,
313and as a result sets will use a third less memory and are somewhat faster.
314(Implemented by Raymond Hettinger.)
Fred Drake2db76802004-12-01 05:05:47 +0000315
316\end{itemize}
317
318The net result of the 2.5 optimizations is that Python 2.5 runs the
Andrew M. Kuchling92e24952004-12-03 13:54:09 +0000319pystone benchmark around XX\% faster than Python 2.4.
Fred Drake2db76802004-12-01 05:05:47 +0000320
321
322%======================================================================
323\section{New, Improved, and Deprecated Modules}
324
325As usual, Python's standard library received a number of enhancements and
326bug fixes. Here's a partial list of the most notable changes, sorted
327alphabetically by module name. Consult the
328\file{Misc/NEWS} file in the source tree for a more
329complete list of changes, or look through the CVS logs for all the
330details.
331
332\begin{itemize}
333
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000334% collections.deque now has .remove()
335
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000336% the cPickle module no longer accepts the deprecated None option in the
337% args tuple returned by __reduce__().
338
339% csv module improvements
340
341% datetime.datetime() now has a strptime class method which can be used to
342% create datetime object using a string and format.
343
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000344\item A new \module{hashlib} module has been added to replace the
345\module{md5} and \module{sha} modules. \module{hashlib} adds support
346for additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512).
347When available, the module uses OpenSSL for fast platform optimized
348implementations of algorithms. The old \module{md5} and \module{sha}
349modules still exist as wrappers around hashlib to preserve backwards
350compatibility. (Contributed by Gregory P. Smith.)
351
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000352\item The \function{nsmallest()} and
353\function{nlargest()} functions in the \module{heapq} module
354now support a \code{key} keyword argument similar to the one
355provided by the \function{min()}/\function{max()} functions
356and the \method{sort()} methods. For example:
357Example:
358
359\begin{verbatim}
360>>> import heapq
361>>> L = ["short", 'medium', 'longest', 'longer still']
362>>> heapq.nsmallest(2, L) # Return two lowest elements, lexicographically
363['longer still', 'longest']
364>>> heapq.nsmallest(2, L, key=len) # Return two shortest elements
365['short', 'medium']
366\end{verbatim}
367
368(Contributed by Raymond Hettinger.)
369
Andrew M. Kuchling511a3a82005-03-20 19:52:18 +0000370\item The \function{itertools.islice()} function now accepts
371\code{None} for the start and step arguments. This makes it more
372compatible with the attributes of slice objects, so that you can now write
373the following:
374
375\begin{verbatim}
376s = slice(5) # Create slice object
377itertools.islice(iterable, s.start, s.stop, s.step)
378\end{verbatim}
379
380(Contributed by Raymond Hettinger.)
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000381
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000382\item The \module{operator} module's \function{itemgetter()}
383and \function{attrgetter()} functions now support multiple fields.
384A call such as \code{operator.attrgetter('a', 'b')}
385will return a function
386that retrieves the \member{a} and \member{b} attributes. Combining
387this new feature with the \method{sort()} method's \code{key} parameter
388lets you easily sort lists using multiple fields.
389
390% XXX who added?
391
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000392
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000393\item The \module{os} module underwent a number of changes. The
394\member{stat_float_times} variable now defaults to true, meaning that
395\function{os.stat()} will now return time values as floats. (This
396doesn't necessarily mean that \function{os.stat()} will return times
397that are precise to fractions of a second; not all systems support
398such precision.)
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000399
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000400Constants named \member{os.SEEK_SET}, \member{os.SEEK_CUR}, and
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000401\member{os.SEEK_END} have been added; these are the parameters to the
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000402\function{os.lseek()} function. Two new constants for locking are
403\member{os.O_SHLOCK} and \member{os.O_EXLOCK}.
404
405On FreeBSD, the \function{os.stat()} function now returns
406times with nanosecond resolution, and the returned object
407now has \member{st_gen} and \member{st_birthtime}.
408The \member{st_flags} member is also available, if the platform supports it.
409% XXX patch 1180695, 1212117
410
Andrew M. Kuchling4678dc82006-01-15 16:11:28 +0000411\item The \module{socket} module now supports \constant{AF_NETLINK}
412sockets on Linux, thanks to a patch from Philippe Biondi.
413Netlink sockets are a Linux-specific mechanism for communications
414between a user-space process and kernel code; an introductory
415article about them is at \url{http://www.linuxjournal.com/article/7356}.
416In Python code, netlink addresses are represented as a tuple of 2 integers,
417\code{(\var{pid}, \var{group_mask})}.
418
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000419\item New module: \module{spwd} provides functions for accessing the
420shadow password database on systems that support it.
421% XXX give example
Fred Drake2db76802004-12-01 05:05:47 +0000422
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000423\item The \class{TarFile} class in the \module{tarfile} module now has
Georg Brandl08c02db2005-07-22 18:39:19 +0000424an \method{extractall()} method that extracts all members from the
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000425archive into the current working directory. It's also possible to set
426a different directory as the extraction target, and to unpack only a
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000427subset of the archive's members.
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000428
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000429A tarfile's compression can be autodetected by
430using the mode \code{'r|*'}.
431% patch 918101
432(Contributed by Lars Gust\"abel.)
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000433
Fredrik Lundh7e0aef02005-12-12 18:54:55 +0000434\item A new package \module{xml.etree} has been added, which contains
435a subset of the ElementTree XML library. Available modules are
436\module{ElementTree}, \module{ElementPath}, and
437\module{ElementInclude}, from ElementTree 1.2.6. (Contributed by
438Fredrik Lundh.)
439
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000440\item The \module{xmlrpclib} module now supports returning
441 \class{datetime} objects for the XML-RPC date type. Supply
442 \code{use_datetime=True} to the \function{loads()} function
443 or the \class{Unmarshaller} class to enable this feature.
444% XXX patch 1120353
445
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000446
Fred Drake114b8ca2005-03-21 05:47:11 +0000447\end{itemize}
Andrew M. Kuchlinge9b1bf42005-03-20 19:26:30 +0000448
Fred Drake2db76802004-12-01 05:05:47 +0000449
450
451%======================================================================
452% whole new modules get described in \subsections here
453
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000454% XXX new distutils features: upload
455
Fredrik Lundh7e0aef02005-12-12 18:54:55 +0000456% XXX should hashlib perhaps be described here instead?
457% XXX should xml.etree perhaps be described here instead?
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000458
459
Fred Drake2db76802004-12-01 05:05:47 +0000460
461% ======================================================================
462\section{Build and C API Changes}
463
464Changes to Python's build process and to the C API include:
465
466\begin{itemize}
467
Andrew M. Kuchlingdb85ed52005-10-23 21:52:59 +0000468\item The design of the bytecode compiler has changed a great deal, no
469longer generating bytecode by traversing the parse tree. Instead
470the parse tree is converted to an abstract syntax tree (or AST), and it is
471the abstract syntax tree that's traversed to produce the bytecode.
472
473No documentation has been written for the AST code yet. To start
474learning about it, read the definition of the various AST nodes in
475\file{Parser/Python.asdl}. A Python script reads this file and
476generates a set of C structure definitions in
477\file{Include/Python-ast.h}. The \cfunction{PyParser_ASTFromString()}
478and \cfunction{PyParser_ASTFromFile()}, defined in
479\file{Include/pythonrun.h}, take Python source as input and return the
480root of an AST representing the contents. This AST can then be turned
481into a code object by \cfunction{PyAST_Compile()}. For more
482information, read the source code, and then ask questions on
483python-dev.
484
485% List of names taken from Jeremy's python-dev post at
486% http://mail.python.org/pipermail/python-dev/2005-October/057500.html
487The AST code was developed under Jeremy Hylton's management, and
488implemented by (in alphabetical order) Brett Cannon, Nick Coghlan,
489Grant Edwards, John Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters,
490Armin Rigo, and Neil Schemenauer, plus the participants in a number of
491AST sprints at conferences such as PyCon.
492
Andrew M. Kuchling150e3492005-08-23 00:56:06 +0000493\item The built-in set types now have an official C API. Call
494\cfunction{PySet_New()} and \cfunction{PyFrozenSet_New()} to create a
495new set, \cfunction{PySet_Add()} and \cfunction{PySet_Discard()} to
496add and remove elements, and \cfunction{PySet_Contains} and
497\cfunction{PySet_Size} to examine the set's state.
498
499\item The \cfunction{PyRange_New()} function was removed. It was
500never documented, never used in the core code, and had dangerously lax
501error checking.
Fred Drake2db76802004-12-01 05:05:47 +0000502
503\end{itemize}
504
505
506%======================================================================
507\subsection{Port-Specific Changes}
508
509Platform-specific changes go here.
510
511
512%======================================================================
513\section{Other Changes and Fixes \label{section-other}}
514
515As usual, there were a bunch of other improvements and bugfixes
516scattered throughout the source tree. A search through the CVS change
517logs finds there were XXX patches applied and YYY bugs fixed between
Andrew M. Kuchling92e24952004-12-03 13:54:09 +0000518Python 2.4 and 2.5. Both figures are likely to be underestimates.
Fred Drake2db76802004-12-01 05:05:47 +0000519
520Some of the more notable changes are:
521
522\begin{itemize}
523
524\item Details go here.
525
526\end{itemize}
527
528
529%======================================================================
530\section{Porting to Python 2.5}
531
532This section lists previously described changes that may require
533changes to your code:
534
535\begin{itemize}
536
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000537\item Some old deprecated modules (\module{statcache}, \module{tzparse},
538 \module{whrandom}) have been moved to \file{Lib/lib-old}.
Andrew M. Kuchling0c35db92005-03-20 20:06:49 +0000539You can get access to these modules again by adding the directory
540to your \code{sys.path}:
541
542\begin{verbatim}
543import os
544from distutils import sysconfig
545
546lib_dir = sysconfig.get_python_lib(standard_lib=True)
547old_dir = os.path.join(lib_dir, 'lib-old')
548sys.path.append(old_dir)
549\end{verbatim}
550
551Doing so is discouraged, however; it's better to update any code that
552still uses these modules.
Andrew M. Kuchling3e41b052005-03-01 00:53:46 +0000553
554% the pickle module no longer uses the deprecated bin parameter.
Fred Drake2db76802004-12-01 05:05:47 +0000555
556\end{itemize}
557
558
559%======================================================================
560\section{Acknowledgements \label{acks}}
561
562The author would like to thank the following people for offering
563suggestions, corrections and assistance with various drafts of this
564article: .
565
566\end{document}