diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
commit | 458120dd40db6b4df55a4e96b650e16798ef06a0 (patch) | |
tree | 8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex | |
parent | 3a742c699f6806c1145aea5149bf15de15a0afd7 (diff) |
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex')
-rw-r--r-- | sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex | 868 |
1 files changed, 868 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex b/sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex new file mode 100644 index 000000000..53a179bfb --- /dev/null +++ b/sys/src/cmd/python/Doc/whatsnew/whatsnew21.tex @@ -0,0 +1,868 @@ +\documentclass{howto} + +\usepackage{distutils} + +% $Id: whatsnew21.tex 50964 2006-07-30 03:03:43Z fred.drake $ + +\title{What's New in Python 2.1} +\release{1.01} +\author{A.M. Kuchling} +\authoraddress{ + \strong{Python Software Foundation}\\ + Email: \email{amk@amk.ca} +} +\begin{document} +\maketitle\tableofcontents + +\section{Introduction} + +This article explains the new features in Python 2.1. While there aren't as +many changes in 2.1 as there were in Python 2.0, there are still some +pleasant surprises in store. 2.1 is the first release to be steered +through the use of Python Enhancement Proposals, or PEPs, so most of +the sizable changes have accompanying PEPs that provide more complete +documentation and a design rationale for the change. This article +doesn't attempt to document the new features completely, but simply +provides an overview of the new features for Python programmers. +Refer to the Python 2.1 documentation, or to the specific PEP, for +more details about any new feature that particularly interests you. + +One recent goal of the Python development team has been to accelerate +the pace of new releases, with a new release coming every 6 to 9 +months. 2.1 is the first release to come out at this faster pace, with +the first alpha appearing in January, 3 months after the final version +of 2.0 was released. + +The final release of Python 2.1 was made on April 17, 2001. + +%====================================================================== +\section{PEP 227: Nested Scopes} + +The largest change in Python 2.1 is to Python's scoping rules. In +Python 2.0, at any given time there are at most three namespaces used +to look up variable names: local, module-level, and the built-in +namespace. This often surprised people because it didn't match their +intuitive expectations. For example, a nested recursive function +definition doesn't work: + +\begin{verbatim} +def f(): + ... + def g(value): + ... + return g(value-1) + 1 + ... +\end{verbatim} + +The function \function{g()} will always raise a \exception{NameError} +exception, because the binding of the name \samp{g} isn't in either +its local namespace or in the module-level namespace. This isn't much +of a problem in practice (how often do you recursively define interior +functions like this?), but this also made using the \keyword{lambda} +statement clumsier, and this was a problem in practice. In code which +uses \keyword{lambda} you can often find local variables being copied +by passing them as the default values of arguments. + +\begin{verbatim} +def find(self, name): + "Return list of any entries equal to 'name'" + L = filter(lambda x, name=name: x == name, + self.list_attribute) + return L +\end{verbatim} + +The readability of Python code written in a strongly functional style +suffers greatly as a result. + +The most significant change to Python 2.1 is that static scoping has +been added to the language to fix this problem. As a first effect, +the \code{name=name} default argument is now unnecessary in the above +example. Put simply, when a given variable name is not assigned a +value within a function (by an assignment, or the \keyword{def}, +\keyword{class}, or \keyword{import} statements), references to the +variable will be looked up in the local namespace of the enclosing +scope. A more detailed explanation of the rules, and a dissection of +the implementation, can be found in the PEP. + +This change may cause some compatibility problems for code where the +same variable name is used both at the module level and as a local +variable within a function that contains further function definitions. +This seems rather unlikely though, since such code would have been +pretty confusing to read in the first place. + +One side effect of the change is that the \code{from \var{module} +import *} and \keyword{exec} statements have been made illegal inside +a function scope under certain conditions. The Python reference +manual has said all along that \code{from \var{module} import *} is +only legal at the top level of a module, but the CPython interpreter +has never enforced this before. As part of the implementation of +nested scopes, the compiler which turns Python source into bytecodes +has to generate different code to access variables in a containing +scope. \code{from \var{module} import *} and \keyword{exec} make it +impossible for the compiler to figure this out, because they add names +to the local namespace that are unknowable at compile time. +Therefore, if a function contains function definitions or +\keyword{lambda} expressions with free variables, the compiler will +flag this by raising a \exception{SyntaxError} exception. + +To make the preceding explanation a bit clearer, here's an example: + +\begin{verbatim} +x = 1 +def f(): + # The next line is a syntax error + exec 'x=2' + def g(): + return x +\end{verbatim} + +Line 4 containing the \keyword{exec} statement is a syntax error, +since \keyword{exec} would define a new local variable named \samp{x} +whose value should be accessed by \function{g()}. + +This shouldn't be much of a limitation, since \keyword{exec} is rarely +used in most Python code (and when it is used, it's often a sign of a +poor design anyway). + +Compatibility concerns have led to nested scopes being introduced +gradually; in Python 2.1, they aren't enabled by default, but can be +turned on within a module by using a future statement as described in +PEP 236. (See the following section for further discussion of PEP +236.) In Python 2.2, nested scopes will become the default and there +will be no way to turn them off, but users will have had all of 2.1's +lifetime to fix any breakage resulting from their introduction. + +\begin{seealso} + +\seepep{227}{Statically Nested Scopes}{Written and implemented by +Jeremy Hylton.} + +\end{seealso} + + +%====================================================================== +\section{PEP 236: __future__ Directives} + +The reaction to nested scopes was widespread concern about the dangers +of breaking code with the 2.1 release, and it was strong enough to +make the Pythoneers take a more conservative approach. This approach +consists of introducing a convention for enabling optional +functionality in release N that will become compulsory in release N+1. + +The syntax uses a \code{from...import} statement using the reserved +module name \module{__future__}. Nested scopes can be enabled by the +following statement: + +\begin{verbatim} +from __future__ import nested_scopes +\end{verbatim} + +While it looks like a normal \keyword{import} statement, it's not; +there are strict rules on where such a future statement can be put. +They can only be at the top of a module, and must precede any Python +code or regular \keyword{import} statements. This is because such +statements can affect how the Python bytecode compiler parses code and +generates bytecode, so they must precede any statement that will +result in bytecodes being produced. + +\begin{seealso} + +\seepep{236}{Back to the \module{__future__}}{Written by Tim Peters, +and primarily implemented by Jeremy Hylton.} + +\end{seealso} + +%====================================================================== +\section{PEP 207: Rich Comparisons} + +In earlier versions, Python's support for implementing comparisons on +user-defined classes and extension types was quite simple. Classes +could implement a \method{__cmp__} method that was given two instances +of a class, and could only return 0 if they were equal or +1 or -1 if +they weren't; the method couldn't raise an exception or return +anything other than a Boolean value. Users of Numeric Python often +found this model too weak and restrictive, because in the +number-crunching programs that numeric Python is used for, it would be +more useful to be able to perform elementwise comparisons of two +matrices, returning a matrix containing the results of a given +comparison for each element. If the two matrices are of different +sizes, then the compare has to be able to raise an exception to signal +the error. + +In Python 2.1, rich comparisons were added in order to support this +need. Python classes can now individually overload each of the +\code{<}, \code{<=}, \code{>}, \code{>=}, \code{==}, and \code{!=} +operations. The new magic method names are: + +\begin{tableii}{c|l}{code}{Operation}{Method name} + \lineii{<}{\method{__lt__}} \lineii{<=}{\method{__le__}} + \lineii{>}{\method{__gt__}} \lineii{>=}{\method{__ge__}} + \lineii{==}{\method{__eq__}} \lineii{!=}{\method{__ne__}} + \end{tableii} + +(The magic methods are named after the corresponding Fortran operators +\code{.LT.}. \code{.LE.}, \&c. Numeric programmers are almost +certainly quite familiar with these names and will find them easy to +remember.) + +Each of these magic methods is of the form \code{\var{method}(self, +other)}, where \code{self} will be the object on the left-hand side of +the operator, while \code{other} will be the object on the right-hand +side. For example, the expression \code{A < B} will cause +\code{A.__lt__(B)} to be called. + +Each of these magic methods can return anything at all: a Boolean, a +matrix, a list, or any other Python object. Alternatively they can +raise an exception if the comparison is impossible, inconsistent, or +otherwise meaningless. + +The built-in \function{cmp(A,B)} function can use the rich comparison +machinery, and now accepts an optional argument specifying which +comparison operation to use; this is given as one of the strings +\code{"<"}, \code{"<="}, \code{">"}, \code{">="}, \code{"=="}, or +\code{"!="}. If called without the optional third argument, +\function{cmp()} will only return -1, 0, or +1 as in previous versions +of Python; otherwise it will call the appropriate method and can +return any Python object. + +There are also corresponding changes of interest to C programmers; +there's a new slot \code{tp_richcmp} in type objects and an API for +performing a given rich comparison. I won't cover the C API here, but +will refer you to PEP 207, or to 2.1's C API documentation, for the +full list of related functions. + +\begin{seealso} + +\seepep{207}{Rich Comparisions}{Written by Guido van Rossum, heavily +based on earlier work by David Ascher, and implemented by Guido van +Rossum.} + +\end{seealso} + +%====================================================================== +\section{PEP 230: Warning Framework} + +Over its 10 years of existence, Python has accumulated a certain +number of obsolete modules and features along the way. It's difficult +to know when a feature is safe to remove, since there's no way of +knowing how much code uses it --- perhaps no programs depend on the +feature, or perhaps many do. To enable removing old features in a +more structured way, a warning framework was added. When the Python +developers want to get rid of a feature, it will first trigger a +warning in the next version of Python. The following Python version +can then drop the feature, and users will have had a full release +cycle to remove uses of the old feature. + +Python 2.1 adds the warning framework to be used in this scheme. It +adds a \module{warnings} module that provide functions to issue +warnings, and to filter out warnings that you don't want to be +displayed. Third-party modules can also use this framework to +deprecate old features that they no longer wish to support. + +For example, in Python 2.1 the \module{regex} module is deprecated, so +importing it causes a warning to be printed: + +\begin{verbatim} +>>> import regex +__main__:1: DeprecationWarning: the regex module + is deprecated; please use the re module +>>> +\end{verbatim} + +Warnings can be issued by calling the \function{warnings.warn} +function: + +\begin{verbatim} +warnings.warn("feature X no longer supported") +\end{verbatim} + +The first parameter is the warning message; an additional optional +parameters can be used to specify a particular warning category. + +Filters can be added to disable certain warnings; a regular expression +pattern can be applied to the message or to the module name in order +to suppress a warning. For example, you may have a program that uses +the \module{regex} module and not want to spare the time to convert it +to use the \module{re} module right now. The warning can be +suppressed by calling + +\begin{verbatim} +import warnings +warnings.filterwarnings(action = 'ignore', + message='.*regex module is deprecated', + category=DeprecationWarning, + module = '__main__') +\end{verbatim} + +This adds a filter that will apply only to warnings of the class +\class{DeprecationWarning} triggered in the \module{__main__} module, +and applies a regular expression to only match the message about the +\module{regex} module being deprecated, and will cause such warnings +to be ignored. Warnings can also be printed only once, printed every +time the offending code is executed, or turned into exceptions that +will cause the program to stop (unless the exceptions are caught in +the usual way, of course). + +Functions were also added to Python's C API for issuing warnings; +refer to PEP 230 or to Python's API documentation for the details. + +\begin{seealso} + +\seepep{5}{Guidelines for Language Evolution}{Written +by Paul Prescod, to specify procedures to be followed when removing +old features from Python. The policy described in this PEP hasn't +been officially adopted, but the eventual policy probably won't be too +different from Prescod's proposal.} + +\seepep{230}{Warning Framework}{Written and implemented by Guido van +Rossum.} + +\end{seealso} + +%====================================================================== +\section{PEP 229: New Build System} + +When compiling Python, the user had to go in and edit the +\file{Modules/Setup} file in order to enable various additional +modules; the default set is relatively small and limited to modules +that compile on most \UNIX{} platforms. This means that on \Unix{} +platforms with many more features, most notably Linux, Python +installations often don't contain all useful modules they could. + +Python 2.0 added the Distutils, a set of modules for distributing and +installing extensions. In Python 2.1, the Distutils are used to +compile much of the standard library of extension modules, +autodetecting which ones are supported on the current machine. It's +hoped that this will make Python installations easier and more +featureful. + +Instead of having to edit the \file{Modules/Setup} file in order to +enable modules, a \file{setup.py} script in the top directory of the +Python source distribution is run at build time, and attempts to +discover which modules can be enabled by examining the modules and +header files on the system. If a module is configured in +\file{Modules/Setup}, the \file{setup.py} script won't attempt to +compile that module and will defer to the \file{Modules/Setup} file's +contents. This provides a way to specific any strange command-line +flags or libraries that are required for a specific platform. + +In another far-reaching change to the build mechanism, Neil +Schemenauer restructured things so Python now uses a single makefile +that isn't recursive, instead of makefiles in the top directory and in +each of the \file{Python/}, \file{Parser/}, \file{Objects/}, and +\file{Modules/} subdirectories. This makes building Python faster +and also makes hacking the Makefiles clearer and simpler. + +\begin{seealso} + +\seepep{229}{Using Distutils to Build Python}{Written +and implemented by A.M. Kuchling.} + +\end{seealso} + +%====================================================================== +\section{PEP 205: Weak References} + +Weak references, available through the \module{weakref} module, are a +minor but useful new data type in the Python programmer's toolbox. + +Storing a reference to an object (say, in a dictionary or a list) has +the side effect of keeping that object alive forever. There are a few +specific cases where this behaviour is undesirable, object caches +being the most common one, and another being circular references in +data structures such as trees. + +For example, consider a memoizing function that caches the results of +another function \function{f(\var{x})} by storing the function's +argument and its result in a dictionary: + +\begin{verbatim} +_cache = {} +def memoize(x): + if _cache.has_key(x): + return _cache[x] + + retval = f(x) + + # Cache the returned object + _cache[x] = retval + + return retval +\end{verbatim} + +This version works for simple things such as integers, but it has a +side effect; the \code{_cache} dictionary holds a reference to the +return values, so they'll never be deallocated until the Python +process exits and cleans up This isn't very noticeable for integers, +but if \function{f()} returns an object, or a data structure that +takes up a lot of memory, this can be a problem. + +Weak references provide a way to implement a cache that won't keep +objects alive beyond their time. If an object is only accessible +through weak references, the object will be deallocated and the weak +references will now indicate that the object it referred to no longer +exists. A weak reference to an object \var{obj} is created by calling +\code{wr = weakref.ref(\var{obj})}. The object being referred to is +returned by calling the weak reference as if it were a function: +\code{wr()}. It will return the referenced object, or \code{None} if +the object no longer exists. + +This makes it possible to write a \function{memoize()} function whose +cache doesn't keep objects alive, by storing weak references in the +cache. + +\begin{verbatim} +_cache = {} +def memoize(x): + if _cache.has_key(x): + obj = _cache[x]() + # If weak reference object still exists, + # return it + if obj is not None: return obj + + retval = f(x) + + # Cache a weak reference + _cache[x] = weakref.ref(retval) + + return retval +\end{verbatim} + +The \module{weakref} module also allows creating proxy objects which +behave like weak references --- an object referenced only by proxy +objects is deallocated -- but instead of requiring an explicit call to +retrieve the object, the proxy transparently forwards all operations +to the object as long as the object still exists. If the object is +deallocated, attempting to use a proxy will cause a +\exception{weakref.ReferenceError} exception to be raised. + +\begin{verbatim} +proxy = weakref.proxy(obj) +proxy.attr # Equivalent to obj.attr +proxy.meth() # Equivalent to obj.meth() +del obj +proxy.attr # raises weakref.ReferenceError +\end{verbatim} + +\begin{seealso} + +\seepep{205}{Weak References}{Written and implemented by +Fred~L. Drake,~Jr.} + +\end{seealso} + +%====================================================================== +\section{PEP 232: Function Attributes} + +In Python 2.1, functions can now have arbitrary information attached +to them. People were often using docstrings to hold information about +functions and methods, because the \code{__doc__} attribute was the +only way of attaching any information to a function. For example, in +the Zope Web application server, functions are marked as safe for +public access by having a docstring, and in John Aycock's SPARK +parsing framework, docstrings hold parts of the BNF grammar to be +parsed. This overloading is unfortunate, since docstrings are really +intended to hold a function's documentation; for example, it means you +can't properly document functions intended for private use in Zope. + +Arbitrary attributes can now be set and retrieved on functions using the +regular Python syntax: + +\begin{verbatim} +def f(): pass + +f.publish = 1 +f.secure = 1 +f.grammar = "A ::= B (C D)*" +\end{verbatim} + +The dictionary containing attributes can be accessed as the function's +\member{__dict__}. Unlike the \member{__dict__} attribute of class +instances, in functions you can actually assign a new dictionary to +\member{__dict__}, though the new value is restricted to a regular +Python dictionary; you \emph{can't} be tricky and set it to a +\class{UserDict} instance, or any other random object that behaves +like a mapping. + +\begin{seealso} + +\seepep{232}{Function Attributes}{Written and implemented by Barry +Warsaw.} + +\end{seealso} + + +%====================================================================== + +\section{PEP 235: Importing Modules on Case-Insensitive Platforms} + +Some operating systems have filesystems that are case-insensitive, +MacOS and Windows being the primary examples; on these systems, it's +impossible to distinguish the filenames \samp{FILE.PY} and +\samp{file.py}, even though they do store the file's name +in its original case (they're case-preserving, too). + +In Python 2.1, the \keyword{import} statement will work to simulate +case-sensitivity on case-insensitive platforms. Python will now +search for the first case-sensitive match by default, raising an +\exception{ImportError} if no such file is found, so \code{import file} +will not import a module named \samp{FILE.PY}. Case-insensitive +matching can be requested by setting the \envvar{PYTHONCASEOK} environment +variable before starting the Python interpreter. + +%====================================================================== +\section{PEP 217: Interactive Display Hook} + +When using the Python interpreter interactively, the output of +commands is displayed using the built-in \function{repr()} function. +In Python 2.1, the variable \function{sys.displayhook} can be set to a +callable object which will be called instead of \function{repr()}. +For example, you can set it to a special pretty-printing function: + +\begin{verbatim} +>>> # Create a recursive data structure +... L = [1,2,3] +>>> L.append(L) +>>> L # Show Python's default output +[1, 2, 3, [...]] +>>> # Use pprint.pprint() as the display function +... import sys, pprint +>>> sys.displayhook = pprint.pprint +>>> L +[1, 2, 3, <Recursion on list with id=135143996>] +>>> +\end{verbatim} + +\begin{seealso} + +\seepep{217}{Display Hook for Interactive Use}{Written and implemented +by Moshe Zadka.} + +\end{seealso} + +%====================================================================== +\section{PEP 208: New Coercion Model} + +How numeric coercion is done at the C level was significantly +modified. This will only affect the authors of C extensions to +Python, allowing them more flexibility in writing extension types that +support numeric operations. + +Extension types can now set the type flag \code{Py_TPFLAGS_CHECKTYPES} +in their \code{PyTypeObject} structure to indicate that they support +the new coercion model. In such extension types, the numeric slot +functions can no longer assume that they'll be passed two arguments of +the same type; instead they may be passed two arguments of differing +types, and can then perform their own internal coercion. If the slot +function is passed a type it can't handle, it can indicate the failure +by returning a reference to the \code{Py_NotImplemented} singleton +value. The numeric functions of the other type will then be tried, +and perhaps they can handle the operation; if the other type also +returns \code{Py_NotImplemented}, then a \exception{TypeError} will be +raised. Numeric methods written in Python can also return +\code{Py_NotImplemented}, causing the interpreter to act as if the +method did not exist (perhaps raising a \exception{TypeError}, perhaps +trying another object's numeric methods). + +\begin{seealso} + +\seepep{208}{Reworking the Coercion Model}{Written and implemented by +Neil Schemenauer, heavily based upon earlier work by Marc-Andr\'e +Lemburg. Read this to understand the fine points of how numeric +operations will now be processed at the C level.} + +\end{seealso} + +%====================================================================== +\section{PEP 241: Metadata in Python Packages} + +A common complaint from Python users is that there's no single catalog +of all the Python modules in existence. T.~Middleton's Vaults of +Parnassus at \url{http://www.vex.net/parnassus/} are the largest +catalog of Python modules, but registering software at the Vaults is +optional, and many people don't bother. + +As a first small step toward fixing the problem, Python software +packaged using the Distutils \command{sdist} command will include a +file named \file{PKG-INFO} containing information about the package +such as its name, version, and author (metadata, in cataloguing +terminology). PEP 241 contains the full list of fields that can be +present in the \file{PKG-INFO} file. As people began to package their +software using Python 2.1, more and more packages will include +metadata, making it possible to build automated cataloguing systems +and experiment with them. With the result experience, perhaps it'll +be possible to design a really good catalog and then build support for +it into Python 2.2. For example, the Distutils \command{sdist} +and \command{bdist_*} commands could support a \option{upload} option +that would automatically upload your package to a catalog server. + +You can start creating packages containing \file{PKG-INFO} even if +you're not using Python 2.1, since a new release of the Distutils will +be made for users of earlier Python versions. Version 1.0.2 of the +Distutils includes the changes described in PEP 241, as well as +various bugfixes and enhancements. It will be available from +the Distutils SIG at \url{http://www.python.org/sigs/distutils-sig/}. + +\begin{seealso} + +\seepep{241}{Metadata for Python Software Packages}{Written and +implemented by A.M. Kuchling.} + +\seepep{243}{Module Repository Upload Mechanism}{Written by Sean +Reifschneider, this draft PEP describes a proposed mechanism for uploading +Python packages to a central server. +} + +\end{seealso} + +%====================================================================== +\section{New and Improved Modules} + +\begin{itemize} + +\item Ka-Ping Yee contributed two new modules: \module{inspect.py}, a +module for getting information about live Python code, and +\module{pydoc.py}, a module for interactively converting docstrings to +HTML or text. As a bonus, \file{Tools/scripts/pydoc}, which is now +automatically installed, uses \module{pydoc.py} to display +documentation given a Python module, package, or class name. For +example, \samp{pydoc xml.dom} displays the following: + +\begin{verbatim} +Python Library Documentation: package xml.dom in xml + +NAME + xml.dom - W3C Document Object Model implementation for Python. + +FILE + /usr/local/lib/python2.1/xml/dom/__init__.pyc + +DESCRIPTION + The Python mapping of the Document Object Model is documented in the + Python Library Reference in the section on the xml.dom package. + + This package contains the following modules: + ... +\end{verbatim} + +\file{pydoc} also includes a Tk-based interactive help browser. +\file{pydoc} quickly becomes addictive; try it out! + +\item Two different modules for unit testing were added to the +standard library. The \module{doctest} module, contributed by Tim +Peters, provides a testing framework based on running embedded +examples in docstrings and comparing the results against the expected +output. PyUnit, contributed by Steve Purcell, is a unit testing +framework inspired by JUnit, which was in turn an adaptation of Kent +Beck's Smalltalk testing framework. See +\url{http://pyunit.sourceforge.net/} for more information about +PyUnit. + +\item The \module{difflib} module contains a class, +\class{SequenceMatcher}, which compares two sequences and computes the +changes required to transform one sequence into the other. For +example, this module can be used to write a tool similar to the \UNIX{} +\program{diff} program, and in fact the sample program +\file{Tools/scripts/ndiff.py} demonstrates how to write such a script. + +\item \module{curses.panel}, a wrapper for the panel library, part of +ncurses and of SYSV curses, was contributed by Thomas Gellekum. The +panel library provides windows with the additional feature of depth. +Windows can be moved higher or lower in the depth ordering, and the +panel library figures out where panels overlap and which sections are +visible. + +\item The PyXML package has gone through a few releases since Python +2.0, and Python 2.1 includes an updated version of the \module{xml} +package. Some of the noteworthy changes include support for Expat 1.2 +and later versions, the ability for Expat parsers to handle files in +any encoding supported by Python, and various bugfixes for SAX, DOM, +and the \module{minidom} module. + +\item Ping also contributed another hook for handling uncaught +exceptions. \function{sys.excepthook} can be set to a callable +object. When an exception isn't caught by any +\keyword{try}...\keyword{except} blocks, the exception will be passed +to \function{sys.excepthook}, which can then do whatever it likes. At +the Ninth Python Conference, Ping demonstrated an application for this +hook: printing an extended traceback that not only lists the stack +frames, but also lists the function arguments and the local variables +for each frame. + +\item Various functions in the \module{time} module, such as +\function{asctime()} and \function{localtime()}, require a floating +point argument containing the time in seconds since the epoch. The +most common use of these functions is to work with the current time, +so the floating point argument has been made optional; when a value +isn't provided, the current time will be used. For example, log file +entries usually need a string containing the current time; in Python +2.1, \code{time.asctime()} can be used, instead of the lengthier +\code{time.asctime(time.localtime(time.time()))} that was previously +required. + +This change was proposed and implemented by Thomas Wouters. + +\item The \module{ftplib} module now defaults to retrieving files in +passive mode, because passive mode is more likely to work from behind +a firewall. This request came from the Debian bug tracking system, +since other Debian packages use \module{ftplib} to retrieve files and +then don't work from behind a firewall. It's deemed unlikely that +this will cause problems for anyone, because Netscape defaults to +passive mode and few people complain, but if passive mode is +unsuitable for your application or network setup, call +\method{set_pasv(0)} on FTP objects to disable passive mode. + +\item Support for raw socket access has been added to the +\module{socket} module, contributed by Grant Edwards. + +\item The \module{pstats} module now contains a simple interactive +statistics browser for displaying timing profiles for Python programs, +invoked when the module is run as a script. Contributed by +Eric S.\ Raymond. + +\item A new implementation-dependent function, \function{sys._getframe(\optional{depth})}, +has been added to return a given frame object from the current call stack. +\function{sys._getframe()} returns the frame at the top of the call stack; +if the optional integer argument \var{depth} is supplied, the function returns the frame +that is \var{depth} calls below the top of the stack. For example, \code{sys._getframe(1)} +returns the caller's frame object. + +This function is only present in CPython, not in Jython or the .NET +implementation. Use it for debugging, and resist the temptation to +put it into production code. + + + +\end{itemize} + +%====================================================================== +\section{Other Changes and Fixes} + +There were relatively few smaller changes made in Python 2.1 due to +the shorter release cycle. A search through the CVS change logs turns +up 117 patches applied, and 136 bugs fixed; both figures are likely to +be underestimates. Some of the more notable changes are: + +\begin{itemize} + + +\item A specialized object allocator is now optionally available, that +should be faster than the system \function{malloc()} and have less +memory overhead. The allocator uses C's \function{malloc()} function +to get large pools of memory, and then fulfills smaller memory +requests from these pools. It can be enabled by providing the +\longprogramopt{with-pymalloc} option to the \program{configure} script; see +\file{Objects/obmalloc.c} for the implementation details. + +Authors of C extension modules should test their code with the object +allocator enabled, because some incorrect code may break, causing core +dumps at runtime. There are a bunch of memory allocation functions in +Python's C API that have previously been just aliases for the C +library's \function{malloc()} and \function{free()}, meaning that if +you accidentally called mismatched functions, the error wouldn't be +noticeable. When the object allocator is enabled, these functions +aren't aliases of \function{malloc()} and \function{free()} any more, +and calling the wrong function to free memory will get you a core +dump. For example, if memory was allocated using +\function{PyMem_New()}, it has to be freed using +\function{PyMem_Del()}, not \function{free()}. A few modules included +with Python fell afoul of this and had to be fixed; doubtless there +are more third-party modules that will have the same problem. + +The object allocator was contributed by Vladimir Marangozov. + +\item The speed of line-oriented file I/O has been improved because +people often complain about its lack of speed, and because it's often +been used as a na\"ive benchmark. The \method{readline()} method of +file objects has therefore been rewritten to be much faster. The +exact amount of the speedup will vary from platform to platform +depending on how slow the C library's \function{getc()} was, but is +around 66\%, and potentially much faster on some particular operating +systems. Tim Peters did much of the benchmarking and coding for this +change, motivated by a discussion in comp.lang.python. + +A new module and method for file objects was also added, contributed +by Jeff Epler. The new method, \method{xreadlines()}, is similar to +the existing \function{xrange()} built-in. \function{xreadlines()} +returns an opaque sequence object that only supports being iterated +over, reading a line on every iteration but not reading the entire +file into memory as the existing \method{readlines()} method does. +You'd use it like this: + +\begin{verbatim} +for line in sys.stdin.xreadlines(): + # ... do something for each line ... + ... +\end{verbatim} + +For a fuller discussion of the line I/O changes, see the python-dev +summary for January 1-15, 2001 at +\url{http://www.python.org/dev/summary/2001-01-1.html}. + +\item A new method, \method{popitem()}, was added to dictionaries to +enable destructively iterating through the contents of a dictionary; +this can be faster for large dictionaries because there's no need to +construct a list containing all the keys or values. +\code{D.popitem()} removes a random \code{(\var{key}, \var{value})} +pair from the dictionary~\code{D} and returns it as a 2-tuple. This +was implemented mostly by Tim Peters and Guido van Rossum, after a +suggestion and preliminary patch by Moshe Zadka. + +\item Modules can now control which names are imported when \code{from +\var{module} import *} is used, by defining an \code{__all__} +attribute containing a list of names that will be imported. One +common complaint is that if the module imports other modules such as +\module{sys} or \module{string}, \code{from \var{module} import *} +will add them to the importing module's namespace. To fix this, +simply list the public names in \code{__all__}: + +\begin{verbatim} +# List public names +__all__ = ['Database', 'open'] +\end{verbatim} + +A stricter version of this patch was first suggested and implemented +by Ben Wolfson, but after some python-dev discussion, a weaker final +version was checked in. + +\item Applying \function{repr()} to strings previously used octal +escapes for non-printable characters; for example, a newline was +\code{'\e 012'}. This was a vestigial trace of Python's C ancestry, but +today octal is of very little practical use. Ka-Ping Yee suggested +using hex escapes instead of octal ones, and using the \code{\e n}, +\code{\e t}, \code{\e r} escapes for the appropriate characters, and +implemented this new formatting. + +\item Syntax errors detected at compile-time can now raise exceptions +containing the filename and line number of the error, a pleasant side +effect of the compiler reorganization done by Jeremy Hylton. + +\item C extensions which import other modules have been changed to use +\function{PyImport_ImportModule()}, which means that they will use any +import hooks that have been installed. This is also encouraged for +third-party extensions that need to import some other module from C +code. + +\item The size of the Unicode character database was shrunk by another +340K thanks to Fredrik Lundh. + +\item Some new ports were contributed: MacOS X (by Steven Majewski), +Cygwin (by Jason Tishler); RISCOS (by Dietmar Schwertberger); Unixware~7 +(by Billy G. Allie). + +\end{itemize} + +And there's the usual list of minor bugfixes, minor memory leaks, +docstring edits, and other tweaks, too lengthy to be worth itemizing; +see the CVS logs for the full details if you want them. + + +%====================================================================== +\section{Acknowledgements} + +The author would like to thank the following people for offering +suggestions on various drafts of this article: Graeme Cross, David +Goodger, Jay Graves, Michael Hudson, Marc-Andr\'e Lemburg, Fredrik +Lundh, Neil Schemenauer, Thomas Wouters. + +\end{document} |