blob: 23c34319803ef4f6986e734039fd727e23e1c372 [file] [log] [blame]
Fred Drakeed0fa3d2003-07-30 19:14:09 +00001\documentclass{howto}
2\usepackage{distutils}
3% $Id$
4
5\title{What's New in Python 2.4}
6\release{0.0}
7\author{A.M.\ Kuchling}
8\authoraddress{\email{amk@amk.ca}}
9
10\begin{document}
11\maketitle
12\tableofcontents
13
14This article explains the new features in Python 2.4. No release date
15for Python 2.4 has been set; expect that this will happen in 2004.
16
17While Python 2.3 was primarily a library development release, Python
182.4 may extend the core language and interpreter in
19as-yet-undetermined ways.
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.4.
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. Kuchling1a420252003-11-08 15:58:49 +000030\section{PEP 322: Reverse Iteration}
Fred Drakeed0fa3d2003-07-30 19:14:09 +000031
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000032A new built-in function, \function{reversed(seq)}, takes a sequence
33and returns an iterator that returns the elements of the sequence
34in reverse order.
35
36\begin{verbatim}
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000037>>> for i in reversed(xrange(1,4)):
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000038... print i
39...
403
412
421
43\end{verbatim}
44
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000045Compared to extended slicing, \code{range(1,4)[::-1]}, \function{reversed()}
46is easier to read, runs faster, and uses substantially less memory.
47
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000048Note that \function{reversed()} only accepts sequences, not arbitrary
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000049iterators. If you want to reverse an iterator, first convert it to
50a list with \function{list()}.
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000051
52\begin{verbatim}
53>>> input = open('/etc/passwd', 'r')
54>>> for line in reversed(list(input)):
55... print line
56...
57root:*:0:0:System Administrator:/var/root:/bin/tcsh
58 ...
59\end{verbatim}
Fred Drakeed0fa3d2003-07-30 19:14:09 +000060
Andrew M. Kuchlingf7a6b672003-11-08 16:05:37 +000061\begin{seealso}
62\seepep{322}{Reverse Iteration}{Written and implemented by Raymond Hettinger.}
63
64\end{seealso}
65
Fred Drakeed0fa3d2003-07-30 19:14:09 +000066
67%======================================================================
68\section{Other Language Changes}
69
70Here are all of the changes that Python 2.4 makes to the core Python
71language.
72
73\begin{itemize}
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +000074\item The \method{sort()} method of lists gained three keyword
75arguments, \var{cmp}, \var{key}, and \var{reverse}. These arguments
76make some common usages of \method{sort()} simpler. All are optional.
77
78\var{cmp} is the same as the previous single argument to
79\method{sort()}; if provided, the value should be a comparison
80function that takes two arguments and returns -1, 0, or +1 depending
81on how the arguments compare.
82
83\var{key} should be a single-argument function that takes a list
84element and returns a comparison key for the element. The list is
Raymond Hettinger607c00f2003-11-12 16:27:50 +000085then sorted using the comparison keys. The following example sorts a
86list case-insensitively:
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +000087
88\begin{verbatim}
89>>> L = ['A', 'b', 'c', 'D']
90>>> L.sort() # Case-sensitive sort
91>>> L
92['A', 'D', 'b', 'c']
93>>> L.sort(key=lambda x: x.lower())
94>>> L
95['A', 'b', 'c', 'D']
96>>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
97>>> L
98['A', 'b', 'c', 'D']
99\end{verbatim}
100
101The last example, which uses the \var{cmp} parameter, is the old way
102to perform a case-insensitive sort. It works, but is slower than
103using a \var{key} parameter. Using \var{key} results in calling the
104\method{lower()} method once for each element in the list while using
105\var{cmp} will call the method twice for each comparison.
106
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000107Note, for simple key functions and comparison functions, it is often
108possible to avoid the \keyword{lambda} expression by using an unbound
109method instead. For example, the above case-insensitive sort is best
110coded as:
111
112\begin{verbatim}
113>>> L.sort(key=str.lower)
114>>> L
115['A', 'b', 'c', 'D']
116\end{verbatim}
117
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +0000118The \var{reverse} parameter should have a Boolean value. If the value is
119\constant{True}, the list will be sorted into reverse order. Instead
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000120of \code{L.sort(lambda x,y: cmp(y.score, x.score))}, you can now write:
121\code{L.sort(key = lambda x: x.score, reverse=True)}.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000122
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000123The results of sorting are now guaranteed to be stable. This means that
124two entries with equal keys will be returned in the same order as
125they were input.
126
127
128\item The list type gained a \method{sorted(iterable)} method that works
129like the in-place \method{sort()} method but has been made suitable for
130use in expressions. The differences are:
131 \begin{itemize}
132 \item the input make be any iterable;
133 \item a copy is sorted, leaving the original intact; and
134 \item the expression returns the new sorted copy
135 \end{itemize}
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000136
137\begin{verbatim}
138>>> L = [9,7,8,3,2,4,1,6,5]
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000139>>> [10+i for i in list.sorted(L)] # usable in a list comprehension
140[11, 12, 13, 14, 15, 16, 17, 18, 19]
141>>> L = [9,7,8,3,2,4,1,6,5] # original is left unchanged
142[9,7,8,3,2,4,1,6,5]
143>>> list.sorted('Monte Python') # any iterable may be an input
144[' ', 'M', 'P', 'e', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y']
145>>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
146>>> for k, v in list.sorted(colormap.iteritems()):
147... print k, v
148...
149black 4
150blue 2
151green 3
152red 1
153yellow 5
154
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000155\end{verbatim}
156
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000157
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000158\item The \function{zip()} built-in function and \function{itertools.izip()}
159 now return an empty list instead of raising a \exception{TypeError}
160 exception if called with no arguments. This makes the functions more
161 suitable for use with variable length argument lists:
162
163\begin{verbatim}
164>>> def transpose(array):
165... return zip(*array)
166...
167>>> transpose([(1,2,3), (4,5,6)])
168[(1, 4), (2, 5), (3, 6)]
169>>> transpose([])
170[]
171\end{verbatim}
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000172
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000173\end{itemize}
174
175
176%======================================================================
177\subsection{Optimizations}
178
179\begin{itemize}
180
181\item Optimizations should be described here.
182
183\end{itemize}
184
185The net result of the 2.4 optimizations is that Python 2.4 runs the
186pystone benchmark around XX\% faster than Python 2.3 and YY\% faster
187than Python 2.2.
188
189
190%======================================================================
191\section{New, Improved, and Deprecated Modules}
192
193As usual, Python's standard library received a number of enhancements and
194bug fixes. Here's a partial list of the most notable changes, sorted
195alphabetically by module name. Consult the
196\file{Misc/NEWS} file in the source tree for a more
197complete list of changes, or look through the CVS logs for all the
198details.
199
200\begin{itemize}
201
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000202\item The \module{curses} modules now supports the ncurses extension
203 \function{use_default_colors()}. On platforms where the terminal
204 supports transparency, this makes it possible to use a transparent background.
205 (Contributed by J\"org Lehmann.)
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000206
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000207\item The \module{heapq} module has been converted to C. The resulting
208 ten-fold improvement in speed makes the module suitable for handling
209 high volumes of data.
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000210
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000211\item The \module{random} module has a new method called \method{getrandbits(N)}
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000212 which returns an N-bit long integer. This method supports the existing
213 \method{randrange()} method, making it possible to efficiently generate
214 arbitrarily large random numbers (suitable for prime number generation in
215 RSA applications).
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000216
217\item The regular expression language accepted by the \module{re} module
218 was extended with simple conditional expressions, written as
219 \code{(?(\var{group})\var{A}|\var{B})}. \var{group} is either a
220 numeric group ID or a group name defined with \code{(?P<group>...)}
221 earlier in the expression. If the specified group matched, the
222 regular expression pattern \var{A} will be tested against the string; if
223 the group didn't match, the pattern \var{B} will be used instead.
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000224
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000225\end{itemize}
226
227
228%======================================================================
229% whole new modules get described in \subsections here
230
231
232% ======================================================================
233\section{Build and C API Changes}
234
235Changes to Python's build process and to the C API include:
236
237\begin{itemize}
238
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000239 \item Three new convenience macros were added for common return
240 values from extension functions: \csimplemacro{Py_RETURN_NONE},
241 \csimplemacro{Py_RETURN_TRUE}, and \csimplemacro{Py_RETURN_FALSE}.
242
243 \item A new function, \cfunction{PyTuple_Pack(N, obj1, obj2, ...,
244 objN)}, constructs tuples from a variable length argument list of
245 Python objects.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000246
247\end{itemize}
248
249
250%======================================================================
251\subsection{Port-Specific Changes}
252
253Platform-specific changes go here.
254
255
256%======================================================================
257\section{Other Changes and Fixes \label{section-other}}
258
259As usual, there were a bunch of other improvements and bugfixes
260scattered throughout the source tree. A search through the CVS change
261logs finds there were XXX patches applied and YYY bugs fixed between
262Python 2.3 and 2.4. Both figures are likely to be underestimates.
263
264Some of the more notable changes are:
265
266\begin{itemize}
267
268\item Details go here.
269
270\end{itemize}
271
272
273%======================================================================
274\section{Porting to Python 2.4}
275
276This section lists previously described changes that may require
277changes to your code:
278
279\begin{itemize}
280
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000281\item The \function{zip()} built-in function and \function{itertools.izip()}
282 now return an empty list instead of raising a \exception{TypeError}
283 exception if called with no arguments.
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000284
285\item \function{dircache.listdir()} now passes exceptions to the caller
286 instead of returning empty lists.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000287
288\end{itemize}
289
290
291%======================================================================
292\section{Acknowledgements \label{acks}}
293
294The author would like to thank the following people for offering
295suggestions, corrections and assistance with various drafts of this
296article: .
297
298\end{document}