blob: 2e573b56b019b5c356f6439aac01aa8551c48412 [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
Raymond Hettingerd4462302003-11-26 17:52:45 +000015for Python 2.4 has been set; expect that this will happen mid-2004.
Fred Drakeed0fa3d2003-07-30 19:14:09 +000016
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
Raymond Hettinger7e0282f2003-11-24 07:14:54 +000028%======================================================================
29\section{PEP 218: Built-In Set Objects}
30
31Two new built-in types, \function{set(iterable)} and
32\function{frozenset(iterable)} provide high speed data types for
33membership testing, for eliminating duplicates from sequences, and
34for mathematical operations like unions, intersections, differences,
35and symmetric differences.
36
37\begin{verbatim}
38>>> a = set('abracadabra') # form a set from a string
39>>> 'z' in a # fast membership testing
40False
41>>> a # unique letters in a
42set(['a', 'r', 'b', 'c', 'd'])
43>>> ''.join(a) # convert back into a string
44'arbcd'
Raymond Hettingerd4462302003-11-26 17:52:45 +000045
Raymond Hettinger7e0282f2003-11-24 07:14:54 +000046>>> b = set('alacazam') # form a second set
47>>> a - b # letters in a but not in b
48set(['r', 'd', 'b'])
49>>> a | b # letters in either a or b
50set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
51>>> a & b # letters in both a and b
52set(['a', 'c'])
53>>> a ^ b # letters in a or b but not both
54set(['r', 'd', 'b', 'm', 'z', 'l'])
Raymond Hettingerd4462302003-11-26 17:52:45 +000055
Raymond Hettinger7e0282f2003-11-24 07:14:54 +000056>>> a.add('z') # add a new element
57>>> a.update('wxy') # add multiple new elements
58>>> a
59set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])
60>>> a.remove('x') # take one element out
61>>> a
62set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])
63\end{verbatim}
64
65The type \function{frozenset()} is an immutable version of \function{set()}.
66Since it is immutable and hashable, it may be used as a dictionary key or
67as a member of another set. Accordingly, it does not have methods
68like \method{add()} and \method{remove()} which could alter its contents.
69
70\begin{seealso}
71\seepep{218}{Adding a Built-In Set Object Type}{Originally proposed by
72Greg Wilson and ultimately implemented by Raymond Hettinger.}
73\end{seealso}
Fred Drakeed0fa3d2003-07-30 19:14:09 +000074
75%======================================================================
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000076\section{PEP 322: Reverse Iteration}
Fred Drakeed0fa3d2003-07-30 19:14:09 +000077
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000078A new built-in function, \function{reversed(seq)}, takes a sequence
79and returns an iterator that returns the elements of the sequence
80in reverse order.
81
82\begin{verbatim}
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000083>>> for i in reversed(xrange(1,4)):
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000084... print i
85...
863
872
881
89\end{verbatim}
90
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000091Compared to extended slicing, \code{range(1,4)[::-1]}, \function{reversed()}
92is easier to read, runs faster, and uses substantially less memory.
93
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000094Note that \function{reversed()} only accepts sequences, not arbitrary
Raymond Hettingerbc3cba22003-11-12 16:39:30 +000095iterators. If you want to reverse an iterator, first convert it to
96a list with \function{list()}.
Andrew M. Kuchling1a420252003-11-08 15:58:49 +000097
98\begin{verbatim}
99>>> input = open('/etc/passwd', 'r')
100>>> for line in reversed(list(input)):
101... print line
102...
103root:*:0:0:System Administrator:/var/root:/bin/tcsh
104 ...
105\end{verbatim}
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000106
Andrew M. Kuchlingf7a6b672003-11-08 16:05:37 +0000107\begin{seealso}
108\seepep{322}{Reverse Iteration}{Written and implemented by Raymond Hettinger.}
109
110\end{seealso}
111
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000112
113%======================================================================
114\section{Other Language Changes}
115
116Here are all of the changes that Python 2.4 makes to the core Python
117language.
118
119\begin{itemize}
Raymond Hettingerd4462302003-11-26 17:52:45 +0000120
121\item The string methods, \method{ljust()}, \method{rjust()}, and
122\method{center()} now take a optional argument for specifying a
123fill character other than a space.
124
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +0000125\item The \method{sort()} method of lists gained three keyword
126arguments, \var{cmp}, \var{key}, and \var{reverse}. These arguments
127make some common usages of \method{sort()} simpler. All are optional.
128
129\var{cmp} is the same as the previous single argument to
130\method{sort()}; if provided, the value should be a comparison
131function that takes two arguments and returns -1, 0, or +1 depending
132on how the arguments compare.
133
134\var{key} should be a single-argument function that takes a list
135element and returns a comparison key for the element. The list is
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000136then sorted using the comparison keys. The following example sorts a
137list case-insensitively:
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +0000138
139\begin{verbatim}
140>>> L = ['A', 'b', 'c', 'D']
141>>> L.sort() # Case-sensitive sort
142>>> L
143['A', 'D', 'b', 'c']
144>>> L.sort(key=lambda x: x.lower())
145>>> L
146['A', 'b', 'c', 'D']
147>>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
148>>> L
149['A', 'b', 'c', 'D']
150\end{verbatim}
151
152The last example, which uses the \var{cmp} parameter, is the old way
153to perform a case-insensitive sort. It works, but is slower than
154using a \var{key} parameter. Using \var{key} results in calling the
155\method{lower()} method once for each element in the list while using
156\var{cmp} will call the method twice for each comparison.
157
Andrew M. Kuchling981a9182003-11-13 21:33:26 +0000158For simple key functions and comparison functions, it is often
159possible to avoid a \keyword{lambda} expression by using an unbound
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000160method instead. For example, the above case-insensitive sort is best
161coded as:
162
163\begin{verbatim}
164>>> L.sort(key=str.lower)
165>>> L
166['A', 'b', 'c', 'D']
167\end{verbatim}
168
Andrew M. Kuchling2fb4d512003-10-21 12:31:16 +0000169The \var{reverse} parameter should have a Boolean value. If the value is
170\constant{True}, the list will be sorted into reverse order. Instead
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000171of \code{L.sort(lambda x,y: cmp(y.score, x.score))}, you can now write:
172\code{L.sort(key = lambda x: x.score, reverse=True)}.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000173
Andrew M. Kuchling981a9182003-11-13 21:33:26 +0000174The results of sorting are now guaranteed to be stable. This means
175that two entries with equal keys will be returned in the same order as
176they were input. For example, you can sort a list of people by name,
177and then sort the list by age, resulting in a list sorted by age where
178people with the same age are in name-sorted order.
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000179
180\item The list type gained a \method{sorted(iterable)} method that works
181like the in-place \method{sort()} method but has been made suitable for
182use in expressions. The differences are:
183 \begin{itemize}
Raymond Hettinger7d1dd042003-11-12 16:42:10 +0000184 \item the input may be any iterable;
185 \item a newly formed copy is sorted, leaving the original intact; and
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000186 \item the expression returns the new sorted copy
187 \end{itemize}
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000188
189\begin{verbatim}
190>>> L = [9,7,8,3,2,4,1,6,5]
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000191>>> [10+i for i in list.sorted(L)] # usable in a list comprehension
192[11, 12, 13, 14, 15, 16, 17, 18, 19]
193>>> L = [9,7,8,3,2,4,1,6,5] # original is left unchanged
194[9,7,8,3,2,4,1,6,5]
Raymond Hettingerd4462302003-11-26 17:52:45 +0000195
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000196>>> list.sorted('Monte Python') # any iterable may be an input
197[' ', 'M', 'P', 'e', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y']
Raymond Hettingerd4462302003-11-26 17:52:45 +0000198
199>>> # List the contents of a dict sorted by key values
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000200>>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
201>>> for k, v in list.sorted(colormap.iteritems()):
202... print k, v
203...
204black 4
205blue 2
206green 3
207red 1
208yellow 5
209
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000210\end{verbatim}
211
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000212
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000213\item The \function{zip()} built-in function and \function{itertools.izip()}
Raymond Hettingerd4462302003-11-26 17:52:45 +0000214 now returns an empty list instead of raising a \exception{TypeError}
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000215 exception if called with no arguments. This makes the functions more
216 suitable for use with variable length argument lists:
217
218\begin{verbatim}
219>>> def transpose(array):
220... return zip(*array)
221...
222>>> transpose([(1,2,3), (4,5,6)])
223[(1, 4), (2, 5), (3, 6)]
224>>> transpose([])
225[]
226\end{verbatim}
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000227
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000228\end{itemize}
229
230
231%======================================================================
232\subsection{Optimizations}
233
234\begin{itemize}
235
236\item Optimizations should be described here.
237
238\end{itemize}
239
240The net result of the 2.4 optimizations is that Python 2.4 runs the
241pystone benchmark around XX\% faster than Python 2.3 and YY\% faster
242than Python 2.2.
243
244
245%======================================================================
246\section{New, Improved, and Deprecated Modules}
247
248As usual, Python's standard library received a number of enhancements and
249bug fixes. Here's a partial list of the most notable changes, sorted
250alphabetically by module name. Consult the
251\file{Misc/NEWS} file in the source tree for a more
252complete list of changes, or look through the CVS logs for all the
253details.
254
255\begin{itemize}
256
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000257\item The \module{curses} modules now supports the ncurses extension
258 \function{use_default_colors()}. On platforms where the terminal
259 supports transparency, this makes it possible to use a transparent background.
260 (Contributed by J\"org Lehmann.)
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000261
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000262\item The \module{heapq} module has been converted to C. The resulting
263 ten-fold improvement in speed makes the module suitable for handling
264 high volumes of data.
Andrew M. Kuchling1a420252003-11-08 15:58:49 +0000265
Andrew M. Kuchlingdff9dbd2003-11-20 22:22:19 +0000266\item The \module{imaplib} module now supports IMAP's THREAD command.
267(Contributed by Yves Dionne.)
268
269\item A new \function{getsid()} function was added to the
270\module{posix} module that underlies the \module{os} module.
271(Contributed by J. Raynor.)
272
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000273\item The \module{random} module has a new method called \method{getrandbits(N)}
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000274 which returns an N-bit long integer. This method supports the existing
275 \method{randrange()} method, making it possible to efficiently generate
276 arbitrarily large random numbers (suitable for prime number generation in
277 RSA applications).
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000278
279\item The regular expression language accepted by the \module{re} module
280 was extended with simple conditional expressions, written as
281 \code{(?(\var{group})\var{A}|\var{B})}. \var{group} is either a
282 numeric group ID or a group name defined with \code{(?P<group>...)}
283 earlier in the expression. If the specified group matched, the
284 regular expression pattern \var{A} will be tested against the string; if
285 the group didn't match, the pattern \var{B} will be used instead.
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +0000286
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000287\end{itemize}
288
289
290%======================================================================
291% whole new modules get described in \subsections here
292
293
294% ======================================================================
295\section{Build and C API Changes}
296
297Changes to Python's build process and to the C API include:
298
299\begin{itemize}
300
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000301 \item Three new convenience macros were added for common return
302 values from extension functions: \csimplemacro{Py_RETURN_NONE},
303 \csimplemacro{Py_RETURN_TRUE}, and \csimplemacro{Py_RETURN_FALSE}.
304
305 \item A new function, \cfunction{PyTuple_Pack(N, obj1, obj2, ...,
306 objN)}, constructs tuples from a variable length argument list of
307 Python objects.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000308
Raymond Hettingerd4462302003-11-26 17:52:45 +0000309 \item A new function, \function{PyDict_Contains(d, k)}, implements
310 fast dictionary lookups without masking exceptions raised during
311 the loop-up process (compare with \function{PySequence_Contains()}
312 which is slower or \function{PyMapping_HasKey()} which clears all
313 exceptions).
314
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000315\end{itemize}
316
317
318%======================================================================
319\subsection{Port-Specific Changes}
320
321Platform-specific changes go here.
322
323
324%======================================================================
325\section{Other Changes and Fixes \label{section-other}}
326
327As usual, there were a bunch of other improvements and bugfixes
328scattered throughout the source tree. A search through the CVS change
329logs finds there were XXX patches applied and YYY bugs fixed between
330Python 2.3 and 2.4. Both figures are likely to be underestimates.
331
332Some of the more notable changes are:
333
334\begin{itemize}
335
336\item Details go here.
337
338\end{itemize}
339
340
341%======================================================================
342\section{Porting to Python 2.4}
343
344This section lists previously described changes that may require
345changes to your code:
346
347\begin{itemize}
348
Raymond Hettinger607c00f2003-11-12 16:27:50 +0000349\item The \function{zip()} built-in function and \function{itertools.izip()}
350 now return an empty list instead of raising a \exception{TypeError}
351 exception if called with no arguments.
Andrew M. Kuchling6aedcfc2003-10-21 12:48:23 +0000352
353\item \function{dircache.listdir()} now passes exceptions to the caller
354 instead of returning empty lists.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000355
356\end{itemize}
357
358
359%======================================================================
360\section{Acknowledgements \label{acks}}
361
362The author would like to thank the following people for offering
363suggestions, corrections and assistance with various drafts of this
Andrew M. Kuchling981a9182003-11-13 21:33:26 +0000364article: Raymond Hettinger.
Fred Drakeed0fa3d2003-07-30 19:14:09 +0000365
366\end{document}