Complete the rewrite pass; add a few more items; bump version number to 0.90; remove comment about draft status

This commit is contained in:
Andrew M. Kuchling 2003-07-17 23:56:58 +00:00
parent 8aca417483
commit 8744f12a2f

View file

@ -3,7 +3,7 @@
% $Id$ % $Id$
\title{What's New in Python 2.3} \title{What's New in Python 2.3}
\release{0.11} \release{0.90}
\author{A.M.\ Kuchling} \author{A.M.\ Kuchling}
\authoraddress{\email{amk@amk.ca}} \authoraddress{\email{amk@amk.ca}}
@ -13,7 +13,6 @@
% To do: % To do:
% PYTHONINSPECT % PYTHONINSPECT
% file.encoding
% doctest extensions % doctest extensions
% new version of IDLE % new version of IDLE
% XML-RPC nil extension % XML-RPC nil extension
@ -21,10 +20,6 @@
%\section{Introduction \label{intro}} %\section{Introduction \label{intro}}
{\large This article is a draft, and is currently up to date for
Python 2.3rc1. Please send any additions, comments or errata to the
author.}
This article explains the new features in Python 2.3. The tentative This article explains the new features in Python 2.3. The tentative
release date of Python 2.3 is currently scheduled for August 2003. release date of Python 2.3 is currently scheduled for August 2003.
@ -1189,6 +1184,15 @@ now trigger \exception{PendingDeprecationWarning}.
\exception{SyntaxWarning} warning. In a future version of Python, \exception{SyntaxWarning} warning. In a future version of Python,
\code{None} may finally become a keyword. \code{None} may finally become a keyword.
\item The \method{xreadlines()} method of file objects, introduced in
Python 2.1, is no longer necessary because files now behave as their
own iterator. \method{xreadlines()} was originally introduced as a
faster way to loop over all the lines in a file, but now you can
simply write \code{for line in file_obj}. File objects also have a
new read-only \member{encoding} attribute that gives the encoding used
by the file; Unicode strings written to the file will be automatically
converted to bytes using the given encoding.
\item The method resolution order used by new-style classes has \item The method resolution order used by new-style classes has
changed, though you'll only notice the difference if you have a really changed, though you'll only notice the difference if you have a really
complicated inheritance hierarchy. Classic classes are unaffected by complicated inheritance hierarchy. Classic classes are unaffected by
@ -1288,7 +1292,7 @@ u'\u4001abc'
(Suggested by Simon Brunning and implemented by Walter D\"orwald.) (Suggested by Simon Brunning and implemented by Walter D\"orwald.)
\item The \method{startswith()} and \method{endswith()} \item The \method{startswith()} and \method{endswith()}
string methods now accept negative numbers for the start and end string methods now accept negative numbers for the \var{start} and \var{end}
parameters. parameters.
\item Another new string method is \method{zfill()}, originally a \item Another new string method is \method{zfill()}, originally a
@ -1314,7 +1318,7 @@ than \method{zfill()}.
either kind of string. It's a completely abstract type, so you either kind of string. It's a completely abstract type, so you
can't create \class{basestring} instances. can't create \class{basestring} instances.
\item Interned strings are no longer immortal, and will now be \item Interned strings are no longer immortal and will now be
garbage-collected in the usual way when the only reference to them is garbage-collected in the usual way when the only reference to them is
from the internal dictionary of interned strings. (Implemented by from the internal dictionary of interned strings. (Implemented by
Oren Tirosh.) Oren Tirosh.)
@ -1350,12 +1354,15 @@ See section~\ref{section-other} for a longer explanation.
\code{for i in range(n)}. (Patch by Raymond Hettinger.) \code{for i in range(n)}. (Patch by Raymond Hettinger.)
\item A number of small rearrangements have been made in various \item A number of small rearrangements have been made in various
hotspots to improve performance, inlining a function here, removing hotspots to improve performance, such as inlining a function or removing
some code there. (Implemented mostly by GvR, but lots of people have some code. (Implemented mostly by GvR, but lots of people have
contributed single changes.) contributed single changes.)
\end{itemize} \end{itemize}
The net result of the 2.3 optimizations is that Python 2.3 runs the
pystone benchmark around 25\% faster than Python 2.2.
%====================================================================== %======================================================================
\section{New, Improved, and Deprecated Modules} \section{New, Improved, and Deprecated Modules}
@ -1379,25 +1386,29 @@ contents, and the \code{*=} assignment operator to repeat an array.
of the \ulink{PyBSDDB}{http://pybsddb.sourceforge.net} package, of the \ulink{PyBSDDB}{http://pybsddb.sourceforge.net} package,
providing a more complete interface to the transactional features of providing a more complete interface to the transactional features of
the BerkeleyDB library. the BerkeleyDB library.
The old version of the module has been renamed to The old version of the module has been renamed to
\module{bsddb185} and is no longer built automatically; you'll \module{bsddb185} and is no longer built automatically; you'll
have to edit \file{Modules/Setup} to enable it. Note that the new have to edit \file{Modules/Setup} to enable it. Note that the new
\module{bsddb} package is intended to be compatible with the \module{bsddb} package is intended to be compatible with the
old module, so be sure to file bugs if you discover any old module, so be sure to file bugs if you discover any
incompatibilities. When upgrading to Python 2.3, if you also change incompatibilities. When upgrading to Python 2.3, if the new interpreter is compiled
with a new version of
the underlying BerkeleyDB library, you will almost certainly have to the underlying BerkeleyDB library, you will almost certainly have to
convert your database files to the new version. You can do this convert your database files to the new version. You can do this
fairly easily with the new scripts \file{db2pickle.py} and fairly easily with the new scripts \file{db2pickle.py} and
\file{pickle2db.py} which you will find in the distribution's \file{pickle2db.py} which you will find in the distribution's
Tools/scripts directory. If you've already been using the PyBSDDB \file{Tools/scripts} directory. If you've already been using the PyBSDDB
package and importing it as \module{bsddb3}, you will have to change your package and importing it as \module{bsddb3}, you will have to change your
\code{import} statements. \code{import} statements to import it as \module{bsddb}.
\item The new \module{bz2} module is an interface to the bz2 data \item The new \module{bz2} module is an interface to the bz2 data
compression library. bz2 usually produces output that's smaller than compression library. bz2-compressed data is usually smaller than
the compressed output from the \module{zlib} module, meaning that it corresponding \module{zlib}-compressed data. (Contributed by Gustavo Niemeyer.)
compresses data more highly. (Contributed by Gustavo Niemeyer.)
\item A set of standard date/type types has been added in the new \module{datetime}
module. See the following section for more details.
\item The Distutils \class{Extension} class now supports \item The Distutils \class{Extension} class now supports
an extra constructor argument named \var{depends} for listing an extra constructor argument named \var{depends} for listing
additional source files that an extension depends on. This lets additional source files that an extension depends on. This lets
@ -1421,6 +1432,12 @@ it now checks for the \envvar{CC}, \envvar{CFLAGS}, \envvar{CPP},
them to override the settings in Python's configuration (contributed them to override the settings in Python's configuration (contributed
by Robert Weber). by Robert Weber).
\item Previously the \module{doctest} module would only search the
docstrings of public methods and functions for test cases, but it now
also examines private ones as well. The \function{DocTestSuite(}
function creates a \class{unittest.TestSuite} object from a set of
\module{doctest} tests.
\item The new \function{gc.get_referents(\var{object})} function returns a \item The new \function{gc.get_referents(\var{object})} function returns a
list of all the objects referenced by \var{object}. list of all the objects referenced by \var{object}.
@ -1466,7 +1483,7 @@ information about the priority queue data structure.)
The \module{heapq} module provides \function{heappush()} and The \module{heapq} module provides \function{heappush()} and
\function{heappop()} functions for adding and removing items while \function{heappop()} functions for adding and removing items while
maintaining the heap property on top of some other mutable Python maintaining the heap property on top of some other mutable Python
sequence type. For example: sequence type. Here's an example that uses a Python list:
\begin{verbatim} \begin{verbatim}
>>> import heapq >>> import heapq
@ -1510,15 +1527,16 @@ radians. Also, an optional \var{base} argument was added to
bases other than \code{e} and \code{10}. (Contributed by Raymond bases other than \code{e} and \code{10}. (Contributed by Raymond
Hettinger.) Hettinger.)
\item Several new functions (\function{getpgid()}, \function{killpg()}, \item Several new POSIX functions (\function{getpgid()}, \function{killpg()},
\function{lchown()}, \function{loadavg()}, \function{major()}, \function{makedev()}, \function{lchown()}, \function{loadavg()}, \function{major()}, \function{makedev()},
\function{minor()}, and \function{mknod()}) were added to the \function{minor()}, and \function{mknod()}) were added to the
\module{posix} module that underlies the \module{os} module. \module{posix} module that underlies the \module{os} module.
(Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S. Otkidach.) (Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S. Otkidach.)
\item In the \module{os} module, the \function{*stat()} family of functions can now report \item In the \module{os} module, the \function{*stat()} family of
fractions of a second in a timestamp. Such time stamps are functions can now report fractions of a second in a timestamp. Such
represented as floats, similar to \function{time.time()}. time stamps are represented as floats, similar to
the value returned by \function{time.time()}.
During testing, it was found that some applications will break if time During testing, it was found that some applications will break if time
stamps are floats. For compatibility, when using the tuple interface stamps are floats. For compatibility, when using the tuple interface
@ -1544,6 +1562,11 @@ stamps, or if they use the tuple API. If used, the feature should be
activated on an application level instead of trying to enable it on a activated on an application level instead of trying to enable it on a
per-use basis. per-use basis.
\item The \module{optparse} module contains a new parser for command-line arguments
that can convert option values to a particular Python type
and will automatically generate a usage message. See the following section for
more details.
\item The old and never-documented \module{linuxaudiodev} module has \item The old and never-documented \module{linuxaudiodev} module has
been deprecated, and a new version named \module{ossaudiodev} has been been deprecated, and a new version named \module{ossaudiodev} has been
added. The module was renamed because the OSS sound drivers can be added. The module was renamed because the OSS sound drivers can be
@ -1554,7 +1577,7 @@ Ward and Nicholas FitzRoy-Dale.)
\item The new \module{platform} module contains a number of functions \item The new \module{platform} module contains a number of functions
that try to determine various properties of the platform you're that try to determine various properties of the platform you're
running on. There are functions for getting the architecture, CPU running on. There are functions for getting the architecture, CPU
type, the Windows OS version, and even the Linux distribution version. type, the Windows OS version, and even the Linux distribution version.
(Contributed by Marc-Andr\'e Lemburg.) (Contributed by Marc-Andr\'e Lemburg.)
\item The parser objects provided by the \module{pyexpat} module \item The parser objects provided by the \module{pyexpat} module
@ -1564,12 +1587,11 @@ the parser object's \member{buffer_text} attribute to \constant{True}
will enable buffering. will enable buffering.
\item The \function{sample(\var{population}, \var{k})} function was \item The \function{sample(\var{population}, \var{k})} function was
added to the \module{random} module. \var{population} is a sequence added to the \module{random} module. \var{population} is a sequence or
or \class{xrange} object containing the elements of a population, and \class{xrange} object containing the elements of a population, and
\function{sample()} \function{sample()} chooses \var{k} elements from the population without
chooses \var{k} elements from the population without replacing chosen replacing chosen elements. \var{k} can be any value up to
elements. \var{k} can be any value up to \code{len(\var{population})}. \code{len(\var{population})}. For example:
For example:
\begin{verbatim} \begin{verbatim}
>>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn'] >>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn']
@ -1697,14 +1719,14 @@ except ImportError:
import dummy_threading as _threading import dummy_threading as _threading
\end{verbatim} \end{verbatim}
Code can then call functions and use classes in \module{_threading} In this example, \module{_threading} is used as the module name to make
whether or not threads are supported, avoiding an \keyword{if} it clear that the module being used is not necessarily the actual
statement and making the code slightly clearer. This module will not \module{threading} module. Code can call functions and use classes in
magically make multithreaded code run without threads; code that waits \module{_threading} whether or not threads are supported, avoiding an
for another thread to return or to do something will simply hang \keyword{if} statement and making the code slightly clearer. This
forever. (In this example, \module{_threading} is used as the module module will not magically make multithreaded code run without threads;
name to make it clear that the module being used is not necessarily code that waits for another thread to return or to do something will
the actual \module{threading} module.) simply hang forever.
\item The \module{time} module's \function{strptime()} function has \item The \module{time} module's \function{strptime()} function has
long been an annoyance because it uses the platform C library's long been an annoyance because it uses the platform C library's
@ -1736,59 +1758,6 @@ print timer2.repeat(repeat=3, number=100000)
# [0.17574405670166016, 0.18193507194519043, 0.17565798759460449] # [0.17574405670166016, 0.18193507194519043, 0.17565798759460449]
\end{verbatim} \end{verbatim}
\item The \module{UserDict} module has a new \class{DictMixin} class which
defines all dictionary methods for classes that already have a minimum
mapping interface. This greatly simplifies writing classes that need
to be substitutable for dictionaries, such as the classes in
the \module{shelve} module.
Adding the mixin as a superclass provides the full dictionary
interface whenever the class defines \method{__getitem__},
\method{__setitem__}, \method{__delitem__}, and \method{keys}.
For example:
\begin{verbatim}
>>> import UserDict
>>> class SeqDict(UserDict.DictMixin):
"""Dictionary lookalike implemented with lists."""
def __init__(self):
self.keylist = []
self.valuelist = []
def __getitem__(self, key):
try:
i = self.keylist.index(key)
except ValueError:
raise KeyError
return self.valuelist[i]
def __setitem__(self, key, value):
try:
i = self.keylist.index(key)
self.valuelist[i] = value
except ValueError:
self.keylist.append(key)
self.valuelist.append(value)
def __delitem__(self, key):
try:
i = self.keylist.index(key)
except ValueError:
raise KeyError
self.keylist.pop(i)
self.valuelist.pop(i)
def keys(self):
return list(self.keylist)
>>> s = SeqDict()
>>> dir(s) # See that other dictionary methods are implemented
['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
'__init__', '__iter__', '__len__', '__module__', '__repr__',
'__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
'setdefault', 'update', 'valuelist', 'values']
\end{verbatim}
(Contributed by Raymond Hettinger.)
\item The \module{Tix} module has received various bug fixes and \item The \module{Tix} module has received various bug fixes and
updates for the current version of the Tix package. updates for the current version of the Tix package.
@ -1801,7 +1770,7 @@ when a widget is accessed from a different thread by marshalling a
command, passing it to the correct thread, and waiting for the command, passing it to the correct thread, and waiting for the
results. Other interfaces can't be handled automatically but results. Other interfaces can't be handled automatically but
\module{Tkinter} will now raise an exception on such an access so that \module{Tkinter} will now raise an exception on such an access so that
at least you can find out about the problem. See you can at least find out about the problem. See
\url{http://mail.python.org/pipermail/python-dev/2002-December/031107.html} % \url{http://mail.python.org/pipermail/python-dev/2002-December/031107.html} %
for a more detailed explanation of this change. (Implemented by for a more detailed explanation of this change. (Implemented by
Martin von~L\"owis.) Martin von~L\"owis.)
@ -1829,6 +1798,59 @@ Tkinter.wantobjects = 0
Any breakage caused by this change should be reported as a bug. Any breakage caused by this change should be reported as a bug.
\item The \module{UserDict} module has a new \class{DictMixin} class which
defines all dictionary methods for classes that already have a minimum
mapping interface. This greatly simplifies writing classes that need
to be substitutable for dictionaries, such as the classes in
the \module{shelve} module.
Adding the mix-in as a superclass provides the full dictionary
interface whenever the class defines \method{__getitem__},
\method{__setitem__}, \method{__delitem__}, and \method{keys}.
For example:
\begin{verbatim}
>>> import UserDict
>>> class SeqDict(UserDict.DictMixin):
... """Dictionary lookalike implemented with lists."""
... def __init__(self):
... self.keylist = []
... self.valuelist = []
... def __getitem__(self, key):
... try:
... i = self.keylist.index(key)
... except ValueError:
... raise KeyError
... return self.valuelist[i]
... def __setitem__(self, key, value):
... try:
... i = self.keylist.index(key)
... self.valuelist[i] = value
... except ValueError:
... self.keylist.append(key)
... self.valuelist.append(value)
... def __delitem__(self, key):
... try:
... i = self.keylist.index(key)
... except ValueError:
... raise KeyError
... self.keylist.pop(i)
... self.valuelist.pop(i)
... def keys(self):
... return list(self.keylist)
...
>>> s = SeqDict()
>>> dir(s) # See that other dictionary methods are implemented
['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
'__init__', '__iter__', '__len__', '__module__', '__repr__',
'__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
'setdefault', 'update', 'valuelist', 'values']
\end{verbatim}
(Contributed by Raymond Hettinger.)
\item The DOM implementation \item The DOM implementation
in \module{xml.dom.minidom} can now generate XML output in a in \module{xml.dom.minidom} can now generate XML output in a
particular encoding by providing an optional encoding argument to particular encoding by providing an optional encoding argument to
@ -1860,8 +1882,8 @@ version of the domain name. \module{urllib} supports Unicode URLs
with non-ASCII host names as long as the \code{path} part of the URL with non-ASCII host names as long as the \code{path} part of the URL
is ASCII only. is ASCII only.
To implement this change, the module \module{stringprep}, the tool To implement this change, the \module{stringprep} module, the
\code{mkstringprep} and the \code{punycode} encoding have been added. \code{mkstringprep} tool and the \code{punycode} encoding have been added.
\end{itemize} \end{itemize}
@ -1904,7 +1926,7 @@ objects:
\end{verbatim} \end{verbatim}
The \method{replace()} method allows modifying one or more fields The \method{replace()} method allows modifying one or more fields
of a \class{date} or \class{datetime} instance: of a \class{date} or \class{datetime} instance, returning a new instance:
\begin{verbatim} \begin{verbatim}
>>> d = datetime.datetime.now() >>> d = datetime.datetime.now()
@ -1919,7 +1941,7 @@ Instances can be compared, hashed, and converted to strings (the
result is the same as that of \method{isoformat()}). \class{date} and result is the same as that of \method{isoformat()}). \class{date} and
\class{datetime} instances can be subtracted from each other, and \class{datetime} instances can be subtracted from each other, and
added to \class{timedelta} instances. The largest missing feature is added to \class{timedelta} instances. The largest missing feature is
that there's no support for parsing strings and getting back a that there's no standard library support for parsing strings and getting back a
\class{date} or \class{datetime}. \class{date} or \class{datetime}.
For more information, refer to the \ulink{module's reference For more information, refer to the \ulink{module's reference
@ -1956,14 +1978,12 @@ Parsing a command line is then done by calling the \method{parse_args()}
method. method.
\begin{verbatim} \begin{verbatim}
import optparse options, args = op.parse_args(sys.argv[1:])
options, args = optparse.parse_args(sys.argv[1:])
print options print options
print args print args
\end{verbatim} \end{verbatim}
This returns an object containing all of the option values, This returns an object containing all of the option values,
and a list of strings containing the remaining arguments. and a list of strings containing the remaining arguments.
Invoking the script with the various arguments now works as you'd Invoking the script with the various arguments now works as you'd
@ -2045,7 +2065,7 @@ As part of this change, the confusing multiple interfaces for
allocating memory have been consolidated down into two API families. allocating memory have been consolidated down into two API families.
Memory allocated with one family must not be manipulated with Memory allocated with one family must not be manipulated with
functions from the other family. There is one family for allocating functions from the other family. There is one family for allocating
chunks of memory, and another family of functions specifically for chunks of memory and another family of functions specifically for
allocating Python objects. allocating Python objects.
\begin{itemize} \begin{itemize}
@ -2094,9 +2114,9 @@ Changes to Python's build process and to the C API include:
\begin{itemize} \begin{itemize}
\item The C-level interface to the garbage collector has been changed, \item The C-level interface to the garbage collector has been changed
to make it easier to write extension types that support garbage to make it easier to write extension types that support garbage
collection, and to make it easier to debug misuses of the functions. collection and to debug misuses of the functions.
Various functions have slightly different semantics, so a bunch of Various functions have slightly different semantics, so a bunch of
functions had to be renamed. Extensions that use the old API will functions had to be renamed. Extensions that use the old API will
still compile but will \emph{not} participate in garbage collection, still compile but will \emph{not} participate in garbage collection,
@ -2122,7 +2142,7 @@ allocate objects, and \cfunction{PyObject_GC_Del} to deallocate them.
\end{itemize} \end{itemize}
\item The cycle detection implementation used by the garbage collection \item The cycle detection implementation used by the garbage collection
has proven to be stable, so it's now being made mandatory; you can no has proven to be stable, so it's now been made mandatory. You can no
longer compile Python without it, and the longer compile Python without it, and the
\longprogramopt{with-cycle-gc} switch to \program{configure} has been removed. \longprogramopt{with-cycle-gc} switch to \program{configure} has been removed.
@ -2155,16 +2175,9 @@ pre-2.2 versions of Python is important, the code could use
than using \constant{METH_NOARGS}. than using \constant{METH_NOARGS}.
\item A new function, \cfunction{PyObject_DelItemString(\var{mapping}, \item A new function, \cfunction{PyObject_DelItemString(\var{mapping},
char *\var{key})} was added char *\var{key})} was added as shorthand for
as shorthand for
\code{PyObject_DelItem(\var{mapping}, PyString_New(\var{key}))}. \code{PyObject_DelItem(\var{mapping}, PyString_New(\var{key}))}.
\item The \method{xreadlines()} method of file objects, introduced in
Python 2.1, is no longer necessary because files now behave as their
own iterator. \method{xreadlines()} was originally introduced as a
faster way to loop over all the lines in a file, but now you can
simply write \code{for line in file_obj}.
\item File objects now manage their internal string buffer \item File objects now manage their internal string buffer
differently, increasing it exponentially when needed. This results in differently, increasing it exponentially when needed. This results in
the benchmark tests in \file{Lib/test/test_bufio.py} speeding up the benchmark tests in \file{Lib/test/test_bufio.py} speeding up
@ -2314,9 +2327,9 @@ For example, to clear just the top bit (bit 31), you could write
\item The Distutils \function{setup()} function has gained various new \item The Distutils \function{setup()} function has gained various new
keyword arguments such as \var{depends}. Old versions of the keyword arguments such as \var{depends}. Old versions of the
Distutils will abort if passed unknown keywords. The fix is to check Distutils will abort if passed unknown keywords. A solution is to check
for the presence of the new \function{get_distutil_options()} function for the presence of the new \function{get_distutil_options()} function
in your \file{setup.py} if you want to only support the new keywords in your \file{setup.py} and only uses the new keywords
with a version of the Distutils that supports them: with a version of the Distutils that supports them:
\begin{verbatim} \begin{verbatim}