Python History
--------------

This file contains the release messages for previous Python releases.
As you read on you go back to the dark ages of Python's history.


======================================================================


What's New in Python 3.3.0?
===========================

*Release date: 29-Sep-2012*

Core and Builtins
-----------------

- Issue #16046: Fix loading sourceless legacy .pyo files.

- Issue #16060: Fix refcounting bug when __trunc__ returns an object
  whose __int__ gives a non-integer.  Patch by Serhiy Storchaka.

Extension Modules
-----------------

- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()
  method doesn't require an argument again.


What's New in Python 3.3.0 Release Candidate 3?
===============================================

*Release date: 23-Sep-2012*

Core and Builtins
-----------------

- Issue #15900: Fix reference leak in PyUnicode_TranslateCharmap().

- Issue #15926: Fix crash after multiple reinitializations of the interpreter.

- Issue #15895: Fix FILE pointer leak in one error branch of
  PyRun_SimpleFileExFlags() when filename points to a pyc/pyo file, closeit
  is false an and set_main_loader() fails.

- Fixes for a few crash and memory leak regressions found by Coverity.

Library
-------

- Issue #15882: Change _decimal to accept any coefficient tuple when
  constructing infinities. This is done for backwards compatibility
  with decimal.py: Infinity coefficients are undefined in _decimal
  (in accordance with the specification).

- Issue #15925: Fix a regression in email.util where the parsedate() and
  parsedate_tz() functions did not return None anymore when the argument could
  not be parsed.

Extension Modules
-----------------

- Issue #15973: Fix a segmentation fault when comparing datetime timezone
  objects.

- Issue #15977: Fix memory leak in Modules/_ssl.c when the function
  _set_npn_protocols() is called multiple times, thanks to Daniel Sommermann.

- Issue #15969: faulthandler module: rename dump_tracebacks_later() to
  dump_traceback_later() and cancel_dump_tracebacks_later() to
  cancel_dump_traceback_later().

- _decimal module: use only C 89 style comments.


What's New in Python 3.3.0 Release Candidate 2?
===============================================

*Release date: 09-Sep-2012*

Core and Builtins
-----------------

- Issue #13992: The trashcan mechanism is now thread-safe.  This eliminates
  sporadic crashes in multi-thread programs when several long deallocator
  chains ran concurrently and involved subclasses of built-in container
  types.

- Issue #15784: Modify OSError.__str__() to better distinguish between
  errno error numbers and Windows error numbers.

- Issue #15781: Fix two small race conditions in import's module locking.

Library
-------

- Issue #15847: Fix a regression in argparse, which did not accept tuples
  as argument lists anymore.

- Issue #15828: Restore support for C extensions in imp.load_module().

- Issue #15340: Fix importing the random module when /dev/urandom cannot
  be opened.  This was a regression caused by the hash randomization patch.

- Issue #10650: Deprecate the watchexp parameter of the Decimal.quantize()
  method.

- Issue #15785: Modify window.get_wch() API of the curses module: return
  a character for most keys, and an integer for special keys, instead of
  always returning an integer. So it is now possible to distinguish special
  keys like keypad keys.

- Issue #14223: Fix window.addch() of the curses module for special characters
  like curses.ACS_HLINE: the Python function addch(int) and addch(bytes) is now
  calling the C function waddch()/mvwaddch() (as it was done in Python 3.2),
  instead of wadd_wch()/mvwadd_wch(). The Python function addch(str) is still
  calling the C function wadd_wch()/mvwadd_wch() if the Python curses is linked
  to libncursesw.

Build
-----

- Issue #15822: Really ensure 2to3 grammar pickles are properly installed
  (replaces fixes for Issue #15645).

Documentation
-------------

- Issue #15814: The memoryview enhancements in 3.3.0 accidentally permitted
  the hashing of multi-dimensional memorviews and memoryviews with multi-byte
  item formats. The intended restrictions have now been documented - they
  will be correctly enforced in 3.3.1


What's New in Python 3.3.0 Release Candidate 1?
===============================================

*Release date: 25-Aug-2012*

Core and Builtins
-----------------

- Issue #15573: memoryview comparisons are now performed by value with full
  support for any valid struct module format definition.

- Issue #15316: When an item in the fromlist for __import__ doesn't exist,
  don't raise an error, but if an exception is raised as part of an import do
  let that propagate.

- Issue #15778: ensure that str(ImportError(msg)) returns a str
  even when msg isn't a str.

- Issue #2051: Source file permission bits are once again correctly
  copied to the cached bytecode file. (The migration to importlib
  reintroduced this problem because these was no regression test. A test
  has been added as part of this patch)

- Issue #15761: Fix crash when PYTHONEXECUTABLE is set on Mac OS X.

- Issue #15726: Fix incorrect bounds checking in PyState_FindModule.
  Patch by Robin Schreiber.

- Issue #15604: Update uses of PyObject_IsTrue() to check for and handle
  errors correctly.  Patch by Serhiy Storchaka.

- Issue #14846: importlib.FileFinder now handles the case where the
  directory being searched is removed after a previous import attempt

Library
-------

- Issue #13370: Ensure that ctypes works on Mac OS X when Python is
  compiled using the clang compiler

- Issue #13072: The array module's 'u' format code is now deprecated and
  will be removed in Python 4.0.

- Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.

- Issue #15249: BytesGenerator now correctly mangles From lines (when
  requested) even if the body contains undecodable bytes.

- Issue #15777: Fix a refleak in _posixsubprocess.

- Issue ##665194: Update email.utils.localtime to use datetime.astimezone and
  correctly handle historic changes in UTC offsets.

- Issue #15199: Fix JavaScript's default MIME type to application/javascript.
  Patch by Bohuslav Kabrda.

- Issue #12643: code.InteractiveConsole now respects sys.excepthook when
  displaying exceptions (Patch by Aaron Iles)

- Issue #13579: string.Formatter now understands the 'a' conversion specifier.

- Issue #15793: Stack corruption in ssl.RAND_egd().
  Patch by Serhiy Storchaka.

- Issue #15595: Fix subprocess.Popen(universal_newlines=True)
  for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek.

- Issue #15477: In cmath and math modules, add workaround for platforms whose
  system-supplied log1p function doesn't respect signs of zeros.

- Issue #15715: importlib.__import__() will silence an ImportError when the use
  of fromlist leads to a failed import.

- Issue #14669: Fix pickling of connections and sockets on MacOSX
  by sending/receiving an acknowledgment after file descriptor transfer.
  TestPicklingConnection has been reenabled for MacOSX.

- Issue #11062: Fix adding a message from file to Babyl mailbox.

- Issue #15646: Prevent equivalent of a fork bomb when using
  multiprocessing on Windows without the "if __name__ == '__main__'"
  idiom.

- Issue #15678: Fix IDLE menus when started from OS X command line
  (3.3.0b2 regression).

C API
-----

Extension Modules
-----------------

Tools/Demos
-----------

Documentation
-------------

- Issue #14674: Add a discussion of the json module's standard compliance.
  Patch by Chris Rebert.

- Create a 'Concurrent Execution' section in the docs, and split up the
  'Optional Operating System Services' section to use a more user-centric
  classification scheme (splitting them across the new CE section, IPC and
  text processing). Operating system limitatons can be reflected with
  the Sphinx ``:platform:`` tag, it doesn't make sense as part of the Table of
  Contents.

- Issue #4966: Bring the sequence docs up to date for the Py3k transition
  and the many language enhancements since they were original written

- The "path importer" misnomer has been replaced with Eric Snow's
  more-awkward-but-at-least-not-wrong suggestion of "path based finder" in
  the import system reference docs

- Issue #15640: Document importlib.abc.Finder as deprecated.

- Issue #15630: Add an example for "continue" stmt in the tutorial. Patch by
  Daniel Ellis.

Tests
-----

- Issue #15747: ZFS always returns EOPNOTSUPP when attempting to set the
  UF_IMMUTABLE flag (via either chflags or lchflags); refactor affected
  tests in test_posix.py to account for this.

- Issue #15285: Refactor the approach for testing connect timeouts using
  two external hosts that have been configured specifically for this type
  of test.

- Issue #15743: Remove the deprecated method usage in urllib tests. Patch by
  Jeff Knupp.

- Issue #15615: Add some tests for the json module's handling of invalid
  input data.  Patch by Kushal Das.

Build
-----

- Output lib files for PGO build into PGO directory.

- Pick up 32-bit launcher from PGO directory on 64-bit PGO build.

- Drop PC\python_nt.h as it's not used. Add input dependency on custom
  build step.

- Issue #15511: Drop explicit dependency on pythonxy.lib from _decimal
  amd64 configuration.

- Add missing PGI/PGO configurations for pywlauncher.

- Issue #15645: Ensure 2to3 grammar pickles are properly installed.


What's New in Python 3.3.0 Beta 2?
==================================

*Release date: 12-Aug-2012*

Core and Builtins
-----------------

- Issue #15568: Fix the return value of "yield from" when StopIteration is
  raised by a custom iterator.

- Issue #13119: sys.stdout and sys.stderr are now using "\r\n" newline on
  Windows, as Python 2.

- Issue #15534: Fix the fast-search function for non-ASCII Unicode strings.

- Issue #15508: Fix the docstring for __import__ to have the proper default
  value of 0 for 'level' and to not mention negative levels since they are not
  supported.

- Issue #15425: Eliminated traceback noise from more situations involving
  importlib.

- Issue #14578: Support modules registered in the Windows registry again.

- Issue #15466: Stop using TYPE_INT64 in marshal, to make importlib.h (and other
  byte code files) equal between 32-bit and 64-bit systems.

- Issue #1692335: Move initial exception args assignment to
  "BaseException.__new__" to help pickling of naive subclasses.

- Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.

- Issue #15456: Fix code __sizeof__ after #12399 change.  Patch by Serhiy
  Storchaka.

- Issue #15404: Refleak in PyMethodObject repr.

- Issue #15394: An issue in PyModule_Create that caused references to be leaked
  on some error paths has been fixed.  Patch by Julia Lawall.

- Issue #15368: An issue that caused bytecode generation to be non-deterministic
  has been fixed.

- Issue #15202: Consistently use the name "follow_symlinks" for new parameters
  in os and shutil functions.

- Issue #15314: __main__.__loader__ is now set correctly during interpreter
  startup.

- Issue #15111: When a module imported using 'from import' has an ImportError
  inside itself, don't mask that fact behind a generic ImportError for the
  module itself.

- Issue #15293: Add GC support to the AST base node type.

- Issue #15291: Fix a memory leak where AST nodes where not properly
  deallocated.

- Issue #15110: Fix the tracebacks generated by "import xxx" to not show the
  importlib stack frames.

- Issue #15020: The program name used to search for Python's path is now
  "python3" under Unix, not "python".

- Issue #15033: Fix the exit status bug when modules invoked using -m swith,
  return the proper failure return value (1). Patch contributed by Jeff Knupp.

- Issue #15229: An OSError subclass whose __init__ doesn't call back
  OSError.__init__ could produce incomplete instances, leading to crashes when
  calling str() on them.

- Issue 15307: Virtual environments now use symlinks with framework builds on
  Mac OS X, like other POSIX builds.

Library
-------

- Issue #15424: Add a __sizeof__ implementation for array objects.  Patch by
  Ludwig Hähne.

- Issue #15576: Allow extension modules to act as a package's __init__ module.

- Issue #15502: Have importlib.invalidate_caches() work on sys.meta_path instead
  of sys.path_importer_cache.

- Issue #15163: Pydoc shouldn't list __loader__ as module data.

- Issue #15471: Do not use mutable objects as defaults for
  importlib.__import__().

- Issue #15559: To avoid a problematic failure mode when passed to the bytes
  constructor, objects in the ipaddress module no longer implement __index__
  (they still implement __int__ as appropriate)

- Issue #15546: Fix handling of pathological input data in the peek() and
  read1() methods of the BZ2File, GzipFile and LZMAFile classes.

- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog
  ended with '\'. Patch by Roger Serwy.

- Issue #12655: Instead of requiring a custom type, os.sched_getaffinity and
  os.sched_setaffinity now use regular sets of integers to represent the CPUs a
  process is restricted to.

- Issue #15538: Fix compilation of the getnameinfo() / getaddrinfo() emulation
  code.  Patch by Philipp Hagemeister.

- Issue #15519: Properly expose WindowsRegistryFinder in importlib (and use the
  correct term for it). Original patch by Eric Snow.

- Issue #15502: Bring the importlib ABCs into line with the current state of the
  import protocols given PEP 420. Original patch by Eric Snow.

- Issue #15499: Launching a webbrowser in Unix used to sleep for a few seconds.
  Original patch by Anton Barkovsky.

- Issue #15463: The faulthandler module truncates strings to 500 characters,
  instead of 100, to be able to display long file paths.

- Issue #6056: Make multiprocessing use setblocking(True) on the sockets it
  uses.  Original patch by J Derek Wilson.

- Issue #15364: Fix sysconfig.get_config_var('srcdir') to be an absolute path.

- Issue #15041: Update "see also" list in tkinter documentation.

- Issue #15413: os.times() had disappeared under Windows.

- Issue #15402: An issue in the struct module that caused sys.getsizeof to
  return incorrect results for struct.Struct instances has been fixed.  Initial
  patch by Serhiy Storchaka.

- Issue #15232: When mangle_from is True, email.Generator now correctly mangles
  lines that start with 'From ' that occur in a MIME preamble or epilogue.

- Issue #15094: Incorrectly placed #endif in _tkinter.c.  Patch by Serhiy
  Storchaka.

- Issue #13922: argparse no longer incorrectly strips '--'s that appear after
  the first one.

- Issue #12353: argparse now correctly handles null argument values.

- Issue #10017, issue #14998: Fix TypeError using pprint on dictionaries with
  user-defined types as keys or other unorderable keys.

- Issue #15397: inspect.getmodulename() is now based directly on importlib via a
  new importlib.machinery.all_suffixes() API.

- Issue #14635: telnetlib will use poll() rather than select() when possible to
  avoid failing due to the select() file descriptor limit.

- Issue #15180: Clarify posixpath.join() error message when mixing str & bytes.

- Issue #15343: pkgutil now includes an iter_importer_modules implementation for
  importlib.machinery.FileFinder (similar to the way it already handled
  zipimport.zipimporter).

- Issue #15314: runpy now sets __main__.__loader__ correctly.

- Issue #15357: The import emulation in pkgutil is now deprecated. pkgutil uses
  importlib internally rather than the emulation.

- Issue #15233: Python now guarantees that callables registered with the atexit
  module will be called in a deterministic order.

- Issue #15238: shutil.copystat now copies Linux "extended attributes".

- Issue #15230: runpy.run_path now correctly sets __package__ as described in
  the documentation.

- Issue #15315: Support VS 2010 in distutils cygwincompiler.

- Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested
  namespace packages.

- Issue #15056: imp.cache_from_source() and source_from_cache() raise
  NotImplementedError when sys.implementation.cache_tag is set to None.

- Issue #15256: Grammatical mistake in exception raised by imp.find_module().

- Issue #5931: wsgiref environ variable SERVER_SOFTWARE will specify an
  implementation specific term like CPython, Jython instead of generic "Python".

- Issue #13248: Remove obsolete argument "max_buffer_size" of BufferedWriter and
  BufferedRWPair, from the io module.

- Issue #13248: Remove obsolete argument "version" of argparse.ArgumentParser.

- Issue #14814: Implement more consistent ordering and sorting behaviour for
  ipaddress objects.

- Issue #14814: ipaddress network objects correctly return NotImplemented when
  compared to arbitrary objects instead of raising TypeError.

- Issue #14990: Correctly fail with SyntaxError on invalid encoding declaration.

- Issue #14814: ipaddress now provides more informative error messages when
  constructing instances directly (changes permitted during beta due to
  provisional API status).

- Issue #15247: FileIO now raises an error when given a file descriptor pointing
  to a directory.

- Issue #15261: Stop os.stat(fd) crashing on Windows when fd not open.

- Issue #15166: Implement imp.get_tag() using sys.implementation.cache_tag.

- Issue #15210: Catch KeyError when importlib.__init__ can't find
  _frozen_importlib in sys.modules, not ImportError.

- Issue #15030: importlib.abc.PyPycLoader now supports the new source size
  header field in .pyc files.

- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on
  flush().

- Issue #10571: Fix the "--sign" option of distutils' upload command.  Patch by
  Jakub Wilk.

- Issue #9559: If messages were only added, a new file is no longer created and
  renamed over the old file when flush() is called on an mbox, MMDF or Babyl
  mailbox.

- Issue 10924: Fixed crypt.mksalt() to use a RNG that is suitable for
  cryptographic purpose.

- Issue #15184: Ensure consistent results of OS X configuration tailoring for
  universal builds by factoring out common OS X-specific customizations from
  sysconfig, distutils.sysconfig, distutils.util, and distutils.unixccompiler
  into a new module _osx_support.

C API
-----

- Issue #15610: PyImport_ImportModuleEx() now uses a 'level' of 0 instead of -1.

- Issues #15169, #14599: Strip out the C implementation of
  imp.source_from_cache() used by PyImport_ExecCodeModuleWithPathnames() and
  used the Python code instead. Leads to PyImport_ExecCodeModuleObject() to not
  try to infer the source path from the bytecode path as
  PyImport_ExecCodeModuleWithPathnames() does.

Extension Modules
-----------------

- Issue #15676: Now "mmap" check for empty files before doing the
  offset check.  Patch by Steven Willis.

- Issue #6493: An issue in ctypes on Windows that caused structure bitfields
  of type ctypes.c_uint32 and width 32 to incorrectly be set has been fixed.

- Issue #15194: Update libffi to the 3.0.11 release.

Tools/Demos
-----------

- Issue #15458: python-config gets a new option --configdir to print the $LIBPL
  value.

- Move importlib.test.benchmark to Tools/importbench.

- Issue #12605: The gdb hooks for debugging CPython (within Tools/gdb) have been
  enhanced to show information on more C frames relevant to CPython within the
  "py-bt" and "py-bt-full" commands:

  * C frames that are waiting on the GIL
  * C frames that are garbage-collecting
  * C frames that are due to the invocation of a PyCFunction

Documentation
-------------

- Issue #15444: Use proper spelling for non-ASCII contributor names.  Patch
  by Serhiy Storchaka.

- Issue #15295: Reorganize and rewrite the documentation on the import system.

- Issue #15230: Clearly document some of the limitations of the runpy module and
  nudge readers towards importlib when appropriate.

- Issue #15053: Copy Python 3.3 import lock change notice to all relevant
  functions in imp instead of just at the top of the relevant section.

- Issue #15288: Link to the term "loader" in notes in pkgutil about how things
  won't work as expected in Python 3.3 and mark the requisite functions as
  "changed" since they will no longer work with modules directly imported by
  import itself.

- Issue #13557: Clarify effect of giving two different namespaces to exec or
  execfile().

- Issue #15250: Document that filecmp.dircmp compares files shallowly. Patch
  contributed by Chris Jerdonek.

Tests
-----

- Issue #15467: Move helpers for __sizeof__ tests into test_support.  Patch by
  Serhiy Storchaka.

- Issue #15320: Make iterating the list of tests thread-safe when running tests
  in multiprocess mode. Patch by Chris Jerdonek.

- Issue #15168: Move importlib.test to test.test_importlib.

- Issue #15091: Reactivate a test on UNIX which was failing thanks to a
  forgotten importlib.invalidate_caches() call.

- Issue #15230: Adopted a more systematic approach in the runpy tests.

- Issue #15300: Ensure the temporary test working directories are in the same
  parent folder when running tests in multiprocess mode from a Python build.
  Patch by Chris Jerdonek.

- Issue #15284: Skip {send,recv}msg tests in test_socket when IPv6 is not
  enabled. Patch by Brian Brazil.

- Issue #15277: Fix a resource leak in support.py when IPv6 is disabled.  Patch
  by Brian Brazil.

Build
-----

- Issue #11715: Fix multiarch detection without having Debian development tools
  (dpkg-dev) installed.

- Issue #15037: Build OS X installers with local copy of ncurses 5.9 libraries
  to avoid curses.unget_wch bug present in older versions of ncurses such as
  those shipped with OS X.

- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK.  Also, for
  OS X installers, ensure consistent sqlite3 behavior and feature availability
  by building a local copy of libsqlite3 rather than depending on the wide range
  of versions supplied with various OS X releases.

- Issue #8847: Disable COMDAT folding in Windows PGO builds.

- Issue #14018: Fix OS X Tcl/Tk framework checking when using OS X SDKs.

- Issue #15431: Add _freeze_importlib project to regenerate importlib.h on
  Windows. Patch by Kristján Valur Jónsson.

- Issue #14197: For OS X framework builds, ensure links to the shared library
  are created with the proper ABI suffix.

- Issue #14330: For cross builds, don't use host python, use host search paths
  for host compiler.

- Issue #15235: Allow Berkley DB versions up to 5.3 to build the dbm module.

- Issue #15268: Search curses.h in /usr/include/ncursesw.


What's New in Python 3.3.0 Beta 1?
==================================

*Release date: 27-Jun-2012*

Core and Builtins
-----------------

- Fix a (most likely) very rare memory leak when calling main() and not being
  able to decode a command-line argument.

- Issue #14815: Use Py_ssize_t instead of long for the object hash, to
  preserve all 64 bits of hash on Win64.

- Issue #12268: File readline, readlines and read() or readall() methods
  no longer lose data when an underlying read system call is interrupted.
  IOError is no longer raised due to a read system call returning EINTR
  from within these methods.

- Issue #11626: Add _SizeT functions to stable ABI.

- Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.

- Issue #15142: Fix reference leak when deallocating instances of types
  created using PyType_FromSpec().

- Issue #15042: Add PyState_AddModule and PyState_RemoveModule. Add version
  guard for Py_LIMITED_API additions. Patch by Robin Schreiber.

- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
  the work by Hirokazu Yamamoto.

- Issue #15096: Removed support for ur'' as the raw notation isn't
  compatible with Python 2.x's raw unicode strings.

- Issue #13783: Generator objects now use the identifier APIs internally

- Issue #14874: Restore charmap decoding speed to pre-PEP 393 levels.
  Patch by Serhiy Storchaka.

- Issue #15026: utf-16 encoding is now significantly faster (up to 10x).
  Patch by Serhiy Storchaka.

- Issue #11022: open() and io.TextIOWrapper are now calling
  locale.getpreferredencoding(False) instead of locale.getpreferredencoding()
  in text mode if the encoding is not specified. Don't change temporary the
  locale encoding using locale.setlocale(), use the current locale encoding
  instead of the user preferred encoding.

- Issue #14673: Add Eric Snow's sys.implementation implementation.

- Issue #15038: Optimize python Locks on Windows.

Library
-------

- Issue #9803: Don't close IDLE on saving if breakpoint is open.
  Patch by Roger Serwy.

- Issue #12288: Consider '0' and '0.0' as valid initialvalue
  for tkinter SimpleDialog.

- Issue #15512: Add a __sizeof__ implementation for parser.
  Patch by Serhiy Storchaka.

- Issue #15469: Add a __sizeof__ implementation for deque objects.
  Patch by Serhiy Storchaka.

- Issue #15489: Add a __sizeof__ implementation for BytesIO objects.
  Patch by Serhiy Storchaka.

- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
  Patch by Serhiy Storchaka.

- Issue #15514: Correct __sizeof__ support for cpu_set.
  Patch by Serhiy Storchaka.

- Issue #15187: Bugfix: remove temporary directories test_shutil was leaving
  behind.

- Issue #15177: Added dir_fd parameter to os.fwalk().

- Issue #15176: Clarified behavior, documentation, and implementation
  of os.listdir().

- Issue #15061: Re-implemented hmac.compare_digest() in C to prevent further
  timing analysis and to support all buffer protocol aware objects as well as
  ASCII only str instances safely.

- Issue #15164: Change return value of platform.uname() from a
  plain tuple to a collections.namedtuple.

- Support Mageia Linux in the platform module.

- Issue #11678: Support Arch linux in the platform module.

- Issue #15118: Change return value of os.uname() and os.times() from
  plain tuples to immutable iterable objects with named attributes
  (structseq objects).

- Speed up _decimal by another 10-15% by caching the thread local context
  that was last accessed. In the pi benchmark (64-bit platform, prec=9),
  _decimal is now only 1.5x slower than float.

- Remove the packaging module, which is not ready for prime time.

- Issue #15154: Add "dir_fd" parameter to os.rmdir, remove "rmdir"
  parameter from os.remove / os.unlink.

- Issue #4489: Add a shutil.rmtree that isn't susceptible to symlink attacks.
  It is used automatically on platforms supporting the necessary os.openat()
  and os.unlinkat() functions. Main code by Martin von Löwis.

- Issue #15156: HTMLParser now uses the new "html.entities.html5" dictionary.

- Issue #11113: add a new "html5" dictionary containing the named character
  references defined by the HTML5 standard and the equivalent Unicode
  character(s) to the html.entities module.

- Issue #15114: the strict mode of HTMLParser and the HTMLParseError exception
  are deprecated now that the parser is able to parse invalid markup.

- Issue #3665: \u and \U escapes are now supported in unicode regular
  expressions.  Patch by Serhiy Storchaka.

- Issue #15153: Added inspect.getgeneratorlocals to simplify white box
  testing of generator state updates

- Issue #13062: Added inspect.getclosurevars to simplify testing stateful
  closures

- Issue #11024: Fixes and additional tests for Time2Internaldate.

- Issue #14626: Large refactoring of functions / parameters in the os module.
  Many functions now support "dir_fd" and "follow_symlinks" parameters;
  some also support accepting an open file descriptor in place of a path
  string.  Added os.support_* collections as LBYL helpers.  Removed many
  functions only previously seen in 3.3 alpha releases (often starting with
  "f" or "l", or ending with "at").  Originally suggested by Serhiy Storchaka;
  implemented by Larry Hastings.

- Issue #15008: Implement PEP 362 "Signature Objects".
  Patch by Yury Selivanov.

- Issue: #15138: base64.urlsafe_{en,de}code() are now 3-4x faster.

- Issue #444582: Add shutil.which, for finding programs on the system path.
  Original patch by Erik Demaine, with later iterations by Jan Killian
  and Brian Curtin.

- Issue #14837: SSL errors now have ``library`` and ``reason`` attributes
  describing precisely what happened and in which OpenSSL submodule.  The
  str() of a SSLError is also enhanced accordingly.

- Issue #9527: datetime.astimezone() method will now supply a class
  timezone instance corresponding to the system local timezone when
  called with no arguments.

- Issue #14653: email.utils.mktime_tz() no longer relies on system
  mktime() when timezone offest is supplied.

- Issue #14684: zlib.compressobj() and zlib.decompressobj() now support the use
  of predefined compression dictionaries. Original patch by Sam Rushing.

- Fix GzipFile's handling of filenames given as bytes objects.

- Issue #14772: Return destination values from some shutil functions.

- Issue #15064: Implement context manager protocol for multiprocessing types

- Issue #15101: Make pool finalizer avoid joining current thread.

- Issue #14657: The frozen instance of importlib used for bootstrap is now
  also the module imported as importlib._bootstrap.

- Issue #14055: Add __sizeof__ support to _elementtree.

- Issue #15054: A bug in tokenize.tokenize that caused string literals
  with 'b' prefixes to be incorrectly tokenized has been fixed.
  Patch by Serhiy Storchaka.

- Issue #15006: Allow equality comparison between naive and aware
  time or datetime objects.

- Issue #14982: Document that pkgutil's iteration functions require the
  non-standard iter_modules() method to be defined by an importer (something
  the importlib importers do not define).

- Issue #15036: Mailbox no longer throws an error if a flush is done
  between operations when removing or changing multiple items in mbox,
  MMDF, or Babyl mailboxes.

- Issue #14059: Implement multiprocessing.Barrier.

- Issue #15061: The inappropriately named hmac.secure_compare has been
  renamed to hmac.compare_digest, restricted to operating on bytes inputs
  only and had its documentation updated to more accurately reflect both its
  intent and its limitations

- Issue #13841: Make child processes exit using sys.exit() on Windows.

- Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
  Patch by Robin Schreiber.

- Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
  in struct tm, time.struct_time objects returned by time.gmtime(),
  time.localtime() and time.strptime() functions now have tm_zone and
  tm_gmtoff attributes.  Original patch by Paul Boddie.

- Rename adjusted attribute to adjustable in time.get_clock_info() result.

- Issue #3518: Remove references to non-existent BaseManager.from_address()
  method.

- Issue #13857: Added textwrap.indent() function (initial patch by Ezra
  Berch)

- Issue #2736: Added datetime.timestamp() method.

- Issue #13854: Make multiprocessing properly handle non-integer
  non-string argument to SystemExit.

- Issue #12157: Make pool.map() empty iterables correctly.  Initial
  patch by mouad.

- Issue #11823: disassembly now shows argument counts on calls with keyword args.

- Issue #14711: os.stat_float_times() has been deprecated.

- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".

- The bz2 and lzma modules now each contain an open() function, allowing
  compressed files to readily be opened in text mode as well as binary mode.

- BZ2File.__init__() and LZMAFile.__init__() now accept a file object as their
  first argument, rather than requiring a separate "fileobj" argument.

- gzip.open() now accepts file objects as well as filenames.

- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
  when the path existed and had the S_ISGID mode bit set when it was
  not explicitly asked for.  This is no longer an exception as mkdir
  cannot control if the OS sets that bit for it or not.

- Issue #14989: Make the CGI enable option to http.server available via command
  line.

- Issue #14987: Add a missing import statement to inspect.

- Issue #1079: email.header.decode_header now correctly parses all the examples
  in RFC2047.  There is a necessary visible behavior change: the leading and/or
  trailing whitespace on ASCII parts is now preserved.

- Issue #14969: Better handling of exception chaining in contextlib.ExitStack

- Issue #14962: Update text coloring in IDLE shell window after changing
  options.  Patch by Roger Serwy.

- Issue #14963: Convert contextlib.ExitStack.__exit__ to use an iterative
  algorithm (Patch by Alon Horev)

- Issue #14785: Add sys._debugmallocstats() to help debug low-level memory
  allocation issues

- Issue #14443: Ensure that .py files are byte-compiled with the correct Python
  executable within bdist_rpm even on older versions of RPM

C-API
-----

- Issue #13783: Inadvertent additions to the public C API in the PEP 380
  implementation have either been removed or marked as private interfaces.

Extension Modules
-----------------

- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.

Documentation
-------------

- Issue #15081: Document PyState_FindModule.
  Patch by Robin Schreiber.

- Issue #14814: Added first draft of ipaddress module API reference

Tests
-----

- Issue #14769: test_capi now has SkipitemTest, which cleverly checks
  for "parity" between PyArg_ParseTuple() and the Python/getargs.c static
  function skipitem() for all possible "format units".

- test_nntplib now tolerates being run from behind NNTP gateways that add
  "X-Antivirus" headers to articles

- Issue #15043: test_gdb is now skipped entirely if gdb security settings
  block loading of the gdb hooks

- Issue #14963: Add test cases for exception handling behaviour
  in contextlib.ExitStack (Initial patch by Alon Horev)

Build
-----

- Issue #13590: Improve support for OS X Xcode 4:
    * Try to avoid building Python or extension modules with problematic
      llvm-gcc compiler.
    * Since Xcode 4 removes ppc support, extension module builds now
      check for ppc compiler support and automatically remove ppc and
      ppc64 archs when not available.
    * Since Xcode 4 no longer install SDKs in default locations,
      extension module builds now revert to using installed headers
      and libs if the SDK used to build the interpreter is not
      available.
    * Update ./configure to use better defaults for universal builds;
      in particular, --enable-universalsdk=yes uses the Xcode default
      SDK and --with-universal-archs now defaults to "intel" if ppc
      not available.

- Issue #14225: Fix Unicode support for curses (#12567) on OS X

- Issue #14928: Fix importlib bootstrap issues by using a custom executable
  (Modules/_freeze_importlib) to build Python/importlib.h.


What's New in Python 3.3.0 Alpha 4?
===================================

*Release date: 31-May-2012*

Core and Builtins
-----------------

- Issue #14835: Make plistlib output empty arrays & dicts like OS X.
  Patch by Sidney San Martín.

- Issue #14744: Use the new _PyUnicodeWriter internal API to speed up
  str%args and str.format(args).

- Issue #14930: Make memoryview objects weakrefable.

- Issue #14775: Fix a potential quadratic dict build-up due to the garbage
  collector repeatedly trying to untrack dicts.

- Issue #14857: fix regression in references to PEP 3135 implicit __class__
  closure variable (Reopens issue #12370)

- Issue #14712 (PEP 405): Virtual environments. Implemented by Vinay Sajip.

- Issue #14660 (PEP 420): Namespace packages. Implemented by Eric Smith.

- Issue #14494: Fix __future__.py and its documentation to note that
  absolute imports are the default behavior in 3.0 instead of 2.7.
  Patch by Sven Marnach.

- Issue #9260: A finer-grained import lock.  Most of the import sequence
  now uses per-module locks rather than the global import lock, eliminating
  well-known issues with threads and imports.

- Issue #14624: UTF-16 decoding is now 3x to 4x faster on various inputs.
  Patch by Serhiy Storchaka.

- asdl_seq and asdl_int_seq are now Py_ssize_t sized.

- Issue #14133 (PEP 415): Implement suppression of __context__ display with an
  attribute on BaseException. This replaces the original mechanism of PEP 409.

- Issue #14417: Mutating a dict during lookup now restarts the lookup instead
  of raising a RuntimeError (undoes issue #14205).

- Issue #14738: Speed-up UTF-8 decoding on non-ASCII data.  Patch by Serhiy
  Storchaka.

- Issue #14700: Fix two broken and undefined-behaviour-inducing overflow checks
  in old-style string formatting.

- Issue #14705: The PyArg_Parse() family of functions now support the 'p' format
  unit, which accepts a "boolean predicate" argument.  It converts any Python
  value into an integer--0 if it is "false", and 1 otherwise.

Library
-------

- Issue #14690: Use monotonic clock instead of system clock in the sched,
  subprocess and trace modules.

- Issue #14958: Change IDLE systax highlighting to recognize all string and
  byte literals supported in Python 3.3.

- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.

- Issue #14443: Tell rpmbuild to use the correct version of Python in
  bdist_rpm. Initial patch by Ross Lagerwall.

- Issue #14929: Stop Idle 3.x from closing on Unicode decode errors when
  grepping. Patch by Roger Serwy.

- Issue #12515: email now registers a defect if it gets to EOF while parsing
  a MIME part without seeing the closing MIME boundary.

- Issue #12510: Attempting to get invalid tooltip no longer closes Idle.
  Other tooltipss have been corrected or improved and the number of tests
  has been tripled. Original patch by Roger Serwy.

- Issue #1672568: email now always decodes base64 payloads, adding padding and
  ignoring non-base64-alphabet characters if needed, and registering defects
  for any such problems.

- Issue #14925: email now registers a defect when the parser decides that there
  is a missing header/body separator line.  MalformedHeaderDefect, which the
  existing code would never actually generate, is deprecated.

- Issue #10365: File open dialog now works instead of crashing even when
  the parent window is closed before the dialog. Patch by Roger Serwy.

- Issue #8739: Updated smtpd to support RFC 5321, and added support for the
  RFC 1870 SIZE extension.

- Issue #665194: Added a localtime function to email.utils to provide an
  aware local datetime for use in setting Date headers.

- Issue #12586: Added new provisional policies that implement convenient
  unicode support for email headers.  See What's New for details.

- Issue #14731: Refactored email Policy framework to support full backward
  compatibility with Python 3.2 by default yet allow for the introduction of
  new features through new policies.  Note that Policy.must_be_7bit is renamed
  to cte_type.

- Issue #14876: Use user-selected font for highlight configuration.

- Issue #14920: Fix the help(urllib.parse) failure on locale C on terminals.
  Have ascii characters in help.

- Issue #14548: Make multiprocessing finalizers check pid before
  running to cope with possibility of gc running just after fork.

- Issue #14863: Update the documentation of os.fdopen() to reflect the
  fact that it's only a thin wrapper around open() anymore.

- Issue #14036: Add an additional check to validate that port in urlparse does
  not go in illegal range and returns None.

- Issue #14862: Add missing names to os.__all__

- Issue #14875: Use float('inf') instead of float('1e66666') in the json module.

- Issue #13585: Added contextlib.ExitStack

- PEP 3144, Issue #14814: Added the ipaddress module

- Issue #14426: Correct the Date format in Expires attribute of Set-Cookie
  Header in Cookie.py.

- Issue #14588: The types module now provide new_class() and prepare_class()
  functions to support PEP 3115 compliant dynamic class creation. Patch by
  Daniel Urban and Nick Coghlan.

- Issue #13152: Allow to specify a custom tabsize for expanding tabs in
  textwrap. Patch by John Feuerstein.

- Issue #14721: Send the correct 'Content-length: 0' header when the body is an
  empty string ''. Initial Patch contributed by Arve Knudsen.

- Issue #14072: Fix parsing of 'tel' URIs in urlparse by making the check for
  ports stricter.

- Issue #9374: Generic parsing of query and fragment portions of url for any
  scheme. Supported both by RFC3986 and RFC2396.

- Issue #14798: Fix the functions in pyclbr to raise an ImportError
  when the first part of a dotted name is not a package. Patch by
  Xavier de Gaye.

- Issue #12098: multiprocessing on Windows now starts child processes
  using the same sys.flags as the current process.  Initial patch by
  Sergey Mezentsev.

- Issue #13031: Small speed-up for tarfile when unzipping tarfiles.
  Patch by Justin Peel.

- Issue #14780: urllib.request.urlopen() now has a ``cadefault`` argument
  to use the default certificate store.  Initial patch by James Oakley.

- Issue #14829: Fix bisect and range() indexing with large indices
  (>= 2 ** 32) under 64-bit Windows.

- Issue #14732: The _csv module now uses PEP 3121 module initialization.
  Patch by Robin Schreiber.

- Issue #14809: Add HTTP status codes introduced by RFC 6585 to http.server
  and http.client. Patch by EungJun Yi.

- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
  accessing the Tk clipboard.  Modify clipboad_get() to first request type
  UTF8_STRING when no specific type is requested in an X11 windowing
  environment, falling back to the current default type STRING if that fails.
  Original patch by Thomas Kluyver.

- Issue #14773: Fix os.fwalk() failing on dangling symlinks.

- Issue #12541: Be lenient with quotes around Realm field of HTTP Basic
  Authentation in urllib2.

- Issue #14807: move undocumented tarfile.filemode() to stat.filemode() and add
  doc entry. Add tarfile.filemode alias with deprecation warning.

- Issue #13815: TarFile.extractfile() now returns io.BufferedReader objects.

- Issue #14532: Add a secure_compare() helper to the hmac module, to mitigate
  timing attacks. Patch by Jon Oberheide.

- Add importlib.util.resolve_name().

- Issue #14366: Support lzma compression in zip files.
  Patch by Serhiy Storchaka.

- Issue #13959: Introduce importlib.find_loader() and document
  imp.find_module/load_module as deprecated.

- Issue #14082: shutil.copy2() now copies extended attributes, if possible.
  Patch by Hynek Schlawack.

- Issue #13959: Make importlib.abc.FileLoader.load_module()/get_filename() and
  importlib.machinery.ExtensionFileLoader.load_module() have their single
  argument be optional. Allows for the replacement (and thus deprecation) of
  imp.load_source()/load_package()/load_compiled().

- Issue #13959: imp.get_suffixes() has been deprecated in favour of the new
  attributes on importlib.machinery: SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES,
  OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, and EXTENSION_SUFFIXES. This
  led to an indirect deprecation of inspect.getmoduleinfo().

- Issue #14662: Prevent shutil failures on OS X when destination does not
  support chflag operations.  Patch by Hynek Schlawack.

- Issue #14157: Fix time.strptime failing without a year on February 29th.
  Patch by Hynek Schlawack.

- Issue #14753: Make multiprocessing's handling of negative timeouts
  the same as it was in Python 3.2.

- Issue #14583: Fix importlib bug when a package's __init__.py would first
  import one of its modules then raise an error.

- Issue #14741: Fix missing support for Ellipsis ('...') in parser module.

- Issue #14697: Fix missing support for set displays and set comprehensions in
  parser module.

- Issue #14701: Fix missing support for 'raise ... from' in parser module.

- Add support for timeouts to the acquire() methods of
  multiprocessing's lock/semaphore/condition proxies.

- Issue #13989: Add support for text mode to gzip.open().

- Issue #14127: The os.stat() result object now provides three additional
  fields: st_ctime_ns, st_mtime_ns, and st_atime_ns, providing those times as an
  integer with nanosecond resolution.  The functions os.utime(), os.lutimes(),
  and os.futimes() now accept a new parameter, ns, which accepts mtime and atime
  as integers with nanosecond resolution.

- Issue #14127 and #10148: shutil.copystat now preserves exact mtime and atime
  on filesystems providing nanosecond resolution.

Tools/Demos
-----------

- Issue #14695: Bring Tools/parser/unparse.py support up to date with
  the Python 3.3 Grammar.

Build
-----

- Issue #14472: Update .gitignore. Patch by Matej Cepl.

- Upgrade Windows library versions: bzip 1.0.6, OpenSSL 1.0.1c.

- Issue #14693: Under non-Windows platforms, hashlib's fallback modules are
  always compiled, even if OpenSSL is present at build time.

- Issue #13210: Windows build now uses VS2010, ported from VS2008.

Documentation
-------------

- Issue #14588: The language reference now accurately documents the Python 3
  class definition process. Patch by Nick Coghlan.

- Issue #14943: Correct a default argument value for winreg.OpenKey
  and correctly list the argument names in the function's explanation.


What's New in Python 3.3.0 Alpha 3?
===================================

*Release date: 01-May-2012*

Core and Builtins
-----------------

- Issue #14699: Fix calling the classmethod descriptor directly.

- Issue #14433: Prevent msvcrt crash in interactive prompt when stdin is closed.

- Issue #14521: Make result of float('nan') and float('-nan') more consistent
  across platforms.

- Issue #14646: __import__() sets __loader__ if the loader did not.

- Issue #14605: No longer have implicit entries in sys.meta_path. If
  sys.meta_path is found to be empty, raise ImportWarning.

- Issue #14605: No longer have implicit entries in sys.path_hooks. If
  sys.path_hooks is found to be empty, a warning will be raised. None is now
  inserted into sys.path_importer_cache if no finder was discovered. This also
  means imp.NullImporter is no longer implicitly used.

- Issue #13903: Implement PEP 412. Individual dictionary instances can now share
  their keys with other dictionaries. Classes take advantage of this to share
  their instance dictionary keys for improved memory and performance.

- Issue #11603 (again): Setting __repr__ to __str__ now raises a RuntimeError
  when repr() or str() is called on such an object.

- Issue #14658: Fix binding a special method to a builtin implementation of a
  special method with a different name.

- Issue #14630: Fix a memory access bug for instances of a subclass of int
  with value 0.

- Issue #14339: Speed improvements to bin, oct and hex functions.  Patch by
  Serhiy Storchaka.

- Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
  Patch by Stefan Behnel.

- Issue #14385: It is now possible to use a custom type for the __builtins__
  namespace, instead of a dict. It can be used for sandboxing for example.
  Raise also a NameError instead of ImportError if __build_class__ name if not
  found in __builtins__.

- Issue #12599: Be more strict in accepting None compared to a false-like
  object for importlib.util.module_for_loader and
  importlib.machinery.PathFinder.

- Issue #14612: Fix jumping around with blocks by setting f_lineno.

- Issue #14592: Attempting a relative import w/o __package__ or __name__ set in
  globals raises a KeyError.

- Issue #14607: Fix keyword-only arguments which started with ``__``.

- Issue #10854: The ImportError raised when an extension module on Windows
  fails to import now uses the new path and name attributes from
  Issue #1559549.

- Issue #13889: Check and (if necessary) set FPU control word before calling
  any of the dtoa.c string <-> float conversion functions, on MSVC builds of
  Python.  This fixes issues when embedding Python in a Delphi app.

- __import__() now matches PEP 328 and documentation by defaulting 'index' to 0
  instead of -1 and removing support for negative values.

- Issue #2377: Make importlib the implementation of __import__().

- Issue #1559549: ImportError now has 'name' and 'path' attributes that are set
  using keyword arguments to its constructor. They are currently not set by
  import as they are meant for use by importlib.

- Issue #14474: Save and restore exception state in thread.start_new_thread()
  while writing error message if the thread leaves a unhandled exception.

- Issue #13019: Fix potential reference leaks in bytearray.extend().  Patch
  by Suman Saha.

Library
-------

- Issue #14768: os.path.expanduser('~/a') doesn't works correctly when HOME is '/'.

- Issue #14371: Support bzip2 in zipfile module.  Patch by Serhiy Storchaka.

- Issue #13183: Fix pdb skipping frames after hitting a breakpoint and running
  step.  Patch by Xavier de Gaye.

- Issue #14696: Fix parser module to understand 'nonlocal' declarations.

- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
  the DST transition.  Patch by Joe Peterson.

- Issue #9154: Fix parser module to understand function annotations.

- Issue #6085: In http.server.py SimpleHTTPServer.address_string returns the
  client ip address instead client hostname. Patch by Charles-François Natali.

- Issue #14309: Deprecate time.clock(), use time.perf_counter() or
  time.process_time() instead.

- Issue #14428: Implement the PEP 418. Add time.get_clock_info(),
  time.perf_counter() and time.process_time() functions, and rename
  time.steady() to time.monotonic().

- Issue #14646: importlib.util.module_for_loader() now sets __loader__ and
  __package__ (when possible).

- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
  test class that doesn't inherit from TestCase (i.e. a mixin).

- Issue #4892: multiprocessing Connections can now be transferred over
  multiprocessing Connections.  Patch by Richard Oudkerk (sbt).

- Issue #14160: TarFile.extractfile() failed to resolve symbolic links when
  the links were not located in an archive subdirectory.

- Issue #14638: pydoc now treats non-string __name__ values as if they
  were missing, instead of raising an error.

- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites
  which send EOF without trailing \r\n.

- Issue #14605: Add importlib.abc.FileLoader, importlib.machinery.(FileFinder,
  SourceFileLoader, SourcelessFileLoader, ExtensionFileLoader).

- Issue #13959: imp.cache_from_source()/source_from_cache() now follow
  os.path.join()/split() semantics for path manipulation instead of its prior,
  custom semantics of caring the right-most path separator forward in path
  joining.

- Issue #2193: Allow ":" character in Cookie NAME values.

- Issue #14629: tokenizer.detect_encoding will specify the filename in the
  SyntaxError exception if found at readline.__self__.name.

- Issue #14629: Raise SyntaxError in tokenizer.detect_encoding if the
  first two lines have non-UTF-8 characters without an encoding declaration.

- Issue #14308: Fix an exception when a "dummy" thread is in the threading
  module's active list after a fork().

- Issue #11750: The Windows API functions scattered in the _subprocess and
  _multiprocessing.win32 modules now live in a single module "_winapi".
  Patch by sbt.

- Issue #14087: multiprocessing: add Condition.wait_for(). Patch by sbt.

- Issue #14538: HTMLParser can now parse correctly start tags that contain
  a bare '/'.

- Issue #14452: SysLogHandler no longer inserts a UTF-8 BOM into the message.

- Issue #14386: Expose the dict_proxy internal type as types.MappingProxyType.

- Issue #13959: Make imp.reload() always use a module's __loader__ to perform
  the reload.

- Issue #13959: Add imp.py and rename the built-in module to _imp, allowing for
  re-implementing parts of the module in pure Python.

- Issue #13496: Fix potential overflow in bisect.bisect algorithm when applied
  to a collection of size > sys.maxsize / 2.

- Have importlib take advantage of ImportError's new 'name' and 'path'
  attributes.

- Issue #14399: zipfile now recognizes that the archive has been modified even
  if only the comment is changed.  In addition, the TypeError that results from
  trying to set a non-binary value as a comment is now raised at the time
  the comment is set rather than at the time the zipfile is written.

- trace.CoverageResults.is_ignored_filename() now ignores any name that starts
  with "<" and ends with ">" instead of special-casing "<string>" and
  "<doctest ".

- Issue #12537: The mailbox module no longer depends on knowledge of internal
  implementation details of the email package Message object.

- Issue #7978: socketserver now restarts the select() call when EINTR is
  returned.  This avoids crashing the server loop when a signal is received.
  Patch by Jerzy Kozera.

- Issue #14522: Avoid duplicating socket handles in multiprocessing.connection.
  Patch by sbt.

- Don't Py_DECREF NULL variable in io.IncrementalNewlineDecoder.

- Issue #8515: Set __file__ when run file in IDLE.
  Initial patch by Bruce Frederiksen.

- Issue #14496: Fix wrong name in idlelib/tabbedpages.py.
  Patch by Popa Claudiu.

- Issue #3033: Add displayof parameter to tkinter font. Patch by Guilherme Polo.

- Issue #14482: Raise a ValueError, not a NameError, when trying to create
  a multiprocessing Client or Listener with an AF_UNIX type address under
  Windows.  Patch by Popa Claudiu.

- Issue #802310: Generate always unique tkinter font names if not directly passed.

- Issue #14151: Raise a ValueError, not a NameError, when trying to create
  a multiprocessing Client or Listener with an AF_PIPE type address under
  non-Windows platforms.  Patch by Popa Claudiu.

- Issue #14493: Use gvfs-open or xdg-open in webbrowser.

Build
-----

- "make touch" will now touch generated files that are checked into Mercurial,
  after a "hg update" which failed to bring the timestamps into the right order.

Tests
-----

- Issue #14026: In test_cmd_line_script, check that sys.argv is populated
  correctly for the various invocation approaches (Patch by Jason Yeo)

- Issue #14032: Fix incorrect variable name in test_cmd_line_script debugging
  message (Patch by Jason Yeo)

- Issue #14589: Update certificate chain for sha256.tbs-internet.com, fixing
  a test failure in test_ssl.

- Issue #14355: Regrtest now supports the standard unittest test loading, and
  will use it if a test file contains no `test_main` method.

Tools / Demos
-------------

- Issue #3561: The Windows installer now has an option, off by default, for
  placing the Python installation into the system "Path" environment variable.

- Issue #13165: stringbench is now available in the Tools/stringbench folder.
  It used to live in its own SVN project.


What's New in Python 3.3.0 Alpha 2?
===================================

*Release date: 01-Apr-2012*

Core and Builtins
-----------------

- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
  are passed arguments and their complementary method is not overridden.

- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
  the module name that was not interned.

- Issue #14331: Use significantly less stack space when importing modules by
  allocating path buffers on the heap instead of the stack.

- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
  passed strings.

- Issue #1469629: Allow cycles through an object's __dict__ slot to be
  collected. (For example if ``x.__dict__ is x``).

- Issue #14205: dict lookup raises a RuntimeError if the dict is modified
  during a lookup.

- Issue #14220: When a generator is delegating to another iterator with the
  yield from syntax, it needs to have its ``gi_running`` flag set to True.

- Issue #14435: Remove dedicated block allocator from floatobject.c and rely
  on the PyObject_Malloc() api like all other objects.

- Issue #14471: Fix a possible buffer overrun in the winreg module.

- Issue #14288: Allow the serialization of builtin iterators

Library
-------

- Issue #14300: Under Windows, sockets created using socket.dup() now allow
  overlapped I/O.  Patch by sbt.

- Issue #13872: socket.detach() now marks the socket closed (as mirrored
  in the socket repr()).  Patch by Matt Joiner.

- Issue #14406: Fix a race condition when using ``concurrent.futures.wait(
  return_when=ALL_COMPLETED)``.  Patch by Matt Joiner.

- Issue #5136: deprecate old, unused functions from tkinter.

- Issue #14409: IDLE now properly executes commands in the Shell window
  when it cannot read the normal config files on startup and
  has to use the built-in default key bindings.
  There was previously a bug in one of the defaults.

- Issue #14416: syslog now defines the LOG_ODELAY and LOG_AUTHPRIV constants
  if they are defined in <syslog.h>.

- IDLE can be launched as python -m idlelib

- Issue #14295: Add unittest.mock

- Issue #7652: Add --with-system-libmpdec option to configure for linking
  the _decimal module against an installed libmpdec.

- Issue #14380: MIMEText now defaults to utf-8 when passed non-ASCII unicode
  with no charset specified.

- Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
  OSX; avoid to call handle_connect in case of a disconnected socket which
  was not meant to connect.

- Issue #14204: The ssl module now has support for the Next Protocol
  Negotiation extension, if available in the underlying OpenSSL library.
  Patch by Colin Marc.

- Issue #3035: Unused functions from tkinter are marked as pending deprecated.

- Issue #12757: Fix the skipping of doctests when python is run with -OO so
  that it works in unittest's verbose mode as well as non-verbose mode.

- Issue #7652: Integrate the decimal floating point libmpdec library to speed
  up the decimal module. Performance gains of the new C implementation are
  between 10x and 100x, depending on the application.

- Issue #3573: IDLE hangs when passing invalid command line args
  (directory(ies) instead of file(s)) (Patch by Guilherme Polo)

- Issue #14269: SMTPD now conforms to the RFC and requires a HELO command
  before MAIL, RCPT, or DATA.

- Issue #13694: asynchronous connect in asyncore.dispatcher does not set addr
  attribute.

- Issue #14344: fixed the repr of email.policy objects.

- Issue #11686: Added missing entries to email package __all__ lists
  (mostly the new Bytes classes).

- Issue #14335: multiprocessing's custom Pickler subclass now inherits from
  the C-accelerated implementation.  Patch by sbt.

- Issue #10484: Fix the CGIHTTPServer's PATH_INFO handling problem.

- Issue #11199: Fix the with urllib which hangs on particular ftp urls.

- Improve the memory utilization and speed of functools.lru_cache.

- Issue #14222: Use the new time.steady() function instead of time.time() for
  timeout in queue and threading modules to not be affected of system time
  update.

- Issue #13248: Remove lib2to3.pytree.Base.get_prefix/set_prefix.

- Issue #14234: CVE-2012-0876: Randomize hashes of xml attributes in the hash
  table internal to the pyexpat module's copy of the expat library to avoid a
  denial of service due to hash collisions.  Patch by David Malcolm with some
  modifications by the expat project.

- Issue #14200: Idle shell crash on printing non-BMP unicode character.

- Issue #12818: format address no longer needlessly \ escapes ()s in names when
  the name ends up being quoted.

- Issue #14062: BytesGenerator now correctly folds Header objects,
  including using linesep when folding.

- Issue #13839: When invoked on the command-line, the pstats module now
  accepts several filenames of profile stat files and merges them all.
  Patch by Matt Joiner.

- Issue #14291: Email now defaults to utf-8 for non-ASCII unicode headers
  instead of raising an error.  This fixes a regression relative to 2.7.

- Issue #989712: Support using Tk without a mainloop.

- Issue #5219: Prevent event handler cascade in IDLE.

- Issue #3835: Refuse to use unthreaded Tcl in threaded Python.

- Issue #2843: Add new Tk API to Tkinter.

- Issue #14184: Increase the default stack size for secondary threads on
  Mac OS X to avoid interpreter crashes when using threads on 10.7.

- Issue #14180: datetime.date.fromtimestamp(),
  datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp()
  now raise an OSError instead of ValueError if localtime() or gmtime() failed.

- Issue #14180: time.ctime(), gmtime(), time.localtime(),
  datetime.date.fromtimestamp(), datetime.datetime.fromtimestamp() and
  datetime.datetime.utcfromtimestamp() now raises an OverflowError, instead of
  a ValueError, if the timestamp does not fit in time_t.

- Issue #14180: datetime.datetime.fromtimestamp() and
  datetime.datetime.utcfromtimestamp() now round microseconds towards zero
  instead of rounding to nearest with ties going away from zero.

- Issue #10543: Fix unittest test discovery with Jython bytecode files.

- Issue #1178863: Separate initialisation from setting when initializing
  Tkinter.Variables; harmonize exceptions to ValueError; only delete variables
  that have not been deleted; assert that variable names are strings.

- Issue #14104: Implement time.monotonic() on Mac OS X, patch written by
  Nicholas Riley.

- Issue #13394: the aifc module now uses warnings.warn() to signal warnings.

- Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under
  Windows when the child process has already exited.

- Issue #14223: curses.addch() is no more limited to the range 0-255 when the
  Python curses is not linked to libncursesw. It was a regression introduced
  in Python 3.3a1.

- Issue #14168: Check for presence of Element._attrs in minidom before
  accessing it.

- Issue #12328: Fix multiprocessing's use of overlapped I/O on Windows.
  Also, add a multiprocessing.connection.wait(rlist, timeout=None) function
  for polling multiple objects at once.  Patch by sbt.

- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end,
  data or close method) for the Python implementation as well.
  Drop the no-op TreeBuilder().xml() method from the C implementation.

- Issue #14210: pdb now has tab-completion not only for command names, but
  also for their arguments, wherever possible.

- Issue #14310: Sockets can now be with other processes on Windows using
  the api socket.socket.share() and socket.fromshare().

- Issue #10576: The gc module now has a 'callbacks' member that will get
  called when garbage collection takes place.

Build
-----

- Issue #14557: Fix extensions build on HP-UX. Patch by Adi Roiban.

- Issue #14387: Do not include accu.h from Python.h.

- Issue #14359: Only use O_CLOEXEC in _posixmodule.c if it is defined.
  Based on patch from Hervé Coatanhay.

- Issue #14321: Do not run pgen during the build if files are up to date.

Documentation
-------------

- Issue #14034: added the argparse tutorial.

- Issue #14324: Fix configure tests for cross builds.

- Issue #14327: Call AC_CANONICAL_HOST in configure.ac and check in
  config.{guess,sub}. Don't use uname calls for cross builds.

Extension Modules
-----------------

- Issue #9041: An issue in ctypes.c_longdouble, ctypes.c_double, and
  ctypes.c_float that caused an incorrect exception to be returned in the
  case of overflow has been fixed.

- Issue #14212: The re module didn't retain a reference to buffers it was
  scanning, resulting in segfaults.

- Issue #14259: The finditer() method of re objects did not take any
  keyword arguments, contrary to the documentation.

- Issue #10142: Support for SEEK_HOLE/SEEK_DATA (for example, under ZFS).

Tests
-----

- Issue #14442: Add missing errno import in test_smtplib.

- Issue #8315: (partial fix) python -m unittest test.test_email now works.


What's New in Python 3.3.0 Alpha 1?
===================================

*Release date: 05-Mar-2012*

Core and Builtins
-----------------

- Issue #14172: Fix reference leak when marshalling a buffer-like object
  (other than a bytes object).

- Issue #13521: dict.setdefault() now does only one lookup for the given key,
  making it "atomic" for many purposes.  Patch by Filip Gruszczyński.

- PEP 409, Issue #6210: "raise X from None" is now supported as a means of
  suppressing the display of the chained exception context. The chained
  context still remains available as the __context__ attribute.

- Issue #10181: New memoryview implementation fixes multiple ownership
  and lifetime issues of dynamically allocated Py_buffer members (#9990)
  as well as crashes (#8305, #7433). Many new features have been added
  (See whatsnew/3.3), and the documentation has been updated extensively.
  The ndarray test object from _testbuffer.c implements all aspects of
  PEP-3118, so further development towards the complete implementation
  of the PEP can proceed in a test-driven manner.

  Thanks to Nick Coghlan, Antoine Pitrou and Pauli Virtanen for review
  and many ideas.

- Issue #12834: Fix incorrect results of memoryview.tobytes() for
  non-contiguous arrays.

- Issue #5231: Introduce memoryview.cast() method that allows changing
  format and shape without making a copy of the underlying memory.

- Issue #14084: Fix a file descriptor leak when importing a module with a
  bad encoding.

- Upgrade Unicode data to Unicode 6.1.

- Issue #14040: Remove rarely used file name suffixes for C extensions
  (under POSIX mainly).

- Issue #14051: Allow arbitrary attributes to be set of classmethod and
  staticmethod.

- Issue #13703: oCERT-2011-003: Randomize hashes of str and bytes to protect
  against denial of service attacks due to hash collisions within the dict and
  set types.  Patch by David Malcolm, based on work by Victor Stinner.

- Issue #13020: Fix a reference leak when allocating a structsequence object
  fails.  Patch by Suman Saha.

- Issue #13908: Ready types returned from PyType_FromSpec.

- Issue #11235: Fix OverflowError when trying to import a source file whose
  modification time doesn't fit in a 32-bit timestamp.

- Issue #12705: A SyntaxError exception is now raised when attempting to
  compile multiple statements as a single interactive statement.

- Fix the builtin module initialization code to store the init function for
  future reinitialization.

- Issue #8052: The posix subprocess module would take a long time closing
  all possible file descriptors in the child process rather than just open
  file descriptors.  It now closes only the open fds if possible for the
  default close_fds=True behavior.

- Issue #13629: Renumber the tokens in token.h so that they match the indexes
  into _PyParser_TokenNames.

- Issue #13752: Add a casefold() method to str.

- Issue #13761: Add a "flush" keyword argument to the print() function,
  used to ensure flushing the output stream.

- Issue #13645: pyc files now contain the size of the corresponding source
  code, to avoid timestamp collisions (especially on filesystems with a low
  timestamp resolution) when checking for freshness of the bytecode.

- PEP 380, Issue #11682: Add "yield from <x>" to support easy delegation to
  subgenerators (initial patch by Greg Ewing, integration into 3.3 by
  Renaud Blanch, Ryan Kelly, Zbigniew Jędrzejewski-Szmek and Nick Coghlan)

- Issue #13748: Raw bytes literals can now be written with the ``rb`` prefix
  as well as ``br``.

- Issue #12736: Use full unicode case mappings for upper, lower, and title case.

- Issue #12760: Add a create mode to open(). Patch by David Townshend.

- Issue #13738: Simplify implementation of bytes.lower() and bytes.upper().

- Issue #13577: Built-in methods and functions now have a __qualname__.
  Patch by sbt.

- Issue #6695: Full garbage collection runs now clear the freelist of set
  objects.  Initial patch by Matthias Troffaes.

- Fix OSError.__init__ and OSError.__new__ so that each of them can be
  overriden and take additional arguments (followup to issue #12555).

- Fix the fix for issue #12149: it was incorrect, although it had the side
  effect of appearing to resolve the issue.  Thanks to Mark Shannon for
  noticing.

- Issue #13505: Pickle bytes objects in a way that is compatible with
  Python 2 when using protocols <= 2.

- Issue #11147: Fix an unused argument in _Py_ANNOTATE_MEMORY_ORDER.  (Fix
  given by Campbell Barton).

- Issue #13503: Use a more efficient reduction format for bytearrays with
  pickle protocol >= 3.  The old reduction format is kept with older protocols
  in order to allow unpickling under Python 2.  Patch by Irmen de Jong.

- Issue #7111: Python can now be run without a stdin, stdout or stderr
  stream.  It was already the case with Python 2.  However, the corresponding
  sys module entries are now set to None (instead of an unusable file object).

- Issue #11849: Ensure that free()d memory arenas are really released
  on POSIX systems supporting anonymous memory mappings.  Patch by
  Charles-François Natali.

- Issue #13452: PyUnicode_EncodeDecimal() doesn't support error handlers
  different than "strict" anymore. The caller was unable to compute the
  size of the output buffer: it depends on the error handler.

- PEP 3155 / issue #13448: Qualified name for classes and functions.

- Issue #13436: Fix a bogus error message when an AST object was passed
  an invalid integer value.

- Issue #13411: memoryview objects are now hashable when the underlying
  object is hashable.

- Issue #13338: Handle all enumerations in _Py_ANNOTATE_MEMORY_ORDER
  to allow compiling extension modules with -Wswitch-enum on gcc.
  Initial patch by Floris Bruynooghe.

- Issue #10227: Add an allocation cache for a single slice object.  Patch by
  Stefan Behnel.

- Issue #13393: BufferedReader.read1() now asks the full requested size to
  the raw stream instead of limiting itself to the buffer size.

- Issue #13392: Writing a pyc file should now be atomic under Windows as well.

- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
  already accepts them).

- Issue #13389: Full garbage collection passes now clear the freelists for
  list and dict objects.  They already cleared other freelists in the
  interpreter.

- Issue #13327: Remove the need for an explicit None as the second argument
  to os.utime, os.lutimes, os.futimes, os.futimens, os.futimesat, in
  order to update to the current time. Also added keyword argument
  handling to os.utimensat in order to remove the need for explicit None.

- Issue #13350: Simplify some C code by replacing most usages of
  PyUnicode_Format by PyUnicode_FromFormat.

- Issue #13342: input() used to ignore sys.stdin's and sys.stdout's unicode
  error handler in interactive mode (when calling into PyOS_Readline()).

- Issue #9896: Add start, stop, and step attributes to range objects.

- Issue #13343: Fix a SystemError when a lambda expression uses a global
  variable in the default value of a keyword-only argument: ``lambda *,
  arg=GLOBAL_NAME: None``

- Issue #12797: Added custom opener parameter to builtin open() and
  FileIO.open().

- Issue #10519: Avoid unnecessary recursive function calls in
  setobject.c.

- Issue #10363: Deallocate global locks in Py_Finalize().

- Issue #13018: Fix reference leaks in error paths in dictobject.c.
  Patch by Suman Saha.

- Issue #13201: Define '==' and '!=' to compare range objects based on
  the sequence of values they define (instead of comparing based on
  object identity).

- Issue #1294232: In a few cases involving metaclass inheritance, the
  interpreter would sometimes invoke the wrong metaclass when building a new
  class object. These cases now behave correctly. Patch by Daniel Urban.

- Issue #12753: Add support for Unicode name aliases and named sequences.
  Both ``unicodedata.lookup()`` and '\N{...}' now resolve aliases,
  and ``unicodedata.lookup()`` resolves named sequences too.

- Issue #12170: The count(), find(), rfind(), index() and rindex() methods
  of bytes and bytearray objects now accept an integer between 0 and 255
  as their first argument.  Patch by Petri Lehtinen.

- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler
  warnings. Patch by Josh Triplett and Petri Lehtinen.

- Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore
  error handlers on all Windows versions. The MBCS codec is now supporting all
  error handlers, instead of only replace to encode and ignore to decode.

- Issue #13188: When called without an explicit traceback argument,
  generator.throw() now gets the traceback from the passed exception's
  ``__traceback__`` attribute.  Patch by Petri Lehtinen.

- Issue #13146: Writing a pyc file is now atomic under POSIX.

- Issue #7833: Extension modules built using distutils on Windows will no
  longer include a "manifest" to prevent them failing at import time in some
  embedded situations.

- PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.

- Issue #13560: Add PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize()
  and PyUnicode_EncodeLocale() functions to the C API to decode/encode from/to
  the current locale encoding.

- Add internal API for static strings (_Py_identifier et al.).

- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described
  as "The pipe is being closed") is now mapped to POSIX errno EPIPE
  (previously EINVAL).

- Issue #12911: Fix memory consumption when calculating the repr() of huge
  tuples or lists.

- PEP 393: flexible string representation. Thanks to Torsten Becker for the
  initial implementation, and Victor Stinner for various bug fixes.

- Issue #14081: The 'sep' and 'maxsplit' parameter to str.split, bytes.split,
  and bytearray.split may now be passed as keyword arguments.

- Issue #13012: The 'keepends' parameter to str.splitlines may now be passed
  as a keyword argument:  "my_string.splitlines(keepends=True)".  The same
  change also applies to bytes.splitlines and bytearray.splitlines.

- Issue #7732: Don't open a directory as a file anymore while importing a
  module. Ignore the direcotry if its name matchs the module name (e.g.
  "__init__.py") and raise a ImportError instead.

- Issue #13021: Missing decref on an error path.  Thanks to Suman Saha for
  finding the bug and providing a patch.

- Issue #12973: Fix overflow checks that relied on undefined behaviour in
  list_repeat (listobject.c) and islice_next (itertoolsmodule.c).  These bugs
  caused test failures with recent versions of Clang.

- Issue #12904: os.utime, os.futimes, os.lutimes, and os.futimesat now write
  atime and mtime with nanosecond precision on modern POSIX platforms.

- Issue #12802: the Windows error ERROR_DIRECTORY (numbered 267) is now
  mapped to POSIX errno ENOTDIR (previously EINVAL).

- Issue #9200: The str.is* methods now work with strings that contain non-BMP
  characters even in narrow Unicode builds.

- Issue #12791: Break reference cycles early when a generator exits with
  an exception.

- Issue #12773: Make __doc__ mutable on user-defined classes.

- Issue #12766: Raise a ValueError when creating a class with a class variable
  that conflicts with a name in __slots__.

- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase
  titlecased and cased non-letter characters.

- Issue #12732: In narrow unicode builds, allow Unicode identifiers which fall
  outside the BMP.

- Issue #12575: Validate user-generated AST before it is compiled.

- Make type(None), type(Ellipsis), and type(NotImplemented) callable. They
  return the respective singleton instances.

- Forbid summing bytes with sum().

- Verify the types of AST strings and identifiers provided by the user before
  compiling them.

- Issue #12647: The None object now has a __bool__() method that returns False.
  Formerly, bool(None) returned False only because of special case logic
  in PyObject_IsTrue().

- Issue #12579: str.format_map() now raises a ValueError if used on a
  format string that contains positional fields. Initial patch by
  Julian Berman.

- Issue #10271: Allow warnings.showwarning() be any callable.

- Issue #11627: Fix segfault when __new__ on a exception returns a
  non-exception class.

- Issue #12149: Update the method cache after a type's dictionary gets
  cleared by the garbage collector.  This fixes a segfault when an instance
  and its type get caught in a reference cycle, and the instance's
  deallocator calls one of the methods on the type (e.g. when subclassing
  IOBase).  Diagnosis and patch by Davide Rizzo.

- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.

- Issue #9642: Uniformize the tests on the availability of the mbcs codec, add
  a new HAVE_MBCS define.

- Issue #9642: Fix filesystem encoding initialization: use the ANSI code page
  on Windows if the mbcs codec is not available, and fail with a fatal error if
  we cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
  instead of using UTF-8.

- When a generator yields, do not retain the caller's exception state on the
  generator.

- Issue #12475: Prevent generators from leaking their exception state into the
  caller's frame as they return for the last time.

- Issue #12291: You can now load multiple marshalled objects from a stream,
  with other data interleaved between marshalled objects.

- Issue #12356: When required positional or keyword-only arguments are not
  given, produce a informative error message which includes the name(s) of the
  missing arguments.

- Issue #12370: Fix super with no arguments when __class__ is overriden in the
  class body.

- Issue #12084: os.stat on Windows now works properly with relative symbolic
  links when called from any directory.

- Loosen type restrictions on the __dir__ method. __dir__ can now return any
  sequence, which will be converted to a list and sorted by dir().

- Issue #12265: Make error messages produced by passing an invalid set of
  arguments to a function more informative.

- Issue #12225: Still allow Python to build if Python is not in its hg repo or
  mercurial is not installed.

- Issue #1195: my_fgets() now always clears errors before calling fgets(). Fix
  the following case: sys.stdin.read() stopped with CTRL+d (end of file),
  raw_input() interrupted by CTRL+c.

- Issue #12216: Allow unexpected EOF errors to happen on any line of the file.

- Issue #12199: The TryExcept and TryFinally and AST nodes have been unified
  into a Try node.

- Issue #9670: Increase the default stack size for secondary threads on
  Mac OS X and FreeBSD to reduce the chances of a crash instead of a
  "maximum recursion depth" RuntimeError exception.
  (patch by Ronald Oussoren)

- Issue #12106: The use of the multiple-with shorthand syntax is now reflected
  in the AST.

- Issue #12190: Try to use the same filename object when compiling unmarshalling
  a code objects in the same file.

- Issue #12166: Move implementations of dir() specialized for various types into
  the __dir__() methods of those types.

- Issue #5715: In socketserver, close the server socket in the child process.

- Correct lookup of __dir__ on objects. Among other things, this causes errors
  besides AttributeError found on lookup to be propagated.

- Issue #12060: Use sig_atomic_t type and volatile keyword in the signal
  module. Patch written by Charles-François Natali.

- Issue #1746656: Added the if_nameindex, if_indextoname, if_nametoindex
  methods to the socket module.

- Issue #12044: Fixed subprocess.Popen when used as a context manager to
  wait for the process to end when exiting the context to avoid unintentionally
  leaving zombie processes around.

- Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c,
  clear the end-of-file indicator after CTRL+d.

- Issue #1856: Avoid crashes and lockups when daemon threads run while the
  interpreter is shutting down; instead, these threads are now killed when
  they try to take the GIL.

- Issue #9756: When calling a method descriptor or a slot wrapper descriptor,
  the check of the object type doesn't read the __class__ attribute anymore.
  Fix a crash if a class override its __class__ attribute (e.g. a proxy of the
  str type). Patch written by Andreas Stührk.

- Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
  APIs, to avoid a crash with the pthread implementation in RHEL 5.  Patch
  by Charles-François Natali.

- Issue #10914: Initialize correctly the filesystem codec when creating a new
  subinterpreter to fix a bootstrap issue with codecs implemented in Python, as
  the ISO-8859-15 codec.

- Issue #11918: OS/2 and VMS are no more supported because of the lack of
  maintainer.

- Issue #6780: fix starts/endswith error message to mention that tuples are
  accepted too.

- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
  between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
  chars (e.g. "\U00012345"[0]).

- Issue #11845: Fix typo in rangeobject.c that caused a crash in
  compute_slice_indices.  Patch by Daniel Urban.

- Issue #5673: Added a `timeout` keyword argument to subprocess.Popen.wait,
  subprocess.Popen.communicated, subprocess.call, subprocess.check_call, and
  subprocess.check_output.  If the blocking operation takes more than `timeout`
  seconds, the `subprocess.TimeoutExpired` exception is raised.

- Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted
  (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch
  written by Charles-Francois Natali.

- Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.

- Issue #10785: Store the filename as Unicode in the Python parser.

- Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
  on Windows.

- Issue #10998: Remove mentions of -Q, sys.flags.division_warning and
  Py_DivisionWarningFlag left over from Python 2.

- Issue #11244: Remove an unnecessary peepholer check that was preventing
  negative zeros from being constant-folded properly.

- Issue #11395: io.FileIO().write() clamps the data length to 32,767 bytes on
  Windows if the file is a TTY to workaround a Windows bug. The Windows console
  returns an error (12: not enough space error) on writing into stdout if
  stdout mode is binary and the length is greater than 66,000 bytes (or less,
  depending on heap usage).

- Issue #11320: fix bogus memory management in Modules/getpath.c, leading to
  a possible crash when calling Py_SetPath().

- Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
  3.2.0 where the stdout or stderr file descriptor being the same as the stdin
  file descriptor would raise an exception. webbrowser.open would fail. fixed.

- Issue #9856: Change object.__format__ with a non-empty format string
  to be a DeprecationWarning. In 3.2 it was a PendingDeprecationWarning.
  In 3.4 it will be a TypeError.

- Issue #11244: The peephole optimizer is now able to constant-fold
  arbitrarily complex expressions.  This also fixes a 3.2 regression where
  operations involving negative numbers were not constant-folded.

- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when
  there are many tags (e.g. when using mq).  Patch by Nadeem Vawda.

- Issue #11335: Fixed a memory leak in list.sort when the key function
  throws an exception.

- Issue #8923: When a string is encoded to UTF-8 in strict mode, the result is
  cached into the object. Examples: str.encode(), str.encode('utf-8'),
  PyUnicode_AsUTF8String() and PyUnicode_AsEncodedString(unicode, "utf-8",
  NULL).

- Issue #10831: PyUnicode_FromFormat() supports %li, %lli and %zi formats.

- Issue #10829: Refactor PyUnicode_FromFormat(), use the same function to parse
  the format string in the 3 steps, fix crashs on invalid format strings.

- Issue #13007: whichdb should recognize gdbm 1.9 magic numbers.

- Issue #11246: Fix PyUnicode_FromFormat("%V") to decode the byte string from
  UTF-8 (with replace error handler) instead of ISO-8859-1 (in strict mode).
  Patch written by Ray Allen.

- Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
  a buffer struct having a NULL data pointer.

- Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
  sys.stdin uses universal newline (replace '\r\n' by '\n').

- Issue #11828: startswith and endswith now accept None as slice index.
  Patch by Torsten Becker.

- Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
  narrow build.

- Issue #11168: Remove filename debug variable from PyEval_EvalFrameEx().
  It encoded the Unicode filename to UTF-8, but the encoding fails on
  undecodable filename (on surrogate characters) which raises an unexpected
  UnicodeEncodeError on recursion limit.

- Issue #11187: Remove bootstrap code (use ASCII) of
  PyUnicode_AsEncodedString(), it was replaced by a better fallback (use the
  locale encoding) in PyUnicode_EncodeFSDefault().

- Check for NULL result in PyType_FromSpec.

- Issue #10516: New copy() and clear() methods for lists and bytearrays.

- Issue #11386: bytearray.pop() now throws IndexError when the bytearray is
  empty, instead of OverflowError.

- Issue #12380: The rjust, ljust and center methods of bytes and bytearray
  now accept a bytearray argument.

Library
-------

- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly
  return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been
  fixed.

- Issue #14166: Pickler objects now have an optional ``dispatch_table``
  attribute which allows to set custom per-pickler reduction functions.
  Patch by sbt.

- Issue #14177: marshal.loads() now raises TypeError when given an unicode
  string.  Patch by Guilherme Gonçalves.

- Issue #13550: Remove the debug machinery from the threading module: remove
  verbose arguments from all threading classes and functions.

- Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary,
  WeakValueDictionary) to return a better approximation when some objects
  are dead or dying.  Moreover, the implementation is now O(1) rather than
  O(n).

- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode.
  Patch by Mikhail Novikov.

- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version.
  Patch by Filip Gruszczyński.

- Issue #13447: Add a test file to host regression tests for bugs in the
  scripts found in the Tools directory.

- Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils
  on Windows.  Also fixed in packaging.

- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions
  on 32-bit architectures. Initial patch by Philippe Devalkeneer.

- HTMLParser is now able to handle slashes in the start tag.

- Issue #13641: Decoding functions in the base64 module now accept ASCII-only
  unicode strings.  Patch by Catalin Iacob.

- Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a
  new importlib.invalidate_caches() function.

- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in
  SimpleXMLRPCServer upon malformed POST request.

- Issue #13961: Move importlib over to using os.replace() for atomic renaming.

- Do away with ambiguous level values (as suggested by PEP 328) in
  importlib.__import__() by raising ValueError when level < 0.

- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF.

- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().

- Issue #13777: Add PF_SYSTEM sockets on OS X.
  Patch by Michael Goderbauer.

- Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
  Patch by Suman Saha.

- Issue #1326113: distutils' and packaging's build_ext commands option now
  correctly parses multiple values (separated by whitespace or commas) given
  to their --libraries option.

- Issue #10287: nntplib now queries the server's CAPABILITIES first before
  sending MODE READER, and only sends it if not already in READER mode.
  Patch by Hynek Schlawack.

- Issue #13993: HTMLParser is now able to handle broken end tags when
  strict=False.

- Issue #13930: lib2to3 now supports writing converted output files to another
  directory tree as well as copying unchanged files and altering the file
  suffix.

- Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields
  with a name that is a keyword or contains quotes. Patch by Marko
  Kohtala.

- Issue #10287: nntplib now queries the server's CAPABILITIES again after
  authenticating (since the result may change, according to RFC 4643).
  Patch by Hynek Schlawack.

- Issue #13989: Document that GzipFile does not support text mode, and give a
  more helpful error message when opened with an invalid mode string.

- Issue #13590: On OS X 10.7 and 10.6 with Xcode 4.2, building
  Distutils-based packages with C extension modules may fail because
  Apple has removed gcc-4.2, the version used to build python.org
  64-bit/32-bit Pythons.  If the user does not explicitly override
  the default C compiler by setting the CC environment variable,
  Distutils will now attempt to compile extension modules with clang
  if gcc-4.2 is required but not found. Also as a convenience, if
  the user does explicitly set CC, substitute its value as the default
  compiler in the Distutils LDSHARED configuration variable for OS X.
  (Note, the python.org 32-bit-only Pythons use gcc-4.0 and the 10.4u
  SDK, neither of which are available in Xcode 4.  This change does not
  attempt to override settings to support their use with Xcode 4.)

- Issue #13960: HTMLParser is now able to handle broken comments when
  strict=False.

- Issue #13921: Undocument and clean up sqlite3.OptimizedUnicode,
  which is obsolete in Python 3.x. It's now aliased to str for
  backwards compatibility.

- When '' is a path (e.g. in sys.path), make sure __file__ uses the current
  working directory instead of '' in importlib.

- Issue #13609: Add two functions to query the terminal size:
  os.get_terminal_size (low level) and shutil.get_terminal_size (high level).
  Patch by Zbigniew Jędrzejewski-Szmek.

- Issue #13845: On Windows, time.time() now uses GetSystemTimeAsFileTime()
  instead of ftime() to have a resolution of 100 ns instead of 1 ms (the clock
  accuracy is between 0.5 ms and 15 ms).

- Issue #13846: Add time.monotonic(), monotonic clock.

- Issue #8184: multiprocessing: On Windows, don't set SO_REUSEADDR on
  Connection sockets, and set FILE_FLAG_FIRST_PIPE_INSTANCE on named pipes, to
  make sure two listeners can't bind to the same socket/pipe (or any existing
  socket/pipe).

- Issue #10811: Fix recursive usage of cursors. Instead of crashing,
  raise a ProgrammingError now.

- Issue #10881: Fix test_site failure with OS X framework builds.

- Issue #964437: Make IDLE help window non-modal.
  Patch by Guilherme Polo and Roger Serwy.

- Issue #13734: Add os.fwalk(), a directory walking function yielding file
  descriptors.

- Issue #2945: Make the distutils upload command aware of bdist_rpm products.

- Issue #13712: pysetup create should not convert package_data to extra_files.

- Issue #11805: package_data in setup.cfg should allow more than one value.

- Issue #13933: IDLE auto-complete did not work with some imported
  module, like hashlib.  (Patch by Roger Serwy)

- Issue #13901: Prevent test_distutils failures on OS X with --enable-shared.

- Issue #13676: Handle strings with embedded zeros correctly in sqlite3.

- Issue #13506: Add '' to path for IDLE Shell when started and restarted with Restart Shell.
  Original patches by Marco Scataglini and Roger Serwy.

- Issue #8828: Add new function os.replace(), for cross-platform renaming
  with overwriting.

- Issue #13848: open() and the FileIO constructor now check for NUL
  characters in the file name.  Patch by Hynek Schlawack.

- Issue #13806: The size check in audioop decompression functions was too
  strict and could reject valid compressed data.  Patch by Oleg Plakhotnyuk.

- Issue #13812: When a multiprocessing Process child raises an exception,
  flush stderr after printing the exception traceback.

- Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC
  IV attack countermeasure.

- Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead
  of ValueError on failure. time.ctime() and time.asctime() now raises an
  OSError if localtime() failed. time.clock() now raises a RuntimeError if the
  processor time used is not available or its value cannot be represented

- Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time
  minor versions not matching.

- Issue #12804: Fix test_socket and test_urllib2net failures when running tests
  on a system without internet access.

- Issue #13772: In os.symlink() under Windows, do not try to guess the link
  target's type (file or directory).  The detection was buggy and made the
  call non-atomic (therefore prone to race conditions).

- Issue #6631: Disallow relative file paths in urllib urlopen methods.

- Issue #13722: Avoid silencing ImportErrors when initializing the codecs
  registry.

- Issue #13781: Fix GzipFile bug that caused an exception to be raised when
  opening for writing using a fileobj returned by os.fdopen().

- Issue #13803: Under Solaris, distutils doesn't include bitness
  in the directory name.

- Issue #10278: Add time.wallclock() function, monotonic clock.

- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
  disabled. Original patch by Amaury Forgeot d'Arc.

- Issue #13589: Fix some serialization primitives in the aifc module.
  Patch by Oleg Plakhotnyuk.

- Issue #13642: Unquote before b64encoding user:password during Basic
  Authentication. Patch contributed by Joonas Kuorilehto.

- Issue #13726: Fix the ambiguous -S flag in regrtest. It is -o/--slow for slow
  tests.

- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
  The hang would occur when retrieving the result of a scheduled future after
  the executor had been shut down.

- Issue #13502: threading: Fix a race condition in Event.wait() that made it
  return False when the event was set and cleared right after.

- Issue #9993: When the source and destination are on different filesystems,
  and the source is a symlink, shutil.move() now recreates a symlink on the
  destination instead of copying the file contents.  Patch by Jonathan Niehof
  and Hynek Schlawack.

- Issue #12926: Fix a bug in tarfile's link extraction.

- Issue #13696: Fix the 302 Relative URL Redirection problem.

- Issue #13636: Weak ciphers are now disabled by default in the ssl module
  (except when SSLv2 is explicitly asked for).

- Issue #12715: Add an optional symlinks argument to shutil functions
  (copyfile, copymode, copystat, copy, copy2).  When that parameter is
  true, symlinks aren't dereferenced and the operation instead acts on the
  symlink itself (or creates one, if relevant).  Patch by Hynek Schlawack.

- Add a flags parameter to select.epoll.

- Issue #13626: Add support for SSL Diffie-Hellman key exchange, through the
  SSLContext.load_dh_params() method and the ssl.OP_SINGLE_DH_USE option.

- Issue #11006: Don't issue low level warning in subprocess when pipe2() fails.

- Issue #13620: Support for Chrome browser in webbrowser.  Patch contributed
  by Arnaud Calmettes.

- Issue #11829: Fix code execution holes in inspect.getattr_static for
  metaclasses with metaclasses. Patch by Andreas Stührk.

- Issue #12708: Add starmap() and starmap_async() methods (similar to
  itertools.starmap()) to multiprocessing.Pool.  Patch by Hynek Schlawack.

- Issue #1785: Fix inspect and pydoc with misbehaving descriptors.

- Issue #13637: "a2b" functions in the binascii module now accept ASCII-only
  unicode strings.

- Issue #13634: Add support for querying and disabling SSL compression.

- Issue #13627: Add support for SSL Elliptic Curve-based Diffie-Hellman
  key exchange, through the SSLContext.set_ecdh_curve() method and the
  ssl.OP_SINGLE_ECDH_USE option.

- Issue #13635: Add ssl.OP_CIPHER_SERVER_PREFERENCE, so that SSL servers
  choose the cipher based on their own preferences, rather than on the
  client's.

- Issue #11813: Fix inspect.getattr_static for modules. Patch by Andreas
  Stührk.

- Issue #7502: Fix equality comparison for DocTestCase instances.  Patch by
  Cédric Krier.

- Issue #11870: threading: Properly reinitialize threads internal locks and
  condition variables to avoid deadlocks in child processes.

- Issue #8035: urllib: Fix a bug where the client could remain stuck after a
  redirection or an error.

- Issue #13560: os.strerror() now uses the current locale encoding instead of
  UTF-8.

- Issue #8373: The filesystem path of AF_UNIX sockets now uses the filesystem
  encoding and the surrogateescape error handler, rather than UTF-8.  Patch
  by David Watson.

- Issue #10350: Read and save errno before calling a function which might
  overwrite it.  Original patch by Hallvard B Furuseth.

- Issue #11610: Introduce a more general way to declare abstract properties.

- Issue #13591: A bug in importlib has been fixed that caused import_module
  to load a module twice.

- Issue #4625: If IDLE cannot write to its recent file or breakpoint files,
  display a message popup and continue rather than crash.  Original patch by
  Roger Serwy.

- Issue #13449 sched.scheduler.run() method has a new "blocking" parameter which
  when set to False makes run() execute the scheduled events due to expire
  soonest (if any) and then return.  Patch by Giampaolo Rodolà.

- Issue #8684 sched.scheduler class can be safely used in multi-threaded
  environments.  Patch by Josiah Carlson and Giampaolo Rodolà.

- Alias resource.error to OSError ala PEP 3151.

- Issue #5689: Add support for lzma compression to the tarfile module.

- Issue #13248: Turn 3.2's PendingDeprecationWarning into 3.3's
  DeprecationWarning.  It covers 'cgi.escape', 'importlib.abc.PyLoader',
  'importlib.abc.PyPycLoader', 'nntplib.NNTP.xgtitle', 'nntplib.NNTP.xpath',
  and private attributes of 'smtpd.SMTPChannel'.

- Issue #5905, #13560: time.strftime() is now using the current locale
  encoding, instead of UTF-8, if the wcsftime() function is not available.

- Issue #8641: Update IDLE 3 syntax coloring to recognize b".." and not u"..".
  Patch by Tal Einat.

- Issue #13464: Add a readinto() method to http.client.HTTPResponse.  Patch
  by Jon Kuhn.

- tarfile.py: Correctly detect bzip2 compressed streams with blocksizes
  other than 900k.

- Issue #13439: Fix many errors in turtle docstrings.

- Issue #6715: Add a module 'lzma' for compression using the LZMA algorithm.
  Thanks to Per Øyvind Karlsen for the initial implementation.

- Issue #13487: Make inspect.getmodule robust against changes done to
  sys.modules while it is iterating over it.

- Issue #12618: Fix a bug that prevented py_compile from creating byte
  compiled files in the current directory.  Initial patch by Sjoerd de Vries.

- Issue #13444: When stdout has been closed explicitly, we should not attempt
  to flush it at shutdown and print an error.

- Issue #12567: The curses module uses Unicode functions for Unicode arguments
  when it is linked to the ncurses library. It encodes also Unicode strings to
  the locale encoding instead of UTF-8.

- Issue #12856: Ensure child processes do not inherit the parent's random
  seed for filename generation in the tempfile module.  Patch by Brian
  Harring.

- Issue #9957: SpooledTemporaryFile.truncate() now accepts an optional size
  parameter, as other file-like objects.  Patch by Ryan Kelly.

- Issue #13458: Fix a memory leak in the ssl module when decoding a
  certificate with a subjectAltName.  Patch by Robert Xiao.

- Issue #13415: os.unsetenv() doesn't ignore errors anymore.

- Issue #13245: sched.scheduler class constructor's timefunc and
  delayfunct parameters are now optional.
  scheduler.enter and scheduler.enterabs methods gained a new kwargs parameter.
  Patch contributed by Chris Clark.

- Issue #12328: Under Windows, refactor handling of Ctrl-C events and
  make _multiprocessing.win32.WaitForMultipleObjects interruptible when
  the wait_flag parameter is false.  Patch by sbt.

- Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
  raised when the wrapped raw file is non-blocking and the write would block.
  Previous code assumed that the raw write() would raise BlockingIOError, but
  RawIOBase.write() is defined to returned None when the call would block.
  Patch by sbt.

- Issue #13358: HTMLParser now calls handle_data only once for each CDATA.

- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
  node when it is the only child of an element.  Initial patch by Dan
  Kenigsberg.

- Issue #13374: The Windows bytes API has been deprecated in the os module. Use
  Unicode filenames instead of bytes filenames to not depend on the ANSI code
  page anymore and to support any filename.

- Issue #13297: Use bytes type to send and receive binary data through XMLRPC.

- Issue #6397: Support "/dev/poll" polling objects in select module,
  under Solaris & derivatives.

- Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly
  handles non-valid attributes, including adjacent and unquoted attributes.

- Issue #13193: Fix distutils.filelist.FileList and packaging.manifest.Manifest
  under Windows.

- Issue #13384: Remove unnecessary __future__ import in Lib/random.py

- Issue #13149: Speed up append-only StringIO objects.

- Issue #13373: multiprocessing.Queue.get() could sometimes block indefinitely
  when called with a timeout.  Patch by Arnaud Ysmal.

- Issue #13254: Fix Maildir initialization so that maildir contents
  are read correctly.

- Issue #3067: locale.setlocale() now raises TypeError if the second
  argument is an invalid iterable. Its documentation and docstring
  were also updated. Initial patch by Jyrki Pulliainen.

- Issue #13140: Fix the daemon_threads attribute of ThreadingMixIn.

- Issue #13339: Fix compile error in posixmodule.c due to missing semicolon.
  Thanks to Robert Xiao.

- Byte compilation in packaging is now isolated from the calling Python -B or
  -O options, instead of being disallowed under -B or buggy under -O.

- Issue #10570: curses.putp() and curses.tparm() are now expecting a byte
  string, instead of a Unicode string.

- Issue #13295: http.server now produces valid HTML 4.01 strict.

- Issue #2892: preserve iterparse events in case of SyntaxError.

- Issue #13287: urllib.request and urllib.error now contains an __all__
  attribute to expose only relevant classes and functions.  Patch by Florent
  Xicluna.

- Issue #670664: Fix HTMLParser to correctly handle the content of
  ``<script>...</script>`` and ``<style>...</style>``.

- Issue #10817: Fix urlretrieve function to raise ContentTooShortError even
  when reporthook is None. Patch by Jyrki Pulliainen.

- Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart.
  (Patch by Roger Serwy)

- Fix the xmlrpc.client user agent to return something similar to
  urllib.request user agent: "Python-xmlrpc/3.3".

- Issue #13293: Better error message when trying to marshal bytes using
  xmlrpc.client.

- Issue #13291: NameError in xmlrpc package.

- Issue #13258: Use callable() built-in in the standard library.

- Issue #13273: fix a bug that prevented HTMLParser to properly detect some
  tags when strict=False.

- Issue #11183: Add finer-grained exceptions to the ssl module, so that
  you don't have to inspect the exception's attributes in the common case.

- Issue #13216: Add cp65001 codec, the Windows UTF-8 (CP_UTF8).

- Issue #13226: Add RTLD_xxx constants to the os module. These constants can be
  used with sys.setdlopenflags().

- Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to
  the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a
  monotonic clock

- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
  before all tasks have completed.

- Issue #13255: wrong docstrings in array module.

- Issue #8540: Remove deprecated Context._clamp attribute in Decimal module.

- Issue #13235: Added DeprecationWarning to logging.warn() method and function.

- Issue #9168: now smtpd is able to bind privileged port.

- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
  semicolons together. Patch by Ben Darnell and Petri Lehtinen.

- Issue #13227: functools.lru_cache() now has a option to distinguish
  calls with different argument types.

- Issue #6090: zipfile raises a ValueError when a document with a timestamp
  earlier than 1980 is provided. Patch contributed by Petri Lehtinen.

- Issue #13150: sysconfig no longer parses the Makefile and config.h files
  when imported, instead doing it at build time.  This makes importing
  sysconfig faster and reduces Python startup time by 20%.

- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib``
  in order to display the prompt correctly.

- Issue #12454: The mailbox module is now using ASCII, instead of the locale
  encoding, to read and write .mh_sequences files.

- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are
  now available on Windows.

- Issue #1673007: urllib.request now supports HEAD request via new method argument.
  Patch contributions by David Stanek, Patrick Westerhoff and Ezio Melotti.

- Issue #12386: packaging does not fail anymore when writing the RESOURCES
  file.

- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number
  fields in tarfile.

- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding,
  instead of the locale encoding.

- Issue #10653: On Windows, use strftime() instead of wcsftime() because
  wcsftime() doesn't format time zone correctly.

- Issue #13150: The tokenize module doesn't compile large regular expressions
  at startup anymore.

- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was
  configured with different prefix and exec-prefix.

- Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in
  PEP 3147-compliant __pycache__ directories.

- Issue #7367: Fix pkgutil.walk_paths to skip directories whose
  contents cannot be read.

- Issue #3163: The struct module gets new format characters 'n' and 'N'
  supporting C integer types ``ssize_t`` and ``size_t``, respectively.

- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale.
  Reported and diagnosed by Thomas Kluyver.

- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation
  if the underlying raw stream is unseekable, even if the seek could be
  satisfied using the internal buffer.  Patch by John O'Connor.

- Issue #7689: Allow pickling of dynamically created classes when their
  metaclass is registered with copyreg.  Patch by Nicolas M. Thiéry and Craig
  Citro.

- Issue #13034: When decoding some SSL certificates, the subjectAltName
  extension could be unreported.

- Issue #9871: Prevent IDLE 3 crash when given byte stings
  with invalid hex escape sequences, like b'\x0'.
  (Original patch by Claudiu Popa.)

- Issue #12306: Expose the runtime version of the zlib C library as a constant,
  ZLIB_RUNTIME_VERSION, in the zlib module. Patch by Torsten Landschoff.

- Issue #12959: Add collections.ChainMap to collections.__all__.

- Issue #8933: distutils' PKG-INFO files and packaging's METADATA files will
  now correctly report Metadata-Version: 1.1 instead of 1.0 if a Classifier or
  Download-URL field is present.

- Issue #12567: Add curses.unget_wch() function. Push a character so the next
  get_wch() will return it.

- Issue #9561: distutils and packaging now writes egg-info files using UTF-8,
  instead of the locale encoding.

- Issue #8286: The distutils command sdist will print a warning message instead
  of crashing when an invalid path is given in the manifest template.

- Issue #12841: tarfile unnecessarily checked the existence of numerical user
  and group ids on extraction. If one of them did not exist the respective id
  of the current user (i.e. root) was used for the file and ownership
  information was lost.

- Issue #12888: Fix a bug in HTMLParser.unescape that prevented it to escape
  more than 128 entities.  Patch by Peter Otten.

- Issue #12878: Expose a __dict__ attribute on io.IOBase and its subclasses.

- Issue #12636: IDLE reads the coding cookie when executing a Python script.

- Issue #12494: On error, call(), check_call(), check_output() and
  getstatusoutput() functions of the subprocess module now kill the process,
  read its status (to avoid zombis) and close pipes.

- Issue #12720: Expose low-level Linux extended file attribute functions in os.

- Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi
  now respect a --skip-build option given to bdist.  The packaging commands
  were fixed too.

- Issue #12847: Fix a crash with negative PUT and LONG_BINPUT arguments in
  the C pickle implementation.

- Issue #11564: Avoid crashes when trying to pickle huge objects or containers
  (more than 2**31 items).  Instead, in most cases, an OverflowError is raised.

- Issue #12287: Fix a stack corruption in ossaudiodev module when the FD is
  greater than FD_SETSIZE.

- Issue #12839: Fix crash in zlib module due to version mismatch.
  Fix by Richard M. Tew.

- Issue #9923: The mailcap module now correctly uses the platform path
  separator for the MAILCAP environment variable on non-POSIX platforms.

- Issue #12835: Follow up to #6560 that unconditionally prevents use of the
  unencrypted sendmsg/recvmsg APIs on SSL wrapped sockets. Patch by David
  Watson.

- Issue #12803: SSLContext.load_cert_chain() now accepts a password argument
  to be used if the private key is encrypted.  Patch by Adam Simpkins.

- Issue #11657: Fix sending file descriptors over 255 over a multiprocessing
  Pipe.

- Issue #12811: tabnanny.check() now promptly closes checked files. Patch by
  Anthony Briggs.

- Issue #6560: The sendmsg/recvmsg API is now exposed by the socket module
  when provided by the underlying platform, supporting processing of
  ancillary data in pure Python code. Patch by David Watson and Heiko Wundram.

- Issue #12326: On Linux, sys.platform doesn't contain the major version
  anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending
  on the Linux version used to build Python.

- Issue #12213: Fix a buffering bug with interleaved reads and writes that
  could appear on BufferedRandom streams.

- Issue #12778: Reduce memory consumption when JSON-encoding a large
  container of many small objects.

- Issue #12650: Fix a race condition where a subprocess.Popen could leak
  resources (FD/zombie) when killed at the wrong time.

- Issue #12744: Fix inefficient representation of integers between 2**31 and
  2**63 on systems with a 64-bit C "long".

- Issue #12646: Add an 'eof' attribute to zlib.Decompress, to make it easier to
  detect truncated input streams.

- Issue #11513: Fix exception handling ``tarfile.TarFile.gzopen()`` when
  the file cannot be opened.

- Issue #12687: Fix a possible buffering bug when unpickling text mode
  (protocol 0, mostly) pickles.

- Issue #10087: Fix the html output format of the calendar module.

- Issue #12540: Prevent zombie IDLE processes on Windows due to changes
  in os.kill().

- Issue #13121: add support for inplace math operators to collections.Counter.

- Add support for unary plus and unary minus to collections.Counter.

- Issue #12683: urlparse updated to include svn as schemes that uses relative
  paths. (svn from 1.5 onwards support relative path).

- Issue #12655: Expose functions from sched.h in the os module: sched_yield(),
  sched_setscheduler(), sched_getscheduler(), sched_setparam(),
  sched_get_min_priority(), sched_get_max_priority(), sched_rr_get_interval(),
  sched_getaffinity(), sched_setaffinity().

- Add ThreadError to threading.__all__.

- Issues #11104, #8688: Fix the behavior of distutils' sdist command with
  manually-maintained MANIFEST files.

- Issue #11281: smtplib.STMP gets source_address parameter, which adds the
  ability to bind to specific source address on a machine with multiple
  interfaces. Patch by Paulo Scardine.

- Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow
  symlinks: fix it. Patch by Petri Lehtinen.

- Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod')
  in Python code) now finds the doc of the method.

- Issue #10968: Remove indirection in threading.  The public names (Event,
  Condition, etc.) used to be factory functions returning instances of hidden
  classes (_Event, _Condition, etc.), because (if Guido recalls correctly) this
  code pre-dates the ability to subclass extension types.  It is now possible
  to inherit from these classes without having to import the private
  underscored names like multiprocessing did.

- Issue #9723: Add shlex.quote functions, to escape filenames and command
  lines.

- Issue #12603: Fix pydoc.synopsis() on files with non-negative st_mtime.

- Issue #12514: Use try/finally to assure the timeit module restores garbage
  collections when it is done.

- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
  given as a low fd, it gets overwritten.

- Issue #12590: IDLE editor window now always displays the first line
  when opening a long file.  With Tk 8.5, the first line was hidden.

- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscates)
  Connection:close header.

- Issue #12102: Document that buffered files must be flushed before being used
  with mmap. Patch by Steffen Daode Nurpmeso.

- Issue #12560: Build libpython.so on OpenBSD. Patch by Stefan Sperling.

- Issue #1813: Fix codec lookup under Turkish locales.

- Issue #12591: Improve support of "universal newlines" in the subprocess
  module: the piped streams can now be properly read from or written to.

- Issue #12591: Allow io.TextIOWrapper to work with raw IO objects (without
  a read1() method), and add a *write_through* parameter to mandate
  unbuffered writes.

- Issue #10883: Fix socket leaks in urllib.request when using FTP.

- Issue #12592: Make Python build on OpenBSD 5 (and future major releases).

- Issue #12372: POSIX semaphores are broken on AIX: don't use them.

- Issue #12551: Provide a get_channel_binding() method on SSL sockets so as
  to get channel binding data for the current SSL session (only the
  "tls-unique" channel binding is implemented).  This allows the implementation
  of certain authentication mechanisms such as SCRAM-SHA-1-PLUS.  Patch by
  Jacek Konieczny.

- Issue #665194: email.utils now has format_datetime and parsedate_to_datetime
  functions, allowing for round tripping of RFC2822 format dates.

- Issue #12571: Add a plat-linux3 directory mirroring the plat-linux2
  directory, so that "import DLFCN" and other similar imports work on
  Linux 3.0.

- Issue #7484: smtplib no longer puts <> around addresses in VRFY and EXPN
  commands; they aren't required and in fact postfix doesn't support that form.

- Issue #12273: Remove ast.__version__. AST changes can be accounted for by
  checking sys.version_info or sys._mercurial.

- Silence spurious "broken pipe" tracebacks when shutting down a
  ProcessPoolExecutor.

- Fix potential resource leaks in concurrent.futures.ProcessPoolExecutor
  by joining all queues and processes when shutdown() is called.

- Issue #11603: Fix a crash when __str__ is rebound as __repr__.  Patch by
  Andreas Stührk.

- Issue #11321: Fix a crash with multiple imports of the _pickle module when
  embedding Python.  Patch by Andreas Stührk.

- Issue #6755: Add get_wch() method to curses.window class. Patch by Iñigo
  Serna.

- Add cgi.closelog() function to close the log file.

- Issue #12502: asyncore: fix polling loop with AF_UNIX sockets.

- Issue #4376: ctypes now supports nested structures in a endian different than
  the parent structure. Patch by Vlad Riscutia.

- Raise ValueError when attempting to set the _CHUNK_SIZE attribute of a
  TextIOWrapper to a huge value, not TypeError.

- Issue #12504: Close file handles in a timely manner in packaging.database.
  This fixes a bug with the remove (uninstall) feature on Windows.

- Issues #12169 and #10510: Factor out code used by various packaging commands
  to make HTTP POST requests, and make sure it uses CRLF.

- Issue #12016: Multibyte CJK decoders now resynchronize faster. They only
  ignore the first byte of an invalid byte sequence. For example,
  b'\xff\n'.decode('gb2312', 'replace') gives '\ufffd\n' instead of '\ufffd'.

- Issue #12459: time.sleep() now raises a ValueError if the sleep length is
  negative, instead of an infinite sleep on Windows or raising an IOError on
  Linux for example, to have the same behaviour on all platforms.

- Issue #12451: pydoc: html_getfile() now uses tokenize.open() to support
  Python scripts using a encoding different than UTF-8 (read the coding cookie
  of the script).

- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
  if the process has only one pipe.

- Issue #12467: warnings: fix a race condition if a warning is emitted at
  shutdown, if globals()['__file__'] is None.

- Issue #12451: pydoc: importfile() now opens the Python script in binary mode,
  instead of text mode using the locale encoding, to avoid encoding issues.

- Issue #12451: runpy: run_path() now opens the Python script in binary mode,
  instead of text mode using the locale encoding, to support other encodings
  than UTF-8 (scripts using the coding cookie).

- Issue #12451: xml.dom.pulldom: parse() now opens files in binary mode instead
  of the text mode (using the locale encoding) to avoid encoding issues.

- Issue #12147: Adjust the new-in-3.2 smtplib.send_message method for better
  conformance to the RFCs:  correctly handle Sender and Resent- headers.

- Issue #12352: Fix a deadlock in multiprocessing.Heap when a block is freed by
  the garbage collector while the Heap lock is held.

- Issue #12462: time.sleep() now immediately calls the (Python) signal handler
  if it is interrupted by a signal, instead of having to wait until the next
  instruction.

- Issue #12442: new shutil.disk_usage function, providing total, used and free
  disk space statistics.

- Issue #12451: The XInclude default loader of xml.etree now decodes files from
  UTF-8 instead of the locale encoding if the encoding is not specified. It now
  also opens XML files for the parser in binary mode instead of the text mode
  to avoid encoding issues.

- Issue #12451: doctest.debug_script() doesn't create a temporary file
  anymore to avoid encoding issues.

- Issue #12451: pydoc.synopsis() now reads the encoding cookie if available,
  to read the Python script from the right encoding.

- Issue #12451: distutils now opens the setup script in binary mode to read the
  encoding cookie, instead of opening it in UTF-8.

- Issue #9516: On Mac OS X, change Distutils to no longer globally attempt to
  check or set the MACOSX_DEPLOYMENT_TARGET environment variable for the
  interpreter process.  This could cause failures in non-Distutils subprocesses
  and was unreliable since tests or user programs could modify the interpreter
  environment after Distutils set it.  Instead, have Distutils set the
  deployment target only in the environment of each build subprocess.  It is
  still possible to globally override the default by setting
  MACOSX_DEPLOYMENT_TARGET before launching the interpreter; its value must be
  greater or equal to the default value, the value with which the interpreter
  was built.  Also, implement the same handling in packaging.

- Issue #12422: In the copy module, don't store objects that are their own copy
  in the memo dict.

- Issue #12303: Add sigwaitinfo() and sigtimedwait() to the signal module.

- Issue #12404: Remove C89 incompatible code from mmap module. Patch by Akira
  Kitada.

- Issue #1874: email now detects and reports as a defect the presence of
  any CTE other than 7bit, 8bit, or binary on a multipart.

- Issue #12383: Fix subprocess module with env={}: don't copy the environment
  variables, start with an empty environment.

- Issue #11637: Fix support for importing packaging setup hooks from the
  project directory.

- Issue #6771: Moved the curses.wrapper function from the single-function
  wrapper module into __init__, eliminating the module.  Since __init__ was
  already importing the function to curses.wrapper, there is no API change.

- Issue #11584: email.header.decode_header no longer fails if the header
  passed to it is a Header object, and Header/make_header no longer fail
  if given binary unknown-8bit input.

- Issue #11700: mailbox proxy object close methods can now be called multiple
  times without error.

- Issue #11767: Correct file descriptor leak in mailbox's __getitem__ method.

- Issue #12133: AbstractHTTPHandler.do_open() of urllib.request closes the HTTP
  connection if its getresponse() method fails with a socket error. Patch
  written by Ezio Melotti.

- Issue #12240: Allow multiple setup hooks in packaging's setup.cfg files.
  Original patch by Erik Bray.

- Issue #9284: Allow inspect.findsource() to find the source of doctest
  functions.

- Issue #11595: Fix assorted bugs in packaging.util.cfg_to_args, a
  compatibility helper for the distutils-packaging transition.  Original patch
  by Erik Bray.

- Issue #12287: In ossaudiodev, check that the device isn't closed in several
  methods.

- Issue #12009: Fixed regression in netrc file comment handling.

- Issue #12246: Warn and fail when trying to install a third-party project from
  an uninstalled Python (built in a source checkout).  Original patch by
  Tshepang Lekhonkhobe.

- Issue #10694: zipfile now ignores garbage at the end of a zipfile.

- Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA.

- Issue #10424: Argparse now includes the names of the missing required
  arguments in the missing arguments error message.

- Issue #12168: SysLogHandler now allows NUL termination to be controlled using
  a new 'append_nul' attribute on the handler.

- Issue #11583: Speed up os.path.isdir on Windows by using GetFileAttributes
  instead of os.stat.

- Issue #12021: Make mmap's read() method argument optional. Patch by Petri
  Lehtinen.

- Issue #9205: concurrent.futures.ProcessPoolExecutor now detects killed
  children and raises BrokenProcessPool in such a situation.  Previously it
  would reliably freeze/deadlock.

- Issue #12040: Expose a new attribute ``sentinel`` on instances of
  ``multiprocessing.Process``.  Also, fix Process.join() to not use polling
  anymore, when given a timeout.

- Issue #11893: Remove obsolete internal wrapper class ``SSLFakeFile`` in the
  smtplib module.  Patch by Catalin Iacob.

- Issue #12080: Fix a Decimal.power() case that took an unreasonably long time
  to compute.

- Issue #12221: Remove __version__ attributes from pyexpat, pickle, tarfile,
  pydoc, tkinter, and xml.parsers.expat. This were useless version constants
  left over from the Mercurial transition

- Named tuples now work correctly with vars().

- Issue #12085: Fix an attribute error in subprocess.Popen destructor if the
  constructor has failed, e.g. because of an undeclared keyword argument. Patch
  written by Oleg Oshmyan.

- Issue #12028: Make threading._get_ident() public, rename it to
  threading.get_ident() and document it. This function was already used using
  _thread.get_ident().

- Issue #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
  encreset() instead of decreset().

- Issue #12218: Removed wsgiref.egg-info.

- Issue #12196: Add pipe2() to the os module.

- Issue #985064: Make plistlib more resilient to faulty input plists.
  Patch by Mher Movsisyan.

- Issue #1625: BZ2File and bz2.decompress() now support multi-stream files.
  Initial patch by Nir Aides.

- Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available.

- Issue #12175: FileIO.readall() now only reads the file position and size
  once.

- Issue #12175: RawIOBase.readall() now returns None if read() returns None.

- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
  if the file is closed.

- Issue #11109: New service_action method for BaseServer, used by ForkingMixIn
  class for cleanup. Initial Patch by Justin Warkentin.

- Issue #12045: Avoid duplicate execution of command in
  ctypes.util._get_soname().  Patch by Sijin Joseph.

- Issue #10818: Remove the Tk GUI and the serve() function of the pydoc module,
  pydoc -g has been deprecated in Python 3.2 and it has a new enhanced web
  server.

- Issue #1441530: In imaplib, read the data in one chunk to speed up large
  reads and simplify code.

- Issue #12070: Fix the Makefile parser of the sysconfig module to handle
  correctly references to "bogus variable" (e.g. "prefix=$/opt/python").

- Issue #12100: Don't reset incremental encoders of CJK codecs at each call to
  their encode() method anymore, but continue to call the reset() method if the
  final argument is True.

- Issue #12049: Add RAND_bytes() and RAND_pseudo_bytes() functions to the ssl
  module.

- Issue #6501: os.device_encoding() returns None on Windows if the application
  has no console.

- Issue #12105: Add O_CLOEXEC to the os module.

- Issue #12079: Decimal('Infinity').fma(Decimal('0'), (3.91224318126786e+19+0j))
  now raises TypeError (reflecting the invalid type of the 3rd argument) rather
  than Decimal.InvalidOperation.

- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
  to be able to unload the module.

- Add the packaging module, an improved fork of distutils (also known as
  distutils2).

- Issue #12065: connect_ex() on an SSL socket now returns the original errno
  when the socket's timeout expires (it used to return None).

- Issue #8809: The SMTP_SSL constructor and SMTP.starttls() now support
  passing a ``context`` argument pointing to an ssl.SSLContext instance.
  Patch by Kasun Herath.

- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX
  with Tk 8.5.

- Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET
  is set in shell.

- Issue #8650: Make zlib module 64-bit clean. compress(), decompress() and
  their incremental counterparts now raise OverflowError if given an input
  larger than 4GB, instead of silently truncating the input and returning
  an incorrect result.

- Issue #12050: zlib.decompressobj().decompress() now clears the unconsumed_tail
  attribute when called without a max_length argument.

- Issue #12062: Fix a flushing bug when doing a certain type of I/O sequence
  on a file opened in read+write mode (namely: reading, seeking a bit forward,
  writing, then seeking before the previous write but still within buffered
  data, and writing again).

- Issue #9971: Write an optimized implementation of BufferedReader.readinto().
  Patch by John O'Connor.

- Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
  With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused
  IDLE to exit.  Converted to valid Unicode null in PythonCmd().

- Issue #11799: urllib.request Authentication Handlers will raise a ValueError
  when presented with an unsupported Authentication Scheme. Patch contributed
  by Yuval Greenfield.

- Issue #10419, #6011: build_scripts command of distutils handles correctly
  non-ASCII path (path to the Python executable). Open and write the script in
  binary mode, but ensure that the shebang is decodable from UTF-8 and from the
  encoding of the script.

- Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
  order to accept exactly one connection.  Patch by Daniel Evers.

- Issue #12011: signal.signal() and signal.siginterrupt() raise an OSError,
  instead of a RuntimeError: OSError has an errno attribute.

- Issue #3709: add a flush_headers method to BaseHTTPRequestHandler, which
  manages the sending of headers to output stream and flushing the internal
  headers buffer. Patch contribution by Andrew Schaaf

- Issue #11743: Rewrite multiprocessing connection classes in pure Python.

- Issue #11164: Stop trying to use _xmlplus in the xml module.

- Issue #11888: Add log2 function to math module. Patch written by Mark
  Dickinson.

- Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional.

- Issue #8407: The signal handler writes the signal number as a single byte
  instead of a nul byte into the wakeup file descriptor. So it is possible to
  wait more than one signal and know which signals were raised.

- Issue #8407: Add pthread_kill(), sigpending() and sigwait() functions to the
  signal module.

- Issue #11927: SMTP_SSL now uses port 465 by default as documented.  Patch
  by Kasun Herath.

- Issue #12002: ftplib's abort() method raises TypeError.

- Issue #11916: Add a number of MacOSX specific definitions to the errno module.
  Patch by Pierre Carrier.

- Issue #11999: fixed sporadic sync failure mailbox.Maildir due to its trying to
  detect mtime changes by comparing to the system clock instead of to the
  previous value of the mtime.

- Issue #11072: added MLSD command (RFC-3659) support to ftplib.

- Issue #8808: The IMAP4_SSL constructor now allows passing an SSLContext
  parameter to control parameters of the secure channel.  Patch by Sijin
  Joseph.

- ntpath.samefile failed to notice that "a.txt" and "A.TXT" refer to the same
  file on Windows XP. As noticed in issue #10684.

- Issue #12000: When a SSL certificate has a subjectAltName without any
  dNSName entry, ssl.match_hostname() should use the subject's commonName.
  Patch by Nicolas Bareil.

- Issue #10775: assertRaises, assertRaisesRegex, assertWarns, and
  assertWarnsRegex now accept a keyword argument 'msg' when used as context
  managers.  Initial patch by Winston Ewert.

- Issue #10684: shutil.move used to delete a folder on case insensitive
  filesystems when the source and destination name where the same except
  for the case.

- Issue #11647: objects created using contextlib.contextmanager now support
  more than one call to the function when used as a decorator. Initial patch
  by Ysj Ray.

- Issue #11930: Removed deprecated time.accept2dyear variable.
  Removed year >= 1000 restriction from datetime.strftime.

- logging: don't define QueueListener if Python has no thread support.

- functools.cmp_to_key() now works with collections.Hashable().

- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get
  around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.

- Issue #8407: Add signal.pthread_sigmask() function to fetch and/or change the
  signal mask of the calling thread.

- Issue #11858: configparser.ExtendedInterpolation expected lower-case section
  names.

- Issue #11324: ConfigParser(interpolation=None) now works correctly.

- Issue #11811: ssl.get_server_certificate() is now IPv6-compatible.  Patch
  by Charles-François Natali.

- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
  strings are too long.

- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.

- Issue #11856: Speed up parsing of JSON numbers.

- Issue #11005: threading.RLock()._release_save() raises a RuntimeError if the
  lock was not acquired.

- Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor
  of 5 to 10.  Initial patch by Jonas H.

- Issue #11382: Trivial system calls, such as dup() or pipe(), needn't
  release the GIL.  Patch by Charles-François Natali.

- Issue #11223: Add threading._info() function providing informations about
  the thread implementation.

- Issue #11731: simplify/enhance email parser/generator API by introducing
  policy objects.

- Issue #11768: The signal handler of the signal module only calls
  Py_AddPendingCall() for the first signal to fix a deadlock on reentrant or
  parallel calls. PyErr_SetInterrupt() writes also into the wake up file.

- Issue #11492: fix several issues with header folding in the email package.

- Issue #11852: Add missing imports and update tests.

- Issue #11875: collections.OrderedDict's __reduce__ was temporarily
  mutating the object instead of just working on a copy.

- Issue #11467: Fix urlparse behavior when handling urls which contains scheme
  specific part only digits. Patch by Santoso Wijaya.

- collections.Counter().copy() now works correctly for subclasses.

- Issue #11474: Fix the bug with url2pathname() handling of '/C|/' on Windows.
  Patch by Santoso Wijaya.

- Issue #11684: complete email.parser bytes API by adding BytesHeaderParser.

- The bz2 module now handles 4GiB+ input buffers correctly.

- Issue #9233: Fix json.loads('{}') to return a dict (instead of a list), when
  _json is not available.

- Issue #11830: Remove unnecessary introspection code in the decimal module.

- Issue #11703: urllib2.geturl() does not return correct url when the original
  url contains #fragment.

- Issue #10019: Fixed regression in json module where an indent of 0 stopped
  adding newlines and acted instead like 'None'.

- Issue #11186: pydoc ignores a module if its name contains a surrogate
  character in the index of modules.

- Issue #11815: Use a light-weight SimpleQueue for the result queue in
  concurrent.futures.ProcessPoolExecutor.

- Issue #5162: Treat services like frozen executables to allow child spawning
  from multiprocessing.forking on Windows.

- logging.basicConfig now supports an optional 'handlers' argument taking an
  iterable of handlers to be added to the root logger. Additional parameter
  checks were also added to basicConfig.

- Issue #11814: Fix likely typo in multiprocessing.Pool._terminate().

- Issue #11747: Fix range formatting in difflib.context_diff() and
  difflib.unified_diff().

- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
  worker processes: new processes would be spawned while the pool is being
  shut down.  Patch by Charles-François Natali.

- Issue #2650: re.escape() no longer escapes the '_'.

- Issue #11757: select.select() now raises ValueError when a negative timeout
  is passed (previously, a select.error with EINVAL would be raised).  Patch
  by Charles-François Natali.

- Issue #7311: fix html.parser to accept non-ASCII attribute values.

- Issue #11605: email.parser.BytesFeedParser was incorrectly converting
  multipart subparts with an 8-bit CTE into unicode instead of preserving the
  bytes.

- Issue #1690608: email.util.formataddr is now RFC 2047 aware:  it now has a
  charset parameter that defaults to utf-8 and is used as the charset for RFC
  2047 encoding when the realname contains non-ASCII characters.

- Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.

- Issue #10791: Implement missing method GzipFile.read1(), allowing GzipFile
  to be wrapped in a TextIOWrapper.  Patch by Nadeem Vawda.

- Issue #11707: Added a fast C version of functools.cmp_to_key().
  Patch by Filip Gruszczyński.

- Issue #11688: Add sqlite3.Connection.set_trace_callback().  Patch by
  Torsten Landschoff.

- Issue #11746: Fix SSLContext.load_cert_chain() to accept elliptic curve
  private keys.

- Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
  file-like objects using a new ``fileobj`` constructor argument.  Patch by
  Nadeem Vawda.

- unittest.TestCase.assertSameElements has been removed.

- sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not
  called yet: detect bootstrap (startup) issues earlier.

- Issue #11393: Add the new faulthandler module.

- Issue #11618: Fix the timeout logic in threading.Lock.acquire() under Windows.

- Removed the 'strict' argument to email.parser.Parser, which has been
  deprecated since Python 2.4.

- Issue #11256: Fix inspect.getcallargs on functions that take only keyword
  arguments.

- Issue #11696: Fix ID generation in msilib.

- itertools.accumulate now supports an optional *func* argument for
  a user-supplied binary function.

- Issue #11692: Remove unnecessary demo functions in subprocess module.

- Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when
  trying to pack a negative (in-range) integer.

- Issue #11675: multiprocessing.[Raw]Array objects created from an integer size
  are now zeroed on creation.  This matches the behaviour specified by the
  documentation.

- Issue #7639: Fix short file name generation in bdist_msi

- Issue #11659: Fix ResourceWarning in test_subprocess introduced by #11459.
  Patch by Ben Hayden.

- Issue #11635: Don't use polling in worker threads and processes launched by
  concurrent.futures.

- Issue #6811: Allow importlib to change a code object's co_filename attribute
  to match the path to where the source code currently is, not where the code
  object originally came from.

- Issue #8754: Have importlib use the repr of a module name in error messages.

- Issue #11591: Prevent "import site" from modifying sys.path when python
  was started with -S.

- collections.namedtuple() now adds a _source attribute to the generated
  class.  This make the source more accessible than the outdated
  "verbose" option which prints to stdout but doesn't make the source
  string available.

- Issue #11371: Mark getopt error messages as localizable.  Patch by Filip
  Gruszczyński.

- Issue #11333: Add __slots__ to collections ABCs.

- Issue #11628: cmp_to_key generated class should use __slots__.

- Issue #11666: let help() display named tuple attributes and methods
  that start with a leading underscore.

- Issue #11662: Make urllib and urllib2 ignore redirections if the
  scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).

- Issue #5537: Fix time2isoz() and time2netscape() functions of
  httplib.cookiejar for expiration year greater than 2038 on 32-bit systems.

- Issue #4391: Use proper gettext plural forms in optparse.

- Issue #11127: Raise a TypeError when trying to pickle a socket object.

- Issue #11563: Connection:close header is sent by requests using URLOpener
  class which helps in closing of sockets after connection is over. Patch
  contributions by Jeff McNeil and Nadeem Vawda.

- Issue #11459: A ``bufsize`` value of 0 in subprocess.Popen() really creates
  unbuffered pipes, such that select() works properly on them.

- Issue #5421: Fix misleading error message when one of socket.sendto()'s
  arguments has the wrong type.  Patch by Nikita Vetoshkin.

- Issue #10812: Add some extra posix functions to the os module.

- Issue #10979: unittest stdout buffering now works with class and module
  setup and teardown.

- Issue #11577: fix ResourceWarning triggered by improved binhex test coverage

- Issue #11243: fix the parameter querying methods of Message to work if
  the headers contain un-encoded non-ASCII data.

- Issue #11401: fix handling of headers with no value; this fixes a regression
  relative to Python2 and the result is now the same as it was in Python2.

- Issue #9298: base64 bodies weren't being folded to line lengths less than 78,
  which was a regression relative to Python2.  Unlike Python2, the last line
  of the folded body now ends with a carriage return.

- Issue #11560: shutil.unpack_archive now correctly handles the format
  parameter. Patch by Evan Dandrea.

- Issue #5870: Add `subprocess.DEVNULL` constant.

- Issue #11133: fix two cases where inspect.getattr_static can trigger code
  execution. Patch by Andreas Stührk.

- Issue #11569: use absolute path to the sysctl command in multiprocessing to
  ensure that it will be found regardless of the shell PATH. This ensures
  that multiprocessing.cpu_count works on default installs of MacOSX.

- Issue #11501: disutils.archive_utils.make_zipfile no longer fails if zlib is
  not installed. Instead, the zipfile.ZIP_STORED compression is used to create
  the ZipFile. Patch by Natalia B. Bidart.

- Issue #11289: `smtp.SMTP` class is now a context manager so it can be used
  in a `with` statement.  Contributed by Giampaolo Rodola.

- Issue #11554: Fixed support for Japanese codecs; previously the body output
  encoding was not done if euc-jp or shift-jis was specified as the charset.

- Issue #11509: Significantly increase test coverage of fileinput.
  Patch by Denver Coneybeare at PyCon 2011 Sprints.

- Issue #11407: `TestCase.run` returns the result object used or created.
  Contributed by Janathan Hartley.

- Issue #11500: Fixed a bug in the OS X proxy bypass code for fully qualified
  IP addresses in the proxy exception list.

- Issue #11491: dbm.error is no longer raised when dbm.open is called with
  the "n" as the flag argument and the file exists. The behavior matches
  the documentation and general logic.

- Issue #1162477: Postel Principle adjustment to email date parsing: handle the
  fact that some non-compliant MUAs use '.' instead of ':' in time specs.

- Issue #11131: Fix sign of zero in decimal.Decimal plus and minus
  operations when the rounding mode is ROUND_FLOOR.

- Issue #9935: Speed up pickling of instances of user-defined classes.

- Issue #5622: Fix curses.wrapper to raise correct exception if curses
  initialization fails.

- Issue #11408: In threading.Lock.acquire(), only call gettimeofday() when
  really necessary.  Patch by Charles-François Natali.

- Issue #11391: Writing to a mmap object created with
  ``mmap.PROT_READ|mmap.PROT_EXEC`` would segfault instead of raising a
  TypeError.  Patch by Charles-François Natali.

- Issue #9795: add context manager protocol support for nntplib.NNTP class.

- Issue #11306: mailbox in certain cases adapts to an inability to open
  certain files in read-write mode.  Previously it detected this by
  checking for EACCES, now it also checks for EROFS.

- Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors
  on accept(), send() and recv().

- Issue #11377: Deprecate platform.popen() and reimplement it with os.popen().

- Issue #8513: On UNIX, subprocess supports bytes command string.

- Issue #10866: Add socket.sethostname().  Initial patch by Ross Lagerwall.

- Issue #11140: Lock.release() now raises a RuntimeError when attempting
  to release an unacquired lock, as claimed in the threading documentation.
  The _thread.error exception is now an alias of RuntimeError.  Patch by
  Filip Gruszczyński.  Patch for _dummy_thread by Aymeric Augustin.

- Issue #8594: ftplib now provides a source_address parameter to specify which
  (address, port) to bind to before connecting.

- Issue #11326: Add the missing connect_ex() implementation for SSL sockets,
  and make it work for non-blocking connects.

- Issue #11297: Add collections.ChainMap().

- Issue #10755: Add the posix.flistdir() function.  Patch by Ross Lagerwall.

- Issue #4761: Add the ``*at()`` family of functions (openat(), etc.) to the
  posix module.  Patch by Ross Lagerwall.

- Issue #7322: Trying to read from a socket's file-like object after a timeout
  occurred now raises an error instead of silently losing data.

- Issue #11291: poplib.POP no longer suppresses errors on quit().

- Issue #11177: asyncore's create_socket() arguments can now be omitted.

- Issue #6064: Add a ``daemon`` keyword argument to the threading.Thread
  and multiprocessing.Process constructors in order to override the
  default behaviour of inheriting the daemonic property from the current
  thread/process.

- Issue #10956: Buffered I/O classes retry reading or writing after a signal
  has arrived and the handler returned successfully.

- Issue #10784: New os.getpriority() and os.setpriority() functions.

- Issue #11114: Fix catastrophic performance of tell() on text files (up
  to 1000x faster in some cases).  It is still one to two order of magnitudes
  slower than binary tell().

- Issue #10882: Add os.sendfile function.

- Issue #10868: Allow usage of the register method of an ABC as a class
  decorator.

- Issue #11224: Fixed a regression in tarfile that affected the file-like
  objects returned by TarFile.extractfile() regarding performance, memory
  consumption and failures with the stream interface.

- Issue #10924: Adding salt and Modular Crypt Format to crypt library.
  Moved old C wrapper to _crypt, and added a Python wrapper with
  enhanced salt generation and simpler API for password generation.

- Issue #11074: Make 'tokenize' so it can be reloaded.

- Issue #11085: Moved collections abstract base classes into a separate
  module called collections.abc, following the pattern used by importlib.abc.
  For backwards compatibility, the names are imported into the collections
  module.

- Issue #4681: Allow mmap() to work on file sizes and offsets larger than
  4GB, even on 32-bit builds.  Initial patch by Ross Lagerwall, adapted for
  32-bit Windows.

- Issue #11169: compileall module uses repr() to format filenames and paths to
  escape surrogate characters and show spaces.

- Issue #11089: Fix performance issue limiting the use of ConfigParser()
  with large config files.

- Issue #10276: Fix the results of zlib.crc32() and zlib.adler32() on buffers
  larger than 4GB.  Patch by Nadeem Vawda.

- Issue #11388: Added a clear() method to MutableSequence

- Issue #11174: Add argparse.MetavarTypeHelpFormatter, which uses type names
  for the names of optional and positional arguments in help messages.

- Issue #9348: Raise an early error if argparse nargs and metavar don't match.

- Issue #8982: Improve the documentation for the argparse Namespace object.

- Issue #9343: Document that argparse parent parsers must be configured before
  their children.

- Issue #9026: Fix order of argparse sub-commands in help messages.

- Issue #9347: Fix formatting for tuples in argparse type= error messages.

- Issue #12191: Added shutil.chown() to change user and/or group owner of a
  given path also specifying their names.

- Issue #13988: The _elementtree accelerator is used whenever available.
  Now xml.etree.cElementTree becomes a deprecated alias to ElementTree.

Build
-----

- Issue #6807: Run msisupport.mak earlier.

- Issue #10580: Minor grammar change in Windows installer.

- Issue #13326: Clean __pycache__ directories correctly on OpenBSD.

- PEP 393: the configure option --with-wide-unicode is removed.

- Issue #12852: Set _XOPEN_SOURCE to 700, instead of 600, to get POSIX 2008
  functions on OpenBSD (e.g. fdopendir).

- Issue #11863: Remove support for legacy systems deprecated in Python 3.2
  (following PEP 11).  These systems are systems using Mach C Threads,
  SunOS lightweight processes, GNU pth threads and IRIX threads.

- Issue #8746: Correct faulty configure checks so that os.chflags() and
  os.lchflags() are once again built on systems that support these
  functions (BSD and OS X).  Also add new stat file flags for OS X
  (UF_HIDDEN and UF_COMPRESSED).

- Issue #10645: Installing Python no longer creates a
  Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory.

- Do not accidentally include the directory containing sqlite.h twice when
  building sqlite3.

- Issue #11217: For 64-bit/32-bit Mac OS X universal framework builds,
  ensure "make install" creates symlinks in --prefix bin for the "-32"
  files in the framework bin directory like the installer does.

- Issue #11347: Use --no-as-needed when linking libpython3.so.

- Issue #11411: Fix 'make DESTDIR=' with a relative destination.

- Issue #11268: Prevent Mac OS X Installer failure if Documentation
  package had previously been installed.

- Issue #11495: OSF support is eliminated. It was deprecated in Python 3.2.


IDLE
----

- Issue #11718: IDLE's open module dialog couldn't find the __init__.py
  file in a package.

Tools/Demos
-----------

- Issue #14053: patchcheck.py ("make patchcheck") now works with MQ patches.
  Patch by Francisco Martín Brugué.

- Issue #13930: 2to3 is now able to write its converted output files to another
  directory tree as well as copying unchanged files and altering the file
  suffix.  See its new -o, -W and --add-suffix options.  This makes it more
  useful in many automated code translation workflows.

- Issue #13628: python-gdb.py is now able to retrieve more frames in the Python
  traceback if Python is optimized.

- Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and
  add a smarter "py-bt" command printing a classic Python traceback.

- Issue #11179: Make ccbench work under Python 3.1 and 2.7 again.

- Issue #10639: reindent.py no longer converts newlines and will raise
  an error if attempting to convert a file with mixed newlines.
  "--newline" option added to specify new line character.

Extension Modules
-----------------

- Issue #13840: The error message produced by ctypes.create_string_buffer
  when given a Unicode string has been fixed.

- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
  Vilmos Nebehaj.

- Issue #7777: socket: Add Reliable Datagram Sockets (PF_RDS) support.

- Issue #13159: FileIO and BZ2Compressor/BZ2Decompressor now use a linear-time
  buffer growth strategy instead of a quadratic-time one.

- Issue #10141: socket: Add SocketCAN (PF_CAN) support. Initial patch by
  Matthias Fuchs, updated by Tiago Gonçalves.

- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
  would be finalized after the reference to its underlying BufferedRWPair's
  writer got cleared by the GC.

- Issue #12881: ctypes: Fix segfault with large structure field names.

- Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by
  Thomas Jarosch.

- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
  Thanks to Suman Saha for finding the bug and providing a patch.

- Issue #13022: Fix: _multiprocessing.recvfd() doesn't check that
  file descriptor was actually received.

- Issue #1172711: Add 'long long' support to the array module.
  Initial patch by Oren Tirosh and Hirokazu Yamamoto.

- Issue #12483: ctypes: Fix a crash when the destruction of a callback
  object triggers the garbage collector.

- Issue #12950: Fix passing file descriptors in multiprocessing, under
  OpenIndiana/Illumos.

- Issue #12764: Fix a crash in ctypes when the name of a Structure field is not
  a string.

- Issue #11241: subclasses of ctypes.Array can now be subclassed.

- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
  some functions like file.write().

- Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
  signature.  Without this, architectures where sizeof void* != sizeof int are
  broken.  Patch given by Hallvard B Furuseth.

- Issue #12051: Fix segfault in json.dumps() while encoding highly-nested
  objects using the C accelerations.

- Issue #12017: Fix segfault in json.loads() while decoding highly-nested
  objects using the C accelerations.

- Issue #1838: Prevent segfault in ctypes, when _as_parameter_ on a class is set
  to an instance of the class.

Tests
-----

- Issue #11689: Fix a variable scoping error in an sqlite3 test

- Issue #13786: Remove unimplemented 'trace' long option from regrtest.py.

- Issue #13725: Fix regrtest to recognize the documented -d flag.
  Patch by Erno Tukia.

- Issue #13304: Skip test case if user site-packages disabled (-s or
  PYTHONNOUSERSITE).  (Patch by Carl Meyer)

- Issue #5661: Add a test for ECONNRESET/EPIPE handling to test_asyncore. Patch
  by Xavier de Gaye.

- Issue #13218: Fix test_ssl failures on Debian/Ubuntu.

- Re-enable lib2to3's test_parser.py tests, though with an expected failure
  (see issue 13125).

- Issue #12656: Add tests for IPv6 and Unix sockets to test_asyncore.

- Issue #6484: Add unit tests for mailcap module (patch by Gregory Nofi)

- Issue #11651: Improve the Makefile test targets to run more of the test suite
  more quickly. The --multiprocess option is now enabled by default, reducing
  the amount of time needed to run the tests. "make test" and "make quicktest"
  now include some resource-intensive tests, but no longer run the test suite
  twice to check for bugs in .pyc generation. Tools/scripts/run_test.py provides
  an easy platform-independent way to run test suite with sensible defaults.

- Issue #12331: The test suite for the packaging module can now run from an
  installed Python.

- Issue #12331: The test suite for lib2to3 can now run from an installed
  Python.

- Issue #12626: In regrtest, allow to filter tests using a glob filter
  with the ``-m`` (or ``--match``) option.  This works with all test cases
  using the unittest module.  This is useful with long test suites
  such as test_io or test_subprocess.

- Issue #12624: It is now possible to fail after the first failure when
  running in verbose mode (``-v`` or ``-W``), by using the ``--failfast``
  (or ``-G``) option to regrtest.  This is useful with long test suites
  such as test_io or test_subprocess.

- Issue #12587: Correct faulty test file and reference in test_tokenize.
  (Patch by Robert Xiao)

- Issue #12573: Add resource checks for dangling Thread and Process objects.

- Issue #12549: Correct test_platform to not fail when OS X returns 'x86_64'
  as the processor type on some Mac systems.

- Skip network tests when getaddrinfo() returns EAI_AGAIN, meaning a temporary
  failure in name resolution.

- Issue #11812: Solve transient socket failure to connect to 'localhost'
  in test_telnetlib.py.

- Solved a potential deadlock in test_telnetlib.py. Related to issue #11812.

- Avoid failing in test_robotparser when mueblesmoraleda.com is flaky and
  an overzealous DNS service (e.g. OpenDNS) redirects to a placeholder
  Web site.

- Avoid failing in test_urllibnet.test_bad_address when some overzealous
  DNS service (e.g. OpenDNS) resolves a non-existent domain name.  The test
  is now skipped instead.

- Issue #12440: When testing whether some bits in SSLContext.options can be
  reset, check the version of the OpenSSL headers Python was compiled against,
  rather than the runtime version of the OpenSSL library.

- Issue #11512: Add a test suite for the cgitb module. Patch by Robbie Clemons.

- Issue #12497: Install test/data to prevent failures of the various codecmaps
  tests.

- Issue #12496: Install test/capath directory to prevent test_connect_capath
  testcase failure in test_ssl.

- Issue #12469: Run wakeup and pending signal tests in a subprocess to run the
  test in a fresh process with only one thread and to not change signal
  handling of the parent process.

- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
  test_tk or test_ttk_guionly under a username that is not currently logged
  in to the console windowserver (as may be the case under buildbot or ssh).

- Issue #12407: Explicitly skip test_capi.EmbeddingTest under Windows.

- Issue #12400: regrtest -W doesn't rerun the tests twice anymore, but captures
  the output and displays it on failure instead. regrtest -v doesn't print the
  error twice anymore if there is only one error.

- Issue #12141: Install copies of template C module file so that
  test_build_ext of test_distutils and test_command_build_ext of
  test_packaging are no longer silently skipped when
  run outside of a build directory.

- Issue #8746: Add additional tests for os.chflags() and os.lchflags().
  Patch by Garrett Cooper.

- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9
  2.8 +  on Mac OS X.  (Patch by Ronald Oussoren)

- Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2,
  iso2022_kr).

- Issue #12096: Fix a race condition in test_threading.test_waitfor(). Patch
  written by Charles-François Natali.

- Issue #11614: import __hello__ prints "Hello World!". Patch written by
  Andreas Stührk.

- Issue #5723: Improve json tests to be executed with and without accelerations.

- Issue #12041: Make test_wait3 more robust.

- Issue #11873: Change regex in test_compileall to fix occasional failures when
  when the randomly generated temporary path happened to match the regex.

- Issue #11958: Fix FTP tests for IPv6, bind to "::1" instead of "localhost".
  Patch written by Charles-Francois Natali.

- Issue #8407, #11859: Fix tests of test_io using threads and an alarm: use
  pthread_sigmask() to ensure that the SIGALRM signal is received by the main
  thread.

- Issue #11811: Factor out detection of IPv6 support on the current host
  and make it available as ``test.support.IPV6_ENABLED``.  Patch by
  Charles-François Natali.

- Issue #10914: Add a minimal embedding test to test_capi.

- Issue #11223: Skip test_lock_acquire_interruption() and
  test_rlock_acquire_interruption() of test_threadsignals if a thread lock is
  implemented using a POSIX mutex and a POSIX condition variable. A POSIX
  condition variable cannot be interrupted by a signal (e.g. on Linux, the
  futex system call is restarted).

- Issue #11790: Fix sporadic failures in test_multiprocessing.WithProcessesTestCondition.

- Fix possible "file already exists" error when running the tests in parallel.

- Issue #11719: Fix message about unexpected test_msilib skip on non-Windows
  platforms. Patch by Nadeem Vawda.

- Issue #11727: Add a --timeout option to regrtest: if a test takes more than
  TIMEOUT seconds, dumps the traceback of all threads and exits.

- Issue #11653: fix -W with -j in regrtest.

- The email test suite now lives in the Lib/test/test_email package.  The test
  harness code has also been modernized to allow use of new unittest features.

- regrtest now discovers test packages as well as test modules.

- Issue #11577: improve test coverage of binhex.py. Patch by Arkady Koplyarov.

- New test_crashers added to exercise the scripts in the Lib/test/crashers
  directory and confirm they fail as expected

- Issue #11578: added test for the timeit module.  Patch by Michael Henry.

- Issue #11503: improve test coverage of posixpath.py. Patch by Evan Dandrea.

- Issue #11505: improves test coverage of string.py, increases granularity of
  string.Formatter tests. Initial patch by Alicia Arlen.

- Issue #11548: Improve test coverage of the shutil module. Patch by
  Evan Dandrea.

- Issue #11554: Reactivated test_email_codecs.

- Issue #11505: improves test coverage of string.py. Patch by Alicia
  Arlen

- Issue #11490: test_subprocess:test_leaking_fds_on_error no longer gives a
  false positive if the last directory in the path is inaccessible.

- Issue #11223: Fix test_threadsignals to fail, not hang, when the
  non-semaphore implementation of locks is used under POSIX.

- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
  Pierre Quentel.

- Issue #9931: Fix hangs in GUI tests under Windows in certain conditions.
  Patch by Hirokazu Yamamoto.

- Issue #10512: Properly close sockets under test.test_cgi.

- Issue #10992: Make tests pass under coverage.

- Issue #10826: Prevent sporadic failure in test_subprocess on Solaris due
  to open door files.

- Issue #10990: Prevent tests from clobbering a set trace function.

C-API
-----

- Add PyObject_GenericGetDict and PyObject_GeneriSetDict. They are generic
  implementations for the getter and setter of a ``__dict__`` descriptor of C
  types.

- Issue #13727: Add 3 macros to access PyDateTime_Delta members:
  PyDateTime_DELTA_GET_DAYS, PyDateTime_DELTA_GET_SECONDS,
  PyDateTime_DELTA_GET_MICROSECONDS.

- Issue #10542: Add 4 macros to work with surrogates: Py_UNICODE_IS_SURROGATE,
  Py_UNICODE_IS_HIGH_SURROGATE, Py_UNICODE_IS_LOW_SURROGATE,
  Py_UNICODE_JOIN_SURROGATES.

- Issue #12724: Add Py_RETURN_NOTIMPLEMENTED macro for returning NotImplemented.

- PY_PATCHLEVEL_REVISION has been removed, since it's meaningless with
  Mercurial.

- Issue #12173: The first argument of PyImport_ImportModuleLevel is now `const
  char *` instead of `char *`.

- Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format.

Documentation
-------------

- Issues #13491 and #13995: Fix many errors in sqlite3 documentation.
  Initial patch for #13491 by Johannes Vogel.

- Issue #13402: Document absoluteness of sys.executable.

- Issue #13883: PYTHONCASEOK also works on OS X.

- Issue #9021: Add an introduction to the copy module documentation.

- Issue #6005: Examples in the socket library documentation use sendall, where
  relevant, instead send method.

- Issue #12798: Updated the mimetypes documentation.

- Issue #12949: Document the kwonlyargcount argument for the PyCode_New
  C API function.

- Issue #13513: Fix io.IOBase documentation to correctly link to the
  io.IOBase.readline method instead of the readline module.

- Issue #13237: Reorganise subprocess documentation to emphasise convenience
  functions and the most commonly needed arguments to Popen.

- Issue #13141: Demonstrate recommended style for socketserver examples.

- Issue #11818: Fix tempfile examples for Python 3.


What's New in Python 3.2?
=========================

*Release date: 20-Feb-2011*

Core and Builtins
-----------------

- Issue #11249: Fix potential crashes when using the limited API.

Build
-----

- Issue #11222: Fix non-framework shared library build on Mac OS X.

- Issue #11184: Fix large-file support on AIX.

- Issue #941346: Fix broken shared library build on AIX.

Documentation
-------------

- Issue #10709: Add updated AIX notes in Misc/README.AIX.


What's New in Python 3.2 Release Candidate 3?
=============================================

*Release date: 13-Feb-2011*

Core and Builtins
-----------------

- Issue #11134: Add missing fields to typeslots.h.

- Issue #11135: Remove redundant doc field from PyType_Spec.

- Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check in the limited
  ABI.

- Issue #11118: Fix bogus export of None in python3.dll.

Library
-------

- Issue #11116: any error during addition of a message to a mailbox now causes a
  rollback, instead of leaving the mailbox partially modified.

- Issue #11132: Fix passing of "optimize" parameter when recursing in
  compileall.compile_dir().

- Issue #11110: Fix a potential decref of a NULL in sqlite3.

- Issue #8275: Fix passing of callback arguments with ctypes under Win64.  Patch
  by Stan Mihai.

Build
-----

- Issue #11079: The /Applications/Python x.x folder created by the Mac OS X
  installers now includes a link to the installed documentation and no longer
  includes an Extras directory.  The Tools directory is now installed in the
  framework under share/doc.

- Issue #11121: Fix building with --enable-shared.

Tests
-----

- Issue #10971: test_zipimport_support is once again compatible with the refleak
  hunter feature of test.regrtest.


What's New in Python 3.2 Release Candidate 2?
=============================================

*Release date: 30-Jan-2011*

Core and Builtins
-----------------

- Issue #10451: memoryview objects could allow to mutate a readable buffer.
  Initial patch by Ross Lagerwall.

Library
-------

- Issue #9124: mailbox now accepts binary input and reads and writes mailbox
  files in binary mode, using the email package's binary support to parse
  arbitrary email messages.  StringIO and text file input is deprecated,
  and string input fails early if non-ASCII characters are used, where
  previously it would fail when the email was processed in a later step.

- Issue #10845: Mitigate the incompatibility between the multiprocessing
  module on Windows and the use of package, zipfile or directory execution
  by special casing main modules that actually *are* called __main__.py.

- Issue #11045: Protect logging call against None argument.

- Issue #11052: Correct IDLE menu accelerators on Mac OS X for Save
  commands.

- Issue #11053: Fix IDLE "Syntax Error" windows to behave as in 2.x,
  preventing a confusing hung appearance on OS X with the windows
  obscured.

- Issue #10940: Workaround an IDLE hang on Mac OS X 10.6 when using the
  menu accelerators for Open Module, Go to Line, and New Indent Width.
  The accelerators still work but no longer appear in the menu items.

- Issue #10989: Fix a crash on SSLContext.load_verify_locations(None, True).

- Issue #11020: Command-line pyclbr was broken because of missing 2-to-3
  conversion.

- Issue #11019: Fixed BytesGenerator so that it correctly handles a Message
  with a None body.

- Issue #11014: Make 'filter' argument in tarfile.Tarfile.add() into a
  keyword-only argument.  The preceding positional argument was deprecated,
  so it made no sense to add filter as a positional argument.

- Issue #11004: Repaired edge case in deque.count().

- Issue #10974: IDLE no longer crashes if its recent files list includes files
  with non-ASCII characters in their path names.

- Have hashlib.algorithms_available and hashlib.algorithms_guaranteed both
  return sets instead of one returning a tuple and the other a frozenset.

- Issue #10987: Fix the recursion limit handling in the _pickle module.

- Issue #10983: Fix several bugs making tunnel requests in http.client.

- Issue #10955: zipimport uses ASCII encoding instead of cp437 to decode
  filenames, at bootstrap, if the codec registry is not ready yet. It is still
  possible to have non-ASCII filenames using the Unicode flag (UTF-8 encoding)
  for all file entries in the ZIP file.

- Issue #10949: Improved robustness of rotating file handlers.

- Issue #10955: Fix a potential crash when trying to mmap() a file past its
  length.  Initial patch by Ross Lagerwall.

- Issue #10898: Allow compiling the posix module when the C library defines
  a symbol named FSTAT.

- Issue #10980: the HTTP server now encodes headers with iso-8859-1 (latin1)
  encoding.  This is the preferred encoding of PEP 3333 and the base encoding
  of HTTP 1.1.

- To match the behaviour of HTTP server, the HTTP client library now also
  encodes headers with iso-8859-1 (latin1) encoding.  It was already doing
  that for incoming headers which makes this behaviour now consistent in
  both incoming and outgoing direction.

- Issue #9509: argparse now properly handles IOErrors raised by
  argparse.FileType.

- Issue #10961: The new pydoc server now better handles exceptions raised
  during request handling.

- Issue #10680: Fix mutually exclusive arguments for argument groups in
  argparse.

Build
-----

- Issue #11054: Allow Mac OS X installer builds to again work on 10.5 with
  the system-provided Python.


What's New in Python 3.2 Release Candidate 1
============================================

*Release date: 16-Jan-2011*

Core and Builtins
-----------------

- Issue #10889: range indexing and slicing now works correctly on ranges with
  a length that exceeds sys.maxsize.

- Issue #10892: Don't segfault when trying to delete __abstractmethods__ from a
  class.

- Issue #8020: Avoid a crash where the small objects allocator would read
  non-Python managed memory while it is being modified by another thread.  Patch
  by Matt Bandy.

- Issue #10841: On Windows, set the binary mode on stdin, stdout, stderr and all
  io.FileIO objects (to not translate newlines, \r\n <=> \n).  The Python parser
  translates newlines (\r\n => \n).

- Remove buffer API from stable ABI for now, see #10181.

- Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
  doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
  (length bigger than 2^31-1 bytes).

- Issue #9015, #9611: FileIO.readinto(), FileIO.write(), os.write() and
  stdprinter.write() clamp the length to INT_MAX on Windows.

- Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime()
  can now handle dates after 2038.

- Issue #10780: PyErr_SetFromWindowsErrWithFilename() and
  PyErr_SetExcFromWindowsErrWithFilename() decode the filename from the
  filesystem encoding instead of UTF-8.

- Issue #10779: PyErr_WarnExplicit() decodes the filename from the filesystem
  encoding instead of UTF-8.

- Add sys.flags attribute for the new -q command-line option.

- Issue #11506: Trying to assign to a bytes literal should result in a
  SyntaxError.

Library
-------

- Issue #10916: mmap should not segfault when a file is mapped using 0 as length
  and a non-zero offset, and an attempt to read past the end of file is made
  (IndexError is raised instead).  Patch by Ross Lagerwall.

- Issue #10154, #10090: change the normalization of UTF-8 to "UTF-8" instead
  of "UTF8" in the locale module as the latter is not supported MacOSX and OpenBSD.

- Issue #10907: Warn OS X 10.6 IDLE users to use ActiveState Tcl/Tk 8.5, rather
  than the currently problematic Apple-supplied one, when running with the
  64-/32-bit installer variant.

- Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
  as unicode, and accept binary files. Add encoding and errors attributes to
  cgi.FieldStorage. Patch written by Pierre Quentel (with many inputs by Glenn
  Linderman).

- Add encoding and errors arguments to urllib.parse_qs() and urllib.parse_qsl().

- Issue #10899: No function type annotations in the standard library.  Removed
  function type annotations from _pyio.py.

- Issue #10875: Update Regular Expression HOWTO; patch by 'SilentGhost'.

- Issue #10872: The repr() of TextIOWrapper objects now includes the mode
  if available.

- Issue #10869: Fixed bug where ast.increment_lineno modified the root node
  twice.

- Issue #5871: email.header.Header.encode now raises an error if any
  continuation line in the formatted value has no leading white space and looks
  like a header.  Since Generator uses Header to format all headers, this check
  is made for all headers in any serialized message at serialization time.  This
  provides protection against header injection attacks.

- Issue #10859: Make ``contextlib.GeneratorContextManager`` officially
  private by renaming it to ``_GeneratorContextManager``.

- Issue #10042: Fixed the total_ordering decorator to handle cross-type
  comparisons that could lead to infinite recursion.

- Issue #10686: the email package now :rfc:`2047`\ -encodes headers with
  non-ASCII bytes (parsed by a BytesParser) when doing conversion to 7bit-clean
  presentation, instead of replacing them with ?s.

- email.header.Header was incorrectly encoding folding whitespace when
  rfc2047-encoding header values with embedded newlines, leaving them without
  folding whitespace.  It now uses the continuation_ws, as it does for
  continuation lines that it creates itself.

- Issue #1777412, #10827: Changed the rules for 2-digit years. The
  time.asctime(), time.ctime() and time.strftime() functions will now format
  any year when ``time.accept2dyear`` is False and will accept years >= 1000
  otherwise. ``time.mktime`` and ``time.strftime`` now accept full range
  supported by the OS. With Visual Studio or on Solaris, the year is limited to
  the range [1; 9999]. Conversion of 2-digit years to 4-digit is deprecated.

- Issue #7858: Raise an error properly when os.utime() fails under Windows
  on an existing file.

- Issue #3839: wsgiref should not override a Content-Length header set by
  the application.  Initial patch by Clovis Fabricio.

- Issue #10492: bdb.Bdb.run() only traces the execution of the code, not the
  compilation (if the input is a string).

- Issue #7995: When calling accept() on a socket with a timeout, the returned
  socket is now always blocking, regardless of the operating system.

- Issue #10756: atexit normalizes the exception before displaying it. Patch by
  Andreas Stührk.

- Issue #10790: email.header.Header.append's charset logic now works correctly
  for charsets whose output codec is different from its input codec.

- Issue #10819: SocketIO.name property returns -1 when its closed, instead of
  raising a ValueError, to fix repr().

- Issue #8650: zlib.compress() and zlib.decompress() raise an OverflowError if
  the input buffer length doesn't fit into an unsigned int (length bigger than
  2^32-1 bytes).

- Issue #6643: Reinitialize locks held within the threading module after fork to
  avoid a potential rare deadlock or crash on some platforms.

- Issue #10806, issue #9905: Fix subprocess pipes when some of the standard file
  descriptors (0, 1, 2) are closed in the parent process.  Initial patch by Ross
  Lagerwall.

- `unittest.TestCase` can be instantiated without a method name; for simpler
  exploration from the interactive interpreter.

- Issue #10798: Reject supporting concurrent.futures if the system has too
  few POSIX semaphores.

- Issue #10807: Remove base64, bz2, hex, quopri, rot13, uu and zlib codecs from
  the codec aliases. They are still accessible via codecs.lookup().

- Issue #10801: In zipfile, support different encodings for the header and the
  filenames.

- Issue #6285: IDLE no longer crashes on missing help file; patch by Scott
  David Daniels.

- Fix collections.OrderedDict.setdefault() so that it works in subclasses that
  define __missing__().

- Issue #10786: unittest.TextTestRunner default stream no longer bound at import
  time. `sys.stderr` now looked up at instantiation time.  Fix contributed by
  Mark Roddy.

- Issue #10753: Characters ';', '=' and ',' in the PATH_INFO environment variable
  won't be quoted when the URI is constructed by the wsgiref.util's request_uri
  method. According to RFC 3986, these characters can be a part of params in
  PATH component of URI and need not be quoted.

- Issue #10738: Fix webbrowser.Opera.raise_opts.

- Issue #9824: SimpleCookie now encodes , and ; in values to cater to how
  browsers actually parse cookies.

- Issue #9333: os.symlink now available regardless of user privileges.  The
  function now raises OSError on Windows >=6.0 when the user is unable to create
  symbolic links. XP and 2003 still raise NotImplementedError.

- Issue #10783: struct.pack() no longer implicitly encodes unicode to UTF-8.

- Issue #10730: Add SVG mime types to mimetypes module.

- Issue #10768: Make the Tkinter ScrolledText widget work again.

- Issue #10777: Fix "dictionary changed size during iteration" bug in
  ElementTree register_namespace().

- Issue #10626: test_logging now preserves logger disabled states.

- Issue #10774: test_logging now removes temp files created during tests.

- Issue #5258/#10642: if site.py encounters a .pth file that generates an error,
  it now prints the filename, line number, and traceback to stderr and skips
  the rest of that individual file, instead of stopping processing entirely.

- Issue #10763: subprocess.communicate() closes stdout and stderr if both are
  pipes (bug specific to Windows).

- Issue #1693546: fix email.message RFC 2231 parameter encoding to be in better
  compliance (no "s around encoded values).

- Improved the diff message in the unittest module's assertCountEqual().

- Issue #1155362: email.utils.parsedate_tz now handles a missing space before
  the '-' of a timezone field as well as before a '+'.

- Issue #4871: The zipfile module now gives a more useful error message if
  an attempt is made to use a string to specify the archive password.

- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.

- Deprecated assertDictContainsSubset() in the unittest module.

C-API
-----

- PyObject_CallMethod now passes along any underlying AttributeError from
  PyObject_GetAttr, instead of replacing it with something less informative

- Issue #10913: Deprecate misleading functions PyEval_AcquireLock() and
  PyEval_ReleaseLock().  The thread-state aware APIs should be used instead.

- Issue #10333: Remove ancient GC API, which has been deprecated since Python
  2.2.

Build
-----

- Issue #10843: Update third-party library versions used in OS X 32-bit
  installer builds: bzip2 1.0.6, readline 6.1.2, SQLite 3.7.4 (with FTS3/FTS4
  and RTREE enabled), and ncursesw 5.5 (wide-char support enabled).

- Issue #10820: Fix OS X framework installs to support version-specific
  scripts (#10679).

- Issue #7716: Under Solaris, don't assume existence of /usr/xpg4/bin/grep in
  the configure script but use $GREP instead.  Patch by Fabian Groffen.

- Issue #10475: Don't hardcode compilers for LDSHARED/LDCXXSHARED on NetBSD
  and DragonFly BSD.  Patch by Nicolas Joly.

- Issue #10679: The "idle", "pydoc" and "2to3" scripts are now installed with
  a version-specific suffix on "make altinstall".

- Issue #10655: Fix the build on PowerPC on Linux with GCC when building with
  timestamp profiling (--with-tsc): the preprocessor test for the PowerPC
  support now looks for "__powerpc__" as well as "__ppc__": the latter seems to
  only be present on OS X; the former is the correct one for Linux with GCC.

- Issue #1099: Fix the build on MacOSX when building a framework with pydebug
  using GCC 4.0.

Tools/Demos
-----------

- Issue #10843: Install the Tools directory on OS X in the applications Extras
  (/Applications/Python 3.n/Extras/) where the Demo directory had previous been
  installed.

- Issue #7962: The Demo directory is gone.  Most of the old and unmaintained
  demos have been removed, others integrated in documentation or a new
  Tools/demo subdirectory.

- Issue #10502: Addition of the unittestgui tool. Originally by Steve Purcell.
  Updated for test discovery by Mark Roddy and Python 3 compatibility by Brian
  Curtin.

Tests
-----

- Issue #11910: Fix test_heapq to skip the C tests when _heapq is missing.

- Fix test_startfile to wait for child process to terminate before finishing.

- Issue #10822: Fix test_posix:test_getgroups failure under Solaris.  Patch
  by Ross Lagerwall.

- Make the --coverage flag work for test.regrtest.

- Issue #1677694: Refactor and improve test_timeout.  Original patch by
  Björn Lindqvist.

- Issue #5485: Add tests for the UseForeignDTD method of expat parser objects.
  Patch by Jean-Paul Calderone and Sandro Tosi.

- Issue #6293: Have regrtest.py echo back sys.flags.  This is done by default in
  whole runs and enabled selectively using ``--header`` when running an explicit
  list of tests.  Original patch by Collin Winter.


What's New in Python 3.2 Beta 2?
================================

*Release date: 19-Dec-2010*

Core and Builtins
-----------------

- Issue #8844: Regular and recursive lock acquisitions can now be interrupted
  by signals on platforms using pthreads.  Patch by Reid Kleckner.

- Issue #4236: PyModule_Create2 now checks the import machinery directly
  rather than the Py_IsInitialized flag, avoiding a Fatal Python
  error in certain circumstances when an import is done in __del__.

- Issue #5587: add a repr to dict_proxy objects.  Patch by David Stanek and
  Daniel Urban.

Library
-------

- Issue #3243:  Support iterable bodies in httplib. Patch Contributions by
  Xuanji Li and Chris AtLee.

- Issue #10611: SystemExit exception will no longer kill a unittest run.

- Issue #9857: It is now possible to skip a test in a setUp, tearDown or clean
  up function.

- Issue #10573: use actual/expected consistently in unittest methods.
  The order of the args of assertCountEqual is also changed.

- Issue #9286: email.utils.parseaddr no longer concatenates blank-separated
  words in the local part of email addresses, thereby preserving the input.

- Issue #6791: Limit header line length (to 65535 bytes) in http.client
  and http.server, to avoid denial of services from the other party.

- Issue #10404: Use ctl-button-1 on OSX for the context menu in Idle.

- Issue #9907: Fix tab handling on OSX when using editline by calling
  rl_initialize first, then setting our custom defaults, then reading .editrc.

- Issue #4188: Avoid creating dummy thread objects when logging operations
  from the threading module (with the internal verbose flag activated).

- Issue #10711: Remove HTTP 0.9 support from http.client.  The ``strict``
  parameter to HTTPConnection and friends is deprecated.

- Issue #9721: Fix the behavior of urljoin when the relative url starts with a
  ';' character. Patch by Wes Chow.

- Issue #10714: Limit length of incoming request in http.server to 65536 bytes
  for security reasons.  Initial patch by Ross Lagerwall.

- Issue #9558: Fix distutils.command.build_ext with VS 8.0.

- Issue #10667: Fast path for collections.Counter().

- Issue #10695: passing the port as a string value to telnetlib no longer
  causes debug mode to fail.

- Issue #1078919: add_header now automatically RFC2231 encodes parameters
  that contain non-ascii values.

- Issue #10188 (partial resolution): tempfile.TemporaryDirectory emits
  a warning on sys.stderr rather than throwing a misleading exception
  if cleanup fails due to nulling out of modules during shutdown.
  Also avoids an AttributeError when mkdtemp call fails and issues
  a ResourceWarning on implicit cleanup via __del__.

- Issue #10107: Warn about unsaved files in IDLE on OSX.

- Issue #7213: subprocess.Popen's default for close_fds has been changed.
  It is now True in most cases other than on Windows when input, output or
  error handles are provided.

- Issue #6559: subprocess.Popen has a new pass_fds parameter (actually
  added in 3.2beta1) to allow specifying a specific list of file descriptors
  to keep open in the child process.

- Issue #1731717: Fixed the problem where subprocess.wait() could cause an
  OSError exception when The OS had been told to ignore SIGCLD in our process
  or otherwise not wait for exiting child processes.

Tests
-----

- Issue #775964: test_grp now skips YP/NIS entries instead of failing when
  encountering them.

Tools/Demos
-----------

- Issue #6075: IDLE on Mac OS X now works with both Carbon AquaTk and
  Cocoa AquaTk.

- Issue #10710: ``Misc/setuid-prog.c`` is removed from the source tree.

- Issue #10706: Remove outdated script runtests.sh.  Either ``make test``
  or ``python -m test`` should be used instead.

Build
-----

- The Windows build now uses Tcl/Tk 8.5.9 and sqlite3 3.7.4.

- Issue #9234: argparse supports alias names for subparsers.


What's New in Python 3.2 Beta 1?
================================

*Release date: 05-Dec-2010*

Core and Builtins
-----------------

- Issue #10630: Return dict views from the dict proxy keys()/values()/items()
  methods.

- Issue #10596: Fix float.__mod__ to have the same behaviour as float.__divmod__
  with respect to signed zeros.  -4.0 % 4.0 should be 0.0, not -0.0.

- Issue #1772833: Add the -q command-line option to suppress copyright and
  version output in interactive mode.

- Provide an *optimize* parameter in the built-in compile() function.

- Fixed several corner case issues on Windows in os.stat/os.lstat related to
  reparse points.

- PEP 384 (Defining a Stable ABI) is implemented.

- Issue #2690: Range objects support negative indices and slicing.

- Issue #9915: Speed up sorting with a key.

- Issue #8685: Speed up set difference ``a - b`` when source set ``a`` is much
  larger than operand ``b``.  Patch by Andrew Bennetts.

- Issue #10518: Bring back the callable() builtin.

- Issue #7094: Added alternate formatting (specified by '#') to ``__format__``
  method of float, complex, and Decimal. This allows more precise control over
  when decimal points are displayed.

- Issue #10474: range.count() should return integers.

- Issue #1574217: isinstance now catches only AttributeError, rather than
  masking all errors.

Library
-------

- logging: added "handler of last resort". See http://bit.ly/last-resort-handler

- test.support: Added TestHandler and Matcher classes for better support of
  assertions about logging.

- Issue #4391: Use proper plural forms in argparse.

- Issue #10601: sys.displayhook uses 'backslashreplace' error handler on
  UnicodeEncodeError.

- Add the "display" and "undisplay" pdb commands.

- Issue #7245: Add a SIGINT handler in pdb that allows to break a program again
  after a "continue" command.

- Add the "interact" pdb command.

- Issue #7905: Actually respect the keyencoding parameter to shelve.Shelf.

- Issue #1569291: Speed up array.repeat().

- Provide an interface to set the optimization level of compilation in
  py_compile, compileall and zipfile.PyZipFile.

- Issue #7904: Changes to urllib.parse.urlsplit to handle schemes as defined by
  RFC3986. Anything before :// is considered a scheme and is followed by an
  authority (or netloc) and by '/' led path, which is optional.

- Issue #6045: dbm.gnu databases now support get() and setdefault() methods.

- Issue #10620: `python -m unittest` can accept file paths instead of module
  names for running specific tests.

- Issue #9424: Deprecate the `unittest.TestCase` methods `assertEquals`,
  `assertNotEquals`, `assertAlmostEquals`, `assertNotAlmostEquals` and `assert_`
  and replace them with the correct methods in the Python test suite.

- Issue #10272: The ssl module now raises socket.timeout instead of a generic
  SSLError on socket timeouts.

- Issue #10528: Allow translators to reorder placeholders in localizable
  messages from argparse.

- Issue #10497: Fix incorrect use of gettext in argparse.

- Issue #10478: Reentrant calls inside buffered IO objects (for example by
  way of a signal handler) now raise a RuntimeError instead of freezing the
  current process.

- logging: Added getLogRecordFactory/setLogRecordFactory with docs and tests.

- Issue #10549: Fix pydoc traceback when text-documenting certain classes.

- Issue #2001: New HTML server with enhanced Web page features.  Patch by Ron
  Adam.

- Issue #10360: In WeakSet, do not raise TypeErrors when testing for membership
  of non-weakrefable objects.

- Issue #940286: pydoc.Helper.help() ignores input/output init parameters.

- Issue #1745035: Add a command size and data size limit to smtpd.py, to prevent
  DoS attacks.  Patch by Savio Sena.

- Issue #4925: Add filename to error message when executable can't be found in
  subprocess.

- Issue #10391: Don't dereference invalid memory in error messages in the ast
  module.

- Issue #10027: st_nlink was not being set on Windows calls to os.stat or
  os.lstat. Patch by Hirokazu Yamamoto.

- Issue #9333: Expose os.symlink only when the SeCreateSymbolicLinkPrivilege is
  held by the user's account, i.e., when the function can actually be used.

- Issue #8879: Add os.link support for Windows.

- Issue #7911: ``unittest.TestCase.longMessage`` defaults to True for improved
  failure messages by default. Patch by Mark Roddy.

- Issue #1486713: HTMLParser now has an optional tolerant mode where it tries to
  guess at the correct parsing of invalid html.

- Issue #10554: Add context manager support to subprocess.Popen objects.

- Issue #8989: email.utils.make_msgid now has a domain parameter that can
  override the domain name used in the generated msgid.

- Issue #9299: Add exist_ok parameter to os.makedirs to suppress the 'File
  exists' exception when a target directory already exists with the specified
  mode. Patch by Ray Allen.

- Issue #9573: os.fork() now works correctly when triggered as a side effect of
  a module import.

- Issue #10464: netrc now correctly handles lines with embedded '#' characters.

- Added itertools.accumulate().

- Issue #4113: Added custom ``__repr__`` method to ``functools.partial``.
  Original patch by Daniel Urban.

- Issue #10273: Rename `assertRegexpMatches` and `assertRaisesRegexp` to
  `assertRegex` and `assertRaisesRegex`.

- Issue #10535: Enable silenced warnings in unittest by default.

- Issue #9873: The URL parsing functions in urllib.parse now accept ASCII byte
  sequences as input in addition to character strings.

- Issue #10586: The statistics API for the new functools.lru_cache has been
  changed to a single cache_info() method returning a named tuple.

- Issue #10323: itertools.islice() now consumes the minimum number of inputs
  before stopping.  Formerly, the final state of the underlying iterator was
  undefined.

- Issue #10565: The collections.Iterator ABC now checks for both __iter__ and
  __next__.

- Issue #10242: Fixed implementation of unittest.ItemsEqual and gave it a new
  more informative name, unittest.CountEqual.

- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.

- Issue #2986: difflib.SequenceMatcher gets a new parameter, autojunk, which can
  be set to False to turn off the previously undocumented 'popularity'
  heuristic. Patch by Terry Reedy and Eli Bendersky.

- Issue #10534: in difflib, expose bjunk and bpopular sets; deprecate
  undocumented and now redundant isbjunk and isbpopular methods.

- Issue #9846: zipfile is now correctly closing underlying file objects.

- Issue #10459: Update CJK character names to Unicode 6.0.

- Issue #4493: urllib.request adds '/' in front of path components which does not
  start with '/. Common behavior exhibited by browsers and other clients.

- Issue #6378: idle.bat now runs with the appropriate Python version rather than
  the system default. Patch by Sridhar Ratnakumar.

- Issue #10470: 'python -m unittest' will now run test discovery by default,
  when no extra arguments have been provided.

- Issue #3709: BaseHTTPRequestHandler will buffer the headers and write to
  output stream only when end_headers is invoked. This is a speedup and an
  internal optimization.  Patch by Andrew Shaaf.

- Issue #10220: Added inspect.getgeneratorstate. Initial patch by Rodolpho
  Eckhardt.

- Issue #10453: compileall now uses argparse instead of getopt, and thus
  provides clean output when called with '-h'.

- Issue #8078: Add constants for higher baud rates in the termios module.  Patch
  by Rodolpho Eckhardt.

- Issue #10407: Fix two NameErrors in distutils.

- Issue #10371: Deprecated undocumented functions in the trace module.

- Issue #10467: Fix BytesIO.readinto() after seeking into a position after the
  end of the file.

- configparser: 100% test coverage.

- Issue #10499: configparser supports pluggable interpolation handlers. The
  default classic interpolation handler is called BasicInterpolation. Another
  interpolation handler added (ExtendedInterpolation) which supports the syntax
  used by zc.buildout (e.g. interpolation between sections).

- configparser: the SafeConfigParser class has been renamed to ConfigParser.
  The legacy ConfigParser class has been removed but its interpolation mechanism
  is still available as LegacyInterpolation.

- configparser: Usage of RawConfigParser is now discouraged for new projects
  in favor of ConfigParser(interpolation=None).

- Issue #1682942: configparser supports alternative option/value delimiters.

- Issue #5412: configparser supports mapping protocol access.

- Issue #9411: configparser supports specifying encoding for read operations.

- Issue #9421: configparser's getint(), getfloat() and getboolean() methods
  accept vars and default arguments just like get() does.

- Issue #9452: configparser supports reading from strings and dictionaries
  (thanks to the mapping protocol API, the latter can be used to copy data
  between parsers).

- configparser: accepted INI file structure is now customizable, including
  comment prefixes, name of the DEFAULT section, empty lines in multiline
  values, and indentation.

- Issue #10326: unittest.TestCase instances can be pickled.

- Issue #9926: Wrapped TestSuite subclass does not get __call__ executed.

- Issue #9920: Skip tests for cmath.atan and cmath.atanh applied to complex
  zeros on systems where the log1p function fails to respect the sign of zero.
  This fixes a test failure on AIX.

- Issue #9732: Addition of getattr_static to the inspect module.

- Issue #10446: Module documentation generated by pydoc now links to a
  version-specific online reference manual.

- Make the 'No module named' exception message from importlib consistent.

- Issue #10443: Add the SSLContext.set_default_verify_paths() method.

- Issue #10440: Support RUSAGE_THREAD as a constant in the resource module.
  Patch by Robert Collins.

- Issue #10429: IMAP.starttls() stored the capabilities as bytes objects, rather
  than strings.

C-API
-----

- Issue #10557: Added a new API function, PyUnicode_TransformDecimalToASCII(),
  which transforms non-ASCII decimal digits in a Unicode string to their ASCII
  equivalents.

- Issue #9518: Extend the PyModuleDef_HEAD_INIT macro to explicitly
  zero-initialize all fields, fixing compiler warnings seen when building
  extension modules with gcc with "-Wmissing-field-initializers" (implied by
  "-W").

- Issue #10255: Fix reference leak in Py_InitializeEx().  Patch by Neil
  Schemenauer.

- structseq.h is now included in Python.h.

- Loosen PyArg_ValidateKeywordArguments to allow dict subclasses.

Tests
-----

- regrtest.py once again ensures the test directory is removed from sys.path
  when it is invoked directly as the __main__ module.

- `python -m test` can be used to run the test suite as well as `python -m
  test.regrtest`.

- Do not fail test_socket when the IP address of the local hostname cannot be
  looked up.

- Issue #8886: Use context managers throughout test_zipfile. Patch by Eric
  Carstensen.

Build
-----

- Issue #10325: Fix two issues in the fallback definitions for PY_ULLONG_MAX and
  PY_LLONG_MAX that made them unsuitable for use in preprocessor conditionals.

Documentation
-------------

- Issue #10299: List the built-in functions in a table in functions.rst.


What's New in Python 3.2 Alpha 4?
=================================

*Release date: 13-Nov-2010*

Core and Builtins
-----------------

- Issue #10372: Import the warnings module only after the IO library is
  initialized, so as to avoid bootstrap issues with the '-W' option.

- Issue #10293: Remove obsolete field in the PyMemoryView structure, unused
  undocumented value PyBUF_SHADOW, and strangely-looking code in
  PyMemoryView_GetContiguous.

- Issue #6081: Add str.format_map(), similar to ``str.format(**mapping)``.

- If FileIO.__init__ fails, close the file descriptor.

- Issue #10221: dict.pop(k) now has a key error message that includes the
  missing key (same message d[k] returns for missing keys).

- Issue #5437: A preallocated MemoryError instance should not keep traceback
  data (including local variables caught in the stack trace) alive infinitely.

- Issue #10186: Fix the SyntaxError caret when the offset is equal to the length
  of the offending line.

- Issue #10089: Add support for arbitrary -X options on the command line.  They
  can be retrieved through a new attribute ``sys._xoptions``.

- Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
  the locale encoding.  If the LANG (and LC_ALL and LC_CTYPE) environment
  variable is not set, the locale encoding is ISO-8859-1, whereas most programs
  (including Python) expect UTF-8.  Python already uses UTF-8 for the filesystem
  encoding and to encode command line arguments on this OS.

- Issue #9713, #10114: Parser functions (e.g. PyParser_ASTFromFile) expect
  filenames encoded to the filesystem encoding with the surrogateescape error
  handler (to support undecodable bytes), instead of UTF-8 in strict mode.

- Issue #9997: Don't let the name "top" have special significance in scope
  resolution.

- Issue #9862: Compensate for broken PIPE_BUF in AIX by hard coding its value as
  the default 512 when compiling on AIX.

- Use locale encoding instead of UTF-8 to encode and decode filenames if
  Py_FileSystemDefaultEncoding is not set.

- Issue #10095: fp_setreadl() doesn't reopen the file, instead reuse the file
  descriptor.

- Issue #9418: Moved private string methods ``_formatter_parser`` and
  ``_formatter_field_name_split`` into a new ``_string`` module.

- Issue #9992: Remove PYTHONFSENCODING environment variable.

Library
-------

- Issue #12943: python -m tokenize support has been added to tokenize.

- Issue #10465: fix broken delegating of attributes by gzip._PaddedFile.

- Issue #10356: Decimal.__hash__(-1) should return -2.

- Issue #1553375: logging: Added stack_info kwarg to display stack information.

- Issue #5111: IPv6 Host in the Header is wrapped inside [ ]. Patch by Chandru.

- Fix Fraction.__hash__ so that Fraction.__hash__(-1) is -2.  (See also issue
  #10356.)

- Issue #4471: Add the IMAP.starttls() method to enable encryption on standard
  IMAP4 connections.  Original patch by Lorenzo M. Catucci.

- Issue #1466065: Add 'validate' option to base64.b64decode to raise an error if
  there are non-base64 alphabet characters in the input.

- Issue #10386: Add __all__ to token module; this simplifies importing in
  tokenize module and prevents leaking of private names through ``import *``.

- Issue #4471: Properly shutdown socket in IMAP.shutdown().  Patch by Lorenzo
  M. Catucci.

- Fix IMAP.login() to work properly.

- Issue #9244: multiprocessing pool worker processes could terminate
  unexpectedly if the return value of a task could not be pickled.  Only the
  ``repr`` of such errors are now sent back, wrapped in an
  ``MaybeEncodingError`` exception.

- Issue #9244: The ``apply_async()`` and ``map_async()`` methods of
  ``multiprocessing.Pool`` now accepts a ``error_callback`` argument.  This can
  be a callback with the signature ``callback(exc)``, which will be called if
  the target raises an exception.

- Issue #10022: The dictionary returned by the ``getpeercert()`` method of SSL
  sockets now has additional items such as ``issuer`` and ``notBefore``.

- ``usenetrc`` is now false by default for NNTP objects.

- Issue #1926: Add support for NNTP over SSL on port 563, as well as STARTTLS.
  Patch by Andrew Vant.

- Issue #10335: Add tokenize.open(), detect the file encoding using
  tokenize.detect_encoding() and open it in read only mode.

- Issue #10321: Add support for binary data to smtplib.SMTP.sendmail, and a new
  method send_message to send an email.message.Message object.

- Issue #6011: sysconfig and distutils.sysconfig use the surrogateescape error
  handler to parse the Makefile file.  Avoid a UnicodeDecodeError if the source
  code directory name contains a non-ASCII character and the locale encoding is
  ASCII.

- Issue #10329: The trace module writes reports using the input Python script
  encoding, instead of the locale encoding.  Patch written by Alexander
  Belopolsky.

- Issue #10126: Fix distutils' test_build when Python was built with
  --enable-shared.

- Issue #9281: Prevent race condition with mkdir in distutils.  Patch by
  Arfrever.

- Issue #10229: Fix caching error in gettext.

- Issue #10252: Close file objects in a timely manner in distutils code and
  tests.  Patch by Brian Brazil, completed by Éric Araujo.

- Issue #10180: Pickling file objects is now explicitly forbidden, since
  unpickling them produced nonsensical results.

- Issue #10311: The signal module now restores errno before returning from its
  low-level signal handler.  Patch by Hallvard B Furuseth.

- Issue #10282: Add a ``nntp_implementation`` attribute to NNTP objects.

- Issue #10283: Add a ``group_pattern`` argument to NNTP.list().

- Issue #10155: Add IISCGIHandler to wsgiref.handlers to support IIS CGI
  environment better, and to correct unicode environment values for WSGI 1.0.1.

- Issue #10281: nntplib now returns None for absent fields in the OVER/XOVER
  response, instead of raising an exception.

- wsgiref now implements and validates PEP 3333, rather than an experimental
  extension of PEP 333.  (Note: earlier versions of Python 3.x may have
  incorrectly validated some non-compliant applications as WSGI compliant; if
  your app validates with Python <3.2b1+, but not on this version, it is likely
  the case that your app was not compliant.)

- Issue #10280: NNTP.nntp_version should reflect the highest version advertised
  by the server.

- Issue #10184: Touch directories only once when extracting a tarfile.

- Issue #10199: New package, ``turtledemo`` now contains selected demo scripts
  that were formerly found under Demo/turtle.

- Issue #10265: Close file objects explicitly in sunau.  Patch by Brian Brazil.

- Issue #10266: uu.decode didn't close in_file explicitly when it was given as a
  filename.  Patch by Brian Brazil.

- Issue #10110: Queue objects didn't recognize full queues when the maxsize
  parameter had been reduced.

- Issue #10160: Speed up operator.attrgetter.  Patch by Christos Georgiou.

- logging: Added style option to basicConfig() to allow %, {} or $-formatting.

- Issue #5729: json.dumps() now supports using a string such as '\t' for
  pretty-printing multilevel objects.

- Issue #10253: FileIO leaks a file descriptor when trying to open a file for
  append that isn't seekable.  Patch by Brian Brazil.

- Support context manager protocol for file-like objects returned by mailbox
  ``get_file()`` methods.

- Issue #10246: uu.encode didn't close file objects explicitly when filenames
  were given to it.  Patch by Brian Brazil.

- Issue #10198: fix duplicate header written to wave files when writeframes() is
  called without data.

- Close file objects in modulefinder in a timely manner.

- Close a io.TextIOWrapper object in email.parser in a timely manner.

- Close a file object in distutils.sysconfig in a timely manner.

- Close a file object in pkgutil in a timely manner.

- Issue #10233: Close file objects in a timely manner in the tarfile module and
  its test suite.

- Issue #10093: ResourceWarnings are now issued when files and sockets are
  deallocated without explicit closing.  These warnings are silenced by default,
  except in pydebug mode.

- tarfile.py: Add support for all missing variants of the GNU sparse extensions
  and create files with holes when extracting sparse members.

- Issue #10218: Return timeout status from ``Condition.wait`` in threading.

- Issue #7351: Add ``zipfile.BadZipFile`` spelling of the exception name and
  deprecate the old name ``zipfile.BadZipfile``.

- Issue #5027: The standard ``xml`` namespace is now understood by
  xml.sax.saxutils.XMLGenerator as being bound to
  http://www.w3.org/XML/1998/namespace.  Patch by Troy J. Farrell.

- Issue #5975: Add csv.unix_dialect class.

- Issue #7761: telnetlib.interact failures on Windows fixed.

- logging: Added style option to Formatter to allow %, {} or $-formatting.

- Issue #5178: Added tempfile.TemporaryDirectory class that can be used as a
  context manager.

- Issue #1349106: Generator (and BytesGenerator) flatten method and Header
  encode method now support a 'linesep' argument.

- Issue #5639: Add a *server_hostname* argument to ``SSLContext.wrap_socket`` in
  order to support the TLS SNI extension.  ``HTTPSConnection`` and ``urlopen()``
  also use this argument, so that HTTPS virtual hosts are now supported.

- Issue #10166: Avoid recursion in pstats Stats.add() for many stats items.

- Issue #10163: Skip unreadable registry keys during mimetypes initialization.

- logging: Made StreamHandler terminator configurable.

- logging: Allowed filters to be just callables.

- logging: Added tests for _logRecordClass changes.

- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.

- logging: Added _logRecordClass, getLogRecordClass, setLogRecordClass to
  increase flexibility of LogRecord creation.

- Issue #5117: Case normalization was needed on ntpath.relpath().  Also fixed
  root directory issue on posixpath.relpath().  (Ported working fixes from
  ntpath.)

- Issue #1343: xml.sax.saxutils.XMLGenerator now has an option
  short_empty_elements to direct it to use self-closing tags when appropriate.

- Issue #9807 (part 1): Expose the ABI flags in sys.abiflags.  Add --abiflags
  switch to python-config for command line access.

- Issue #6098: Don't claim DOM level 3 conformance in minidom.

- Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty
  XML namespace attribute is encountered.

- Issue #2830: Add the ``html.escape()`` function, which quotes all problematic
  characters by default.  Deprecate ``cgi.escape()``.

- Issue #9409: Fix the regex to match all kind of filenames, for interactive
  debugging in doctests.

- Issue #9183: ``datetime.timezone(datetime.timedelta(0))`` will now return the
  same instance as ``datetime.timezone.utc``.

- Issue #7523: Add SOCK_CLOEXEC and SOCK_NONBLOCK to the socket module, where
  supported by the system.  Patch by Nikita Vetoshkin.

- Issue #10063: file:// scheme will stop accessing remote hosts via ftp
  protocol. file:// urls had fallback to access remote hosts via ftp. This was
  not correct, change is made to raise a URLError when a remote host is tried to
  access via file:// scheme.

- Issue #1710703: Write structures for an empty ZIP archive when a ZipFile is
  created in modes 'a' or 'w' and then closed without adding any files. Raise
  BadZipfile (rather than IOError) when opening small non-ZIP files.

- Issue #10041: The signature of optional arguments in socket.makefile() didn't
  match that of io.open(), and they also didn't get forwarded properly to
  TextIOWrapper in text mode.  Patch by Kai Zhu.

- Issue #9003: http.client.HTTPSConnection, urllib.request.HTTPSHandler and
  urllib.request.urlopen now take optional arguments to allow for server
  certificate checking, as recommended in public uses of HTTPS.

- Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
  current directory was deleted. Patch written by W. Trevor King.

- Issue #3873: Speed up unpickling from file objects that have a peek() method.

- Issue #10075: Add a session_stats() method to SSLContext objects.

- Issue #9948: Fixed problem of losing filename case information.

Extension Modules
-----------------

- Issue #5109: array.array constructor will now use fast code when
  initial data is provided in an array object with correct type.

- Issue #6317: Now winsound.PlaySound only accepts unicode.

- Issue #6317: Now winsound.PlaySound can accept non ascii filename.

- Issue #9377: Use Unicode API for gethostname on Windows.

- Issue #10143: Update "os.pathconf" values.

- Issue #6518: Support context manager protcol for ossaudiodev types.

- Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY.

- Issue #9054: Fix a crash occurring when using the pyexpat module with expat
  version 2.0.1.

- Issue #5355: Provide mappings from Expat error numbers to string descriptions
  and backwards, in order to actually make it possible to analyze error codes
  provided by ExpatError.

- The Unicode database was updated to 6.0.0.

C-API
-----

- Issue #10288: The deprecated family of "char"-handling macros
  (ISLOWER()/ISUPPER()/etc) have now been removed: use Py_ISLOWER() etc instead.

- Issue #9778: Hash values are now always the size of pointers. A new Py_hash_t
  type has been introduced.

Tools/Demos
-----------

- Issue #10117: Tools/scripts/reindent.py now accepts source files that use
  encoding other than ASCII or UTF-8.  Source encoding is preserved when
  reindented code is written to a file.

- Issue #7287: Demo/imputil/knee.py was removed.

Tests
-----

- Issue #3699: Fix test_bigaddrspace and extend it to test bytestrings as well
  as unicode strings.  Initial patch by Sandro Tosi.

- Issue #10294: Remove dead code form test_unicode_file.

- Issue #10123: Don't use non-ascii filenames in test_doctest tests. Add a new
  test specific to unicode (non-ascii name and filename).

Build
-----

- Issue #10268: Add a --enable-loadable-sqlite-extensions option to configure.

- Issue #8852: Allow the socket module to build on OpenSolaris.

- Drop -OPT:Olimit compiler option.

- Issue #10094: Use versioned .so files on GNU/kfreeBSD and the GNU Hurd.

- Accept Oracle Berkeley DB 5.0 and 5.1 as backend for the dbm extension.

- Issue #7473: avoid link errors when building a framework with a different set
  of architectures than the one that is currently installed.


What's New in Python 3.2 Alpha 3?
=================================

*Release date: 09-Oct-2010*

Core and Builtins
-----------------

- Issue #10068: Global objects which have reference cycles with their module's
  dict are now cleared again. This causes issue #7140 to appear again.

- Issue #9738: Document PyErr_SetString() and PyErr_SetFromErrnoWithFilename()
  encodings.

- ast.literal_eval() can now handle negative numbers.  It is also a little more
  liberal in what it accepts without compromising the safety of the evaluation.
  For example, 3j+4 and 3+4+5 are both accepted.

- Issue #10006: type.__abstractmethods__ now raises an AttributeError.  As a
  result metaclasses can now be ABCs (see #9533).

- Issue #8670: ctypes.c_wchar supports non-BMP characters with 32 bits wchar_t.

- Issue #8670: PyUnicode_AsWideChar() and PyUnicode_AsWideCharString() replace
  UTF-16 surrogate pairs by single non-BMP characters for 16 bits Py_UNICODE and
  32 bits wchar_t (eg. Linux in narrow build).

- Issue #10003: Allow handling of SIGBREAK on Windows. Fixes a regression
  introduced by issue #9324.

- Issue #9979: Create function PyUnicode_AsWideCharString().

- Issue #7397: Mention that importlib.import_module() is probably what someone
  really wants to be using in __import__'s docstring.

- Issue #8521: Allow CreateKeyEx, OpenKeyEx, and DeleteKeyEx functions of winreg
  to use named arguments.

- Issue #9930: Remove bogus subtype check that was causing (e.g.)
  float.__rdiv__(2.0, 3) to return NotImplemented instead of the expected 1.5.

- Issue #9808: Implement os.getlogin for Windows. Patch by Jon Anglin.

- Issue #9901: Destroying the GIL in Py_Finalize() can fail if some other
  threads are still running.  Instead, reinitialize the GIL on a second call to
  Py_Initialize().

- All SyntaxErrors now have a column offset and therefore a caret when the error
  is printed.

- Issue #9252: PyImport_Import no longer uses a fromlist hack to return the
  module that was imported, but instead gets the module from sys.modules.

- Issue #9213: The range type_items now provides index() and count() methods, to
  conform to the Sequence ABC.  Patch by Daniel Urban and Daniel Stutzbach.

- Issue #7994: Issue a PendingDeprecationWarning if object.__format__ is called
  with a non-empty format string.  This is an effort to future-proof user
  code. If a derived class does not currently implement __format__ but later
  adds its own __format__, it would most likely break user code that had
  supplied a format string.  This will be changed to a DeprecationWaring in
  Python 3.3 and it will be an error in Python 3.4.

- Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
  re-created on a subsequent call to Py_Initialize().  The problem (a crash)
  wouldn't appear in 3.1 or 2.7 where the GIL's structure is more trivial.

- Issue #9210: Configure option --with-wctype-functions was removed.  Using the
  functions from the libc caused the methods .upper() and lower() to become
  locale aware and created subtly wrong results.

- Issue #9738: PyUnicode_FromFormat() and PyErr_Format() raise an error on a
  non-ASCII byte in the format string.

- Issue #4617: Previously it was illegal to delete a name from the local
  namespace if it occurs as a free variable in a nested block.  This limitation
  of the compiler has been lifted, and a new opcode introduced (DELETE_DEREF).

- Issue #9804: ascii() now always represents unicode surrogate pairs as a single
  ``\UXXXXXXXX``, regardless of whether the character is printable or not.
  Also, the "backslashreplace" error handler now joins surrogate pairs into a
  single character on UCS-2 builds.

- Issue #9757: memoryview objects get a release() method to release the
  underlying buffer (previously this was only done when deallocating the
  memoryview), and gain support for the context management protocol.

- Issue #9797: pystate.c wrongly assumed that zero couldn't be a valid
  thread-local storage key.

Library
-------

- Issue #2236: distutils' mkpath ignored the mode parameter.

- Fix typo in one sdist option (medata-check).

- Issue #9199: Fix incorrect use of distutils.cmd.Command.announce.

- Issue #1718574: Fix options that were supposed to accept arguments but did
  not in build_clib.

- Issue #9437: Fix building C extensions with non-default LDFLAGS.

- Issue #4661: email can now parse bytes input and generate either converted
  7bit output or bytes output.  Email version bumped to 5.1.0.

- Issue #1589: Add ssl.match_hostname(), to help implement server identity
  verification for higher-level protocols.

- Issue #9759: GzipFile now raises ValueError when an operation is attempted
  after the file is closed.  Patch by Jeffrey Finkelstein.

- Issue #9042: Fix interaction of custom translation classes and caching in
  gettext.

- Issue #6706: asyncore.dispatcher now provides a handle_accepted() method
  returning a (sock, addr) pair which is called when a connection has been
  established with a new remote endpoint.  This is supposed to be used as a
  replacement for old handle_accept() and avoids the user to call accept()
  directly.

- Issue #9065: tarfile no longer uses "root" as the default for the uname and
  gname field.

- Issue #8980: Fixed a failure in distutils.command check that was shadowed by
  an environment that does not have docutils.  Patch by Arfrever.

- Issue #1050268: parseaddr now correctly quotes double quote and backslash
  characters that appear inside quoted strings in email addresses.

- Issue #10004: quoprimime no longer generates a traceback when confronted with
  invalid characters after '=' in a Q-encoded word.

- Issue #1491: BaseHTTPServer nows send a ``100 Continue`` response before
  sending a 200 OK for the Expect: 100-continue request header.

- Issue #9360: Cleanup and improvements to the nntplib module.  The API now
  conforms to the philosophy of bytes and unicode separation in Python 3.  A
  test suite has also been added.

- Issue #9962: GzipFile now has the peek() method.

- Issue #9090: When a socket with a timeout fails with EWOULDBLOCK or EAGAIN,
  retry the select() loop instead of bailing out.  This is because select() can
  incorrectly report a socket as ready for reading (for example, if it received
  some data with an invalid checksum).

- Issue #3612: Added new types to ctypes.wintypes. (CHAR and pointers)

- Issue #9950: Fix socket.sendall() crash or misbehaviour when a signal is
  received.  Now sendall() properly calls signal handlers if necessary, and
  retries sending if these returned successfully, including on sockets with a
  timeout.

- Issue #9947: logging: Fixed locking bug in stopListening.

- Issue #9945: logging: Fixed locking bugs in addHandler/removeHandler.

- Issue #9936: Fixed executable lines' search in the trace module.

- Issue #9790: Rework imports necessary for samefile and sameopenfile
  in ntpath.

- Issue #9928: Properly initialize the types exported by the bz2 module.

- Issue #1675951: Allow GzipFile to work with unseekable file objects.  Patch by
  Florian Festi.

- Logging: Added QueueListener class to facilitate logging usage for
  performance-critical threads.

- Issue #9916: Add some missing errno symbols.

- Issue #9877: Expose sysconfig.get_makefile_filename()

- logging: Added hasHandlers() method to Logger and LoggerAdapter.

- Issue #9908: Fix os.stat() on bytes paths under Windows 7.

- Issue #2643: msync() is not called anymore when deallocating an open mmap
  object, only munmap().

- logging: Changed LoggerAdapter implementation internally, to make it easier to
  subclass in a useful way.

- logging: hasHandlers method was added to Logger, and isEnabledFor,
  getEffectiveLevel, hasHandlers and setLevel were added to LoggerAdapter.
  LoggerAdapter was introduced into the unit tests for logging.

- Issue #1686: Fix string.Template when overriding the pattern attribute.

- Issue #9854: SocketIO objects now observe the RawIOBase interface in
  non-blocking mode: they return None when an operation would block (instead of
  raising an exception).

- Issue #1730136: Fix the comparison between a tk.font.Font and an object of
  another kind.

- Issue #9441: logging has better coverage for rotating file handlers.

- Issue #9865: collections.OrderedDict now has a __sizeof__ method.

- Issue #9854: The default read() implementation in io.RawIOBase now handles
  non-blocking readinto() returning None correctly.

- Issue #1552: socket.socketpair() now returns regular socket.socket objects
  supporting the whole socket API (rather than the "raw" _socket.socket
  objects).

- Issue #9853: Fix the signature of SSLSocket.recvfrom() and SSLSocket.sendto()
  to match the corresponding socket methods.

- Issue #9840: Added a decorator to reprlib for wrapping __repr__ methods to make
  them handle recursive calls within the same thread.

- logging: Enhanced HTTPHandler with secure and credentials initializers.

- Issue #767645: Set os.path.supports_unicode_filenames to True on Mac OS X.

- Issue #9837: The read() method of ZipExtFile objects (as returned by
  ZipFile.open()) could return more bytes than requested.

- Issue #9826: OrderedDict.__repr__ can now handle self-referential values:
  d['x'] = d.

- Issue #9825: Using __del__ in the definition of collections.OrderedDict made
  it possible for the user to create self-referencing ordered dictionaries which
  become permanently uncollectable GC garbage.  Reinstated the Python 3.1
  approach of using weakref proxies so that reference cycles never get created
  in the first place.

- Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and
  encode the value with filesystem encoding and surrogateescape (instead of
  utf-8 in strict mode) . Patch written by David Watson.

- Issue #9632: Remove sys.setfilesystemencoding() function: use PYTHONFSENCODING
  environment variable to set the filesystem encoding at Python startup.
  sys.setfilesystemencoding() creates inconsistencies because it is unable to
  reencode all filenames in all objects.

- Issue #9410: Various optimizations to the pickle module, leading to speedups
  up to 4x (depending on the benchmark).  Mostly ported from Unladen Swallow;
  initial patch by Alexandre Vassalotti.

- The pprint module now supports printing OrderedDicts in their given order
  (formerly, it would sort the keys).

- Logging: Added QueueHandler class to facilitate logging usage with
  multiprocessing.

- Issue #9707: Rewritten reference implementation of threading.local which is
  friendlier towards reference cycles.  This change is not normally visible
  since an optimized C implementation (_thread._local) is used instead.

- Issue #6394: os.getppid() is now supported on Windows.  Note that it will
  still return the id of the parent process after it has exited.  This process
  id may even have been reused by another unrelated process.

- Issue #9792: In case of connection failure, socket.create_connection() would
  swallow the exception and raise a new one, making it impossible to fetch the
  original errno, or to filter timeout errors.  Now the original error is
  re-raised.

- Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True, and
  the passed buffer was exactly 1024 bytes long, the buffer wouldn't be updated
  back after the system call.  Original patch by Brian Brazil.

- Updates to the random module:

  * Document which parts of the module are guaranteed to stay the same across
    versions and which parts are subject to change.

  * Update the seed() method to use all of the bits in a string instead of just
    the hash value.  This makes better use of the seed value and assures the
    seeding is platform independent.  Issue #7889.

  * Improved the random()-->integer algorithm used in choice(), shuffle(),
    sample(), randrange(), and randint().  Formerly, it used int(n*random())
    which has a slight bias whenever n is not a power of two.  Issue #9025.

  * Improved documentation of arguments to randrange().  Issue #9379.

- collections.OrderedDict now supports a new method for repositioning keys to
  either end.

- Issue #9754: Similarly to assertRaises and assertRaisesRegexp, unittest test
  cases now also have assertWarns and assertWarnsRegexp methods to check that a
  given warning type was triggered by the code under test.

- Issue #5506: BytesIO objects now have a getbuffer() method exporting a view of
  their contents without duplicating them.  The view is both readable and
  writable.

- Issue #7566: Implement os.path.sameopenfile for Windows.

- Issue #9293: I/O streams now raise ``io.UnsupportedOperation`` when an
  unsupported operation is attempted (for example, writing to a file open only
  for reading).

- hashlib has two new constant attributes: algorithms_guaranteed and
  algorithms_avaiable that respectively list the names of hash algorithms
  guaranteed to exist in all Python implementations and the names of hash
  algorithms available in the current process.

- A new package ``concurrent.futures`` as defined by PEP 3148.

C-API
-----

- Add PyErr_SyntaxLocationEx, which supports passing a column offset.

- Issue #9834: Don't segfault in PySequence_GetSlice, PySequence_SetSlice, or
  PySequence_DelSlice when the object doesn't have any mapping operations
  defined.

Tools/Demos
-----------

- Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well as
  wide (UCS4) unicode builds for both the host interpreter (embedded inside gdb)
  and the interpreter under test.

Tests
-----

- Issue #9308: Added tests for importing encoded modules that do not
  depend on specific stdlib modules being encoded in a certain way.

- Issue #1051: Add a script (Lib/test/make_ssl_certs.py) to generate the custom
  certificate and private key files used by SSL-related certs.

- Issue #9978: Wait until subprocess completes initialization. (Win32KillTests
  in test_os)

- Issue #7110: regrtest now sends test failure reports and single-failure
  tracebacks to stderr rather than stdout.

- Issue #9628: fix runtests.sh -x option so more than one test can be excluded.

- Issue #9899: Fix test_tkinter.test_font on various platforms.  Patch by Ned
  Deily.

- Issue #9894: Do not hardcode ENOENT in test_subprocess.

- Issue #9315: Added tests for the trace module.  Patch by Eli Bendersky.

- Issue #9323: Make test.regrtest.__file__ absolute, this was not always the
  case when running profile or trace, for example.

- Issue #9568: Fix test_urllib2_localnet on OS X 10.3.

Build
-----

- Issue #10062: Allow building on platforms which do not have sem_timedwait.

- Issue #10054: Some platforms provide uintptr_t in inttypes.h.  Patch by Akira
  Kitada.

- Issue #10055: Make json C89-compliant in UCS4 mode.

- Issue #9552: Avoid unnecessary rebuild of OpenSSL. (Windows)

- Issue #1633863: Don't ignore $CC under AIX.

- Issue #9810: Compile bzip2 source files in Python's project file directly. It
  used to be built with bzip2's makefile.

- Issue #9848: Stopping trying to build _weakref in setup.py as it is a built-in
  module.

- Issue #9806: python-config now has an ``--extension-suffix`` option that
  outputs the suffix for dynamic libraries including the ABI version name
  defined by PEP 3149.

- Issue #941346: Improve the build process under AIX and allow Python to be
  built as a shared library.  Patch by Sébastien Sablé.

- Issue #4026: Make the fcntl extension build under AIX.  Patch by Sébastien
  Sablé.

- Issue #9701: The MacOSX installer can patch the shell profile to ensure that
  the "bin" directory inside the framework is on the shell's search path. This
  feature now also supports the ZSH shell.


What's New in Python 3.2 Alpha 2?
=================================

*Release date: 05-Sep-2010*

Core and Builtins
-----------------

- Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced by
  the new (and simpler) DUP_TOP_TWO.  Performance isn't changed, but our
  bytecode is a bit simplified.  Patch by Demur Rumed.

- Issue #9766: Rename poorly named variables exposed by _warnings to prevent
  confusion with the proper variables names from 'warnings' itself.

- Issue #9212: dict_keys and dict_items now provide the isdisjoint() method, to
  conform to the Set ABC.  Patch by Daniel Urban.

- Issue #9737: Fix a crash when trying to delete a slice or an item from a
  memoryview object.

- Issue #9549: sys.setdefaultencoding() and PyUnicode_SetDefaultEncoding() are
  now removed, since their effect was inexistent in 3.x (the default encoding is
  hardcoded to utf-8 and cannot be changed).

- Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
  properly.  Patch by Stefan Behnel.

- Issue #5553: The Py_LOCAL_INLINE macro now results in inlining on most
  platforms.  Previously, it inlined only when using Microsoft Visual C.

- Issue #9712: Fix tokenize on identifiers that start with non-ascii names.

- Issue #9688: __basicsize__ and __itemsize__ must be accessed as Py_ssize_t.

- Issue #9684: Added a definition for SIZEOF_WCHAR_T to PC/pyconfig.h, to match
  the pyconfig.h generated by configure on other systems.

- Issue #9666: Only catch AttributeError in hasattr(). All other exceptions that
  occur during attribute lookup are now propagated to the caller.

- Issue #8622: Add PYTHONFSENCODING environment variable to override the
  filesystem encoding.

- Issue #5127: The C functions that access the Unicode Database now accept and
  return characters from the full Unicode range, even on narrow unicode builds
  (Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL, and others).  A visible difference
  in Python is that unicodedata.numeric() now returns the correct value for
  large code points, and repr() may consider more characters as printable.

- Issue #9425: Create PyModule_GetFilenameObject() function to get the filename
  as a unicode object, instead of a byte string. Function needed to support
  unencodable filenames. Deprecate PyModule_GetFilename() in favor on the new
  function.

- Issue #8063: Call _PyGILState_Init() earlier in Py_InitializeEx().

- Issue #9612: The set object is now 64-bit clean under Windows.

- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching for
  the module file to be executed with the -m command line option.

- Issue #9599: Create PySys_FormatStdout() and PySys_FormatStderr() functions to
  write a message formatted by PyUnicode_FromFormatV() to sys.stdout and
  sys.stderr.

- Issue #9542: Create PyUnicode_FSDecoder() function, a ParseTuple converter:
  decode bytes objects to unicode using PyUnicode_DecodeFSDefaultAndSize(); str
  objects are output as-is.

- Issue #9203: Computed gotos are now enabled by default on supported compilers
  (which are detected by the configure script).  They can still be disable
  selectively by specifying --without-computed-gotos.

- Issue #9425: Create PyErr_WarnFormat() function, similar to PyErr_WarnEx() but
  use PyUnicode_FromFormatV() to format the warning message.

- Issue #8530: Prevent stringlib fastsearch from reading beyond the front of an
  array.

- Issue #5319: Print an error if flushing stdout fails at interpreter shutdown.

- Issue #9337: The str() of a float or complex number is now identical to its
  repr().

- Issue #9416: Fix some issues with complex formatting where the output with no
  type specifier failed to match the str output:

    - format(complex(-0.0, 2.0), '-') omitted the real part from the output,
    - format(complex(0.0, 2.0), '-') included a sign and parentheses.

Extension Modules
-----------------

- Issue #8013: time.asctime and time.ctime no longer call system
  asctime and ctime functions.  The year range for time.asctime is now
  1900 through maxint.  The range for time.ctime is the same as for
  time.localtime.  The string produced by these functions is longer
  than 24 characters when year is greater than 9999.

- Issue #6608: time.asctime is now checking struct tm fields its input
  before passing it to the system asctime.  Patch by MunSic Jeong.

- Issue #8734: Avoid crash in msvcrt.get_osfhandle() when an invalid file
  descriptor is provided.  Patch by Pascal Chambon.

- Issue #7736: Release the GIL around calls to opendir() and closedir() in the
  posix module.  Patch by Marcin Bachry.

- Issue #4835: make PyLong_FromSocket_t() and PyLong_AsSocket_t() private to the
  socket module, and fix the width of socket descriptors to be correctly
  detected under 64-bit Windows.

- Issue #1027206: Support IDNA in gethostbyname, gethostbyname_ex, getaddrinfo
  and gethostbyaddr.  getnameinfo is now restricted to numeric addresses as
  input.

- Issue #9214: Set operations on a KeysView or ItemsView in collections now
  correctly return a set.  Patch by Eli Bendersky.

- Issue #5737: Add Solaris-specific mnemonics in the errno module.  Patch by
  Matthew Ahrens.

- Restore GIL in nis_cat in case of error. Decode NIS data to fs encoding, using
  the surrogate error handler.

- Issue #665761: ``functools.reduce()`` will no longer mask exceptions other
  than ``TypeError`` raised by the iterator argument.

- Issue #9570: Use PEP 383 decoding in os.mknod and os.mkfifo.

- Issue #6915: Under Windows, os.listdir() didn't release the Global Interpreter
  Lock around all system calls.  Original patch by Ryan Kelly.

- Issue #8524: Add a detach() method to socket objects, so as to put the socket
  into the closed state without closing the underlying file descriptor.

- Issue #477863: Emit a ResourceWarning at shutdown if gc.garbage is not empty.

- Issue #6869: Fix a refcount problem in the _ctypes extension.

- Issue #5504: ctypes should now work with systems where mmap can't be
  PROT_WRITE and PROT_EXEC.

- Issue #9507: Named tuple repr will now automatically display the right name in
  a tuple subclass.

- Issue #9324: Add parameter validation to signal.signal on Windows in order to
  prevent crashes.

- Issue #9526: Remove some outdated (int) casts that were preventing the array
  module from working correctly with arrays of more than 2**31 elements.

- Fix memory leak in ssl._ssl._test_decode_cert.

- Issue #8065: Fix memory leak in readline module (from failure to free the
  result of history_get_history_state()).

- Issue #9450: Fix memory leak in readline.replace_history_item and
  readline.remove_history_item for readline version >= 5.0.

- Issue #8105: Validate file descriptor passed to mmap.mmap on Windows.

- Issue #8046: Add context manager protocol support and .closed property to mmap
  objects.

Library
-------

- Issue #7451: Improve decoding performance of JSON objects, and reduce the
  memory consumption of said decoded objects when they use the same strings as
  keys.

- Issue #1100562: Fix deep-copying of objects derived from the list and dict
  types.  Patch by Michele Orrù and Björn Lindqvist.

- Issue #9753: Fixed socket.dup, which did not always work correctly on Windows.

- Issue #9421: Made the get<type> methods consistently accept the vars and
  default arguments on all parser classes.

- Issue #7005: Fixed output of None values for RawConfigParser.write and
  ConfigParser.write.

- Issue #8990: array.fromstring() and array.tostring() get renamed to
  frombytes() and tobytes(), respectively, to avoid confusion.  Furthermore,
  array.frombytes(), array.extend() as well as the array.array() constructor now
  accept bytearray objects.  Patch by Thomas Jollans.

- Issue #808164: Fixed socket.close to avoid references to globals, to avoid
  issues when socket.close is called from a __del__ method.

- Issue #9706: ssl module provides a better error handling in various
  circumstances.

- Issue #1868: Eliminate subtle timing issues in thread-local objects by getting
  rid of the cached copy of thread-local attribute dictionary.

- Issue #1512791: In setframerate() in the wave module, non-integral frame rates
  are rounded to the nearest integer.

- Issue #8797: urllib2 does a retry for Basic Authentication failure instead of
  falling into recursion.

- Issue #1194222: email.utils.parsedate now returns RFC2822 compliant four
  character years even if the message contains RFC822 two character years.

- Issue #8750: Fixed MutableSet's methods to correctly handle reflexive
  operations on its self, namely x -= x and x ^= x.

- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing error
  handling when accepting a new connection.

- Issue #9601: ftplib now provides a workaround for non-compliant
  implementations such as IIS shipped with Windows server 2003 returning invalid
  response codes for MKD and PWD commands.

- Issue #658749: asyncore's connect() method now correctly interprets winsock
  errors.

- Issue #9501: Fixed logging regressions in cleanup code.

- Fix functools.total_ordering() to skip methods inherited from object.

- Issue #9572: Importlib should not raise an exception if a directory it thought
  it needed to create was done concurrently by another process.

- Issue #9617: Signals received during a low-level write operation aren't
  ignored by the buffered IO layer anymore.

- Issue #843590: Make "macintosh" an alias to the "mac_roman" encoding.

- Create os.fsdecode(): decode from the filesystem encoding with surrogateescape
  error handler, or strict error handler on Windows.

- Issue #3488: Provide convenient shorthand functions ``gzip.compress`` and
  ``gzip.decompress``.  Original patch by Anand B. Pillai.

- Issue #8807: poplib.POP3_SSL class now accepts a context parameter, which is a
  ssl.SSLContext object allowing bundling SSL configuration options,
  certificates and private keys into a single (potentially long-lived)
  structure.

- Issue #8866: parameters passed to socket.getaddrinfo can now be specified as
  single keyword arguments.

- Address XXX comment in dis.py by having inspect.py prefer to reuse the dis.py
  compiler flag values over defining its own.

- Issue #9147: Added dis.code_info() which is similar to show_code() but returns
  formatted code information in a string rather than displaying on screen.

- Issue #9567: functools.update_wrapper now adds a __wrapped__ attribute
  pointing to the original callable.

- Issue #3445: functools.update_wrapper now tolerates missing attributes on
  wrapped callables.

- Issue #5867: Add abc.abstractclassmethod and abc.abstractstaticmethod.

- Issue #9605: posix.getlogin() decodes the username with file filesystem
  encoding and surrogateescape error handler. Patch written by David Watson.

- Issue #9604: posix.initgroups() encodes the username using the fileystem
  encoding and surrogateescape error handler. Patch written by David Watson.

- Issue #9603: posix.ttyname() and posix.ctermid() decode the terminal name
  using the filesystem encoding and surrogateescape error handler. Patch written
  by David Watson.

- Issue #7647: The posix module now has the ST_RDONLY and ST_NOSUID constants,
  for use with the statvfs() function.  Patch by Adam Jackson.

- Issue #8688: MANIFEST files created by distutils now include a magic comment
  indicating they are generated.  Manually maintained MANIFESTs without this
  marker will not be overwritten or removed.

- Issue #7467: when reading a file from a ZIP archive, its CRC is checked and a
  BadZipfile error is raised if it doesn't match (as used to be the case in
  Python 2.5 and earlier).

- Issue #9550: a BufferedReader could issue an additional read when the original
  read request had been satisfied, which could block indefinitely when the
  underlying raw IO channel was e.g. a socket.  Report and original patch by
  Jason V. Miller.

- Issue #3757: thread-local objects now support cyclic garbage collection.
  Thread-local objects involved in reference cycles will be deallocated timely
  by the cyclic GC, even if the underlying thread is still running.

- Issue #9452: Add read_file, read_string, and read_dict to the configparser
  API; new source attribute to exceptions.

- Issue #6231: Fix xml.etree.ElementInclude to include the tail of the current
  node.

- Issue #8047: Fix the xml.etree serializer to return bytes by default.  Use
  ``encoding="unicode"`` to generate a Unicode string.

- Issue #8280: urllib2's Request method will remove fragments in the url.  This
  is how it is supposed to work, wget and curl do the same.  Previous behavior
  was wrong.

- Issue #6683: For SMTP logins we now try all authentication methods advertised
  by the server.  Many servers are buggy and advertise authentication methods
  they do not support in reality.

- Issue #8814: function annotations (the ``__annotations__`` attribute) are now
  included in the set of attributes copied by default by functools.wraps and
  functools.update_wrapper.  Patch by Terrence Cole.

- Issue #2944: asyncore doesn't handle connection refused correctly.

- Issue #4184: Private attributes on smtpd.SMTPChannel made public and deprecate
  the private attributes. Add tests for smtpd module.

- Issue #3196: email header decoding is now forgiving if an RFC2047 encoded word
  encoded in base64 is lacking padding.

- Issue #9444: Argparse now uses the first element of prefix_chars as the option
  character for the added 'h/help' option if prefix_chars does not contain a
  '-', instead of raising an error.

- Issue #7372: Fix pstats regression when stripping paths from profile data
  generated with the profile module.

- Issue #9428: Fix running scripts with the profile/cProfile modules from the
  command line.

- Issue #7781: Fix restricting stats by entry counts in the pstats interactive
  browser.

- Issue #9209: Do not crash in the pstats interactive browser on invalid regular
  expressions.

- Update collections.OrderedDict to match the implementation in Py2.7 (based on
  lists instead of weakly referenced Link objects).

- Issue #8397: Raise an error when attempting to mix iteration and regular reads
  on a BZ2File object, rather than returning incorrect results.

- Issue #9448: Fix a leak of OS resources (mutexes or semaphores) when
  re-initializing a buffered IO object by calling its ``__init__`` method.

- Issue #1713: Fix os.path.ismount(), which returned true for symbolic links
  across devices.

- Issue #8826: Properly load old-style "expires" attribute in http.cookies.

- Issue #1690103: Fix initial namespace for code run with trace.main().

- Issue #7395: Fix tracebacks in pstats interactive browser.

- Issue #8230: Fix Lib/test/sortperf.py.

- Issue #8620: when a cmd.Cmd() is fed input that reaches EOF without a final
  newline, it no longer truncates the last character of the last command line.

- Issue #5146: Handle UID THREAD command correctly in imaplib.

- Issue #5147: Fix the header generated for cookie files written by
  http.cookiejar.MozillaCookieJar.

- Issue #8198: In pydoc, output all help text to the correct stream when
  sys.stdout is reassigned.

- Issue #7909: Do not touch paths with the special prefixes ``\\.\`` or ``\\?\``
  in ntpath.normpath().

- Issue #1286: Allow using fileinput.FileInput as a context manager.

- Add lru_cache() decorator to the functools module.

Tools/Demos
-----------

- Fix ``Tools/scripts/checkpyc.py`` after PEP 3147.

- Issue #8867: Fix ``Tools/scripts/serve.py`` to work with files containing
  non-ASCII content.

Tests
-----

- Issue #9601: Provide a test case for ftplib.parse257.

- Issue #8857: Provide a test case for socket.getaddrinfo.

- Issue #7564: Skip test_ioctl if another process is attached to /dev/tty.

- Issue #8433: Fix test_curses failure with newer versions of ncurses.

- Issue #9496: Provide a test suite for the rlcompleter module.  Patch by
  Michele Orrù.

- Issue #8687: provide a test suite for sched.py module.

Build
-----

- Issue #1303434: Generate ZIP file containing all PDBs.

- Issue #9193: PEP 3149 is accepted.

- Issue #3101: Helper functions _add_one_to_index_C() and _add_one_to_index_F()
  become _Py_add_one_to_index_C() and _Py_add_one_to_index_F(), respectively.

- Issue #9700: define HAVE_BROKEN_POSIX_SEMAPHORES under AIX 6.x.  Patch by
  Sébastien Sablé.

- Don't run pgen twice when using make -j.


What's New in Python 3.2 Alpha 1?
=================================

*Release date: 01-Aug-2010*

Core and Builtins
-----------------

- Issue #8991: convertbuffer() rejects discontigious buffers.

- Issue #7616: Fix copying of overlapping memoryview slices with the Intel
  compiler.

- Issue #8413: structsequence now subclasses tuple.

- Issue #8271: during the decoding of an invalid UTF-8 byte sequence, only the
  start byte and the continuation byte(s) are now considered invalid, instead of
  the number of bytes specified by the start byte.  E.g.:
  '\xf1\x80AB'.decode('utf-8', 'replace') now returns u'\ufffdAB' and replaces
  with U+FFFD only the start byte ('\xf1') and the continuation byte ('\x80')
  even if '\xf1' is the start byte of a 4-bytes sequence.  Previous versions
  returned a single u'\ufffd'.

- Issue #9011: A negated imaginary literal (e.g., "-7j") now has real part -0.0
  rather than 0.0.  So "-7j" is now exactly equivalent to "-(7j)".

- Be more specific in error messages about positional arguments.

- Issue #8949: "z" format of PyArg_Parse*() functions doesn't accept bytes
  objects, as described in the documentation.

- Issue #6543: Write the traceback in the terminal encoding instead of utf-8.
  Fix the encoding of the modules filename.  Patch written by Amaury Forgeot
  d'Arc.

- Issue #9011: Remove buggy and unnecessary (in 3.x) ST->AST compilation code
  dealing with unary minus applied to a constant.  The removed code was mutating
  the ST, causing a second compilation to fail.

- Issue #850997: mbcs encoding (Windows only) handles errors argument: strict
  mode raises unicode errors.  The encoder only supports "strict" and "replace"
  error handlers, the decoder only supports "strict" and "ignore" error
  handlers.  Patch written by Mark Hammond.

- Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
  "w*" format instead. Add tests for "w*" format.

- Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
  formats if the string contains a null byte/character.  Write unit tests for
  string formats.

- Issue #7490: To facilitate sharing of doctests between 2.x and 3.x test
  suites, the IGNORE_EXCEPTION_DETAIL directive now also ignores the module
  location of the raised exception.

- Issue #8969: On Windows, use mbcs codec in strict mode to encode and decode
  filenames and enable os.fsencode().

- Issue #9058: Remove assertions about INT_MAX in UnicodeDecodeError.

- Issue #8941: Decoding big endian UTF-32 data in UCS-2 builds could crash the
  interpreter with characters outside the Basic Multilingual Plane (higher than
  0x10000).

- Issue #8950: (See also issue #5080).  Py_ArgParse*() functions now raise
  TypeError instead of giving a DeprecationWarning when a float is parsed using
  the 'L' code (for long long).  (All other integer codes already raise
  TypeError in this case.)

- Issue #8922: Normalize the encoding name in PyUnicode_AsEncodedString() to
  enable shortcuts for upper case encoding name. Add also a shortcut for
  "iso-8859-1" in PyUnicode_AsEncodedString() and PyUnicode_Decode().

- Issue #8838: Remove codecs.charbuffer_encode() function.  The buffer protocol
  doesn't support "char buffer" anymore in Python 3.

- Issue #8339: Remove "t#" format of PyArg_Parse*() functions, use "s#" or "s*"
  instead.  codecs.charbuffer_encode() now accepts modifiable buffer objects
  like bytearray.

- Issue #8837: Remove "O?" format of PyArg_Parse*() functions.  The format is no
  used anymore and it was never documented.

- In str.format(), raise a ValueError when indexes to arguments are too large.

- Issue #2844: Make int('42', n) consistently raise ValueError for invalid
  integers n (including n = -909).

- Issue #8188: Introduce a new scheme for computing hashes of numbers (instances
  of int, float, complex, decimal.Decimal and fractions.Fraction) that makes it
  easy to maintain the invariant that hash(x) == hash(y) whenever x and y have
  equal value.

- Issue #8748: Fix two issues with comparisons between complex and integer
  objects.  (1) The comparison could incorrectly return True in some cases
  (2**53+1 == complex(2**53) == 2**53), breaking transitivity of equality.
  (2) The comparison raised an OverflowError for large integers, leading to
  unpredictable exceptions when combining integers and complex objects in sets
  or dicts.

- Issue #8766: Initialize _warnings module before importing the first module.
  Fix a crash if an empty directory called "encodings" exists in sys.path.

- Issue #8589: Decode PYTHONWARNINGS environment variable with the file system
  encoding and surrogateescape error handler instead of the locale encoding to
  be consistent with os.environ.  Add PySys_AddWarnOptionUnicode() function.

- PyObject_Dump() encodes unicode objects to utf8 with backslashreplace (instead
  of strict) error handler to escape surrogates.

- Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
  object to Py_FileSystemDefaultEncoding with the "surrogateescape" error
  handler, and return bytes.  If Py_FileSystemDefaultEncoding is not set, fall
  back to UTF-8.

- Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any
  error handler, not only the default error handler (strict).

- Issue #8610: Load file system codec at startup, and display a fatal error on
  failure.  Set the file system encoding to utf-8 (instead of None) if getting
  the locale encoding failed, or if nl_langinfo(CODESET) function is missing.

- PyFile_FromFd() uses PyUnicode_DecodeFSDefault() instead of
  PyUnicode_FromString() to support surrogates in the filename and use the right
  encoding.

- Issue #7507: Quote "!" in pipes.quote(); it is special to some shells.

- PyUnicode_DecodeFSDefaultAndSize() uses surrogateescape error handler.

- Issue #8419: Prevent the dict constructor from accepting non-string keyword
  arguments.

- Issue #8124: PySys_WriteStdout() and PySys_WriteStderr() don't execute
  indirectly Python signal handlers anymore because mywrite() ignores exceptions
  (KeyboardInterrupt).

- Issue #8092: Fix PyUnicode_EncodeUTF8() to support error handler producing
  unicode string (eg. backslashreplace).

- Issue #8485: PyUnicode_FSConverter() doesn't accept byteearray objects
  anymore, you have to convert your bytearray filenames to bytes.

- Issue #7332: Remove the 16KB stack-based buffer in
  PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable benefit
  compared to the dynamic memory allocation fallback.  Patch by Charles-François
  Natali.

- Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is
  passed to bytes or bytearray.

- Issue #7301: Add environment variable $PYTHONWARNINGS.

- Issue #8329: Don't return the same lists from select.select when no fds are
  changed.

- Issue #8259: 1L << (2**31) no longer produces an 'outrageous shift error' on
  64-bit machines.  The shift count for either left or right shift is permitted
  to be up to sys.maxsize.

- Ensure that tokenization of identifiers is not affected by locale.

- Issue #1222585: Added LDCXXSHARED for C++ support. Patch by Arfrever.

- Raise a TypeError when trying to delete a T_STRING_INPLACE struct member.

- Issue #8211: Save/restore CFLAGS around AC_PROG_CC in configure.in, in case it
  is set.

- Issue #8226: sys.setfilesystemencoding() raises a LookupError if the encoding
  is unknown.

- Issue #1583863: A str subclass can now override the __str__ method.

- Issue #8014: Setting a T_UINT or T_PYSSIZET attribute of an object with
  PyMemberDefs could produce an internal error; raise TypeError instead.

- Issue #7845: Rich comparison methods on the complex type now return
  NotImplemented rather than raising a TypeError when comparing with an
  incompatible type; this allows user-defined classes to implement their own
  comparisons with complex.

- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
  (SIGINT). If an error occurs while importing the site module, the error is
  printed and Python exits. Initialize the GIL before importing the site module.

- Issue #7173: Generator finalization could invalidate sys.exc_info().

- Issue #7544: Preallocate thread memory before creating the thread to avoid a
  fatal error in low memory condition.

- Issue #7820: The parser tokenizer restores all bytes in the right if the BOM
  check fails.

- Handle errors from looking up __prepare__ correctly.

- Issue #5939: Add additional runtime checking to ensure a valid capsule in
  Modules/_ctypes/callproc.c.

- Issue #7309: Fix unchecked attribute access when converting
  UnicodeEncodeError, UnicodeDecodeError, and UnicodeTranslateError to strings.

- Issue #6902: Fix problem with built-in types format incorrectly with 0
  padding.

- Issue #7988: Fix default alignment to be right aligned for complex.__format__.
  Now it matches other numeric types.

- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
  PyOS_ascii_strtod, and PyOS_ascii_atof.  Use PyOS_double_to_string and
  PyOS_string_to_double instead.  See issue #5835 for the original deprecations.

- Issue #7385: Fix a crash in `MemoryView_FromObject` when `PyObject_GetBuffer`
  fails.  Patch by Florent Xicluna.

- Issue #7788: Fix an interpreter crash produced by deleting a list slice with
  very large step value.

- Issue #7766: Change sys.getwindowsversion() return value to a named tuple and
  add the additional members returned in an OSVERSIONINFOEX structure.  The new
  members are service_pack_major, service_pack_minor, suite_mask, and
  product_type.

- Issue #7561: Operations on empty bytearrays (such as `int(bytearray())`) could
  crash in many places because of the PyByteArray_AS_STRING() macro returning
  NULL.  The macro now returns a statically allocated empty string instead.

- Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
  where the right hand operand is a set of constants, by turning the set into a
  frozenset and pre-building it as a constant.  The comparison operation is made
  against the constant instead of building a new set each time it is executed (a
  similar optimization already existed which turned a list of constants into a
  pre-built tuple).  Patch and additional tests by Dave Malcolm.

- Issue #7622: Improve the split(), rsplit(), splitlines() and replace() methods
  of bytes, bytearray and unicode objects by using a common implementation based
  on stringlib's fast search.  Patch by Florent Xicluna.

- Issue #7632: Fix various str -> float conversion bugs present in 2.7 alpha 2,
  including: (1) a serious 'wrong output' bug that could occur for long (> 40
  digit) input strings, (2) a crash in dtoa.c that occurred in debug builds when
  parsing certain long numeric strings corresponding to subnormal values, (3) a
  memory leak for some values large enough to cause overflow, and (4) a number
  of flaws that could lead to incorrectly rounded results.

- The __complex__ method is now looked up on the class of instances to make it
  consistent with other special methods.

- Issue #7462: Implement the stringlib fast search algorithm for the `rfind`,
  `rindex`, `rsplit` and `rpartition` methods.  Patch by Florent Xicluna.

- Issue #7604: Deleting an unset slotted attribute did not raise an
  AttributeError.

- Issue #7534: Fix handling of IEEE specials (infinities, nans, negative zero)
  in ** operator.  The behaviour now conforms to that described in C99 Annex F.

- Issue #1811: improve accuracy and cross-platform consistency for true division
  of integers: the result of a/b is now correctly rounded for ints a and b (at
  least on IEEE 754 platforms), and in particular does not depend on the
  internal representation of an int.

- Issue #6834: replace the implementation for the 'python' and 'pythonw'
  executables on OSX.

  These executables now work properly with the arch(1) command: ``arch -ppc
  python`` will start a universal binary version of python in PPC mode (unlike
  previous releases).

- Issue #7466: Segmentation fault when the garbage collector is called in the
  middle of populating a tuple.  Patch by Florent Xicluna.

- Issue #7419: setlocale() could crash the interpreter on Windows when called
  with invalid values.

- Issue #6077: On Windows, files opened with tempfile.TemporaryFile in "wt+"
  mode would appear truncated on the first '0x1a' byte (aka. Ctrl+Z).

- Issue #7085: Fix crash when importing some extensions in a thread on MacOSX
  10.6.

- Issue #1757126: Fix the cyrillic-asian alias for the ptcp154 encoding.

- Issue #6970: Remove redundant calls when comparing objects that don't
  implement the relevant rich comparison methods.

- Issue #7298: Fixes for range and reversed(range(...)).  Iteration over
  range(a, b, c) incorrectly gave an empty iterator when a, b and c fit in C
  long but the length of the range did not.  Also fix several cases where
  reversed(range(a, b, c)) gave wrong results, and fix a refleak for
  reversed(range(a, b, c)) with large arguments.

- Issue #7244: itertools.izip_longest() no longer ignores exceptions raised
  during the formation of an output tuple.

- Issue #3297: On wide unicode builds, do not split unicode characters into
  surrogates.

- Remove length limitation when constructing a complex number from a string.

- Issue #1087418: Boost performance of bitwise operations for longs.

- Support for AtheOS has been completely removed from the code base. It was
  disabled since Python 3.0.

- Support for several legacy threading libraries has been disabled. These
  libraries are: Mach C threads, SunOS LWP, GNU pth, Irix threads. Support code
  will be entirely removed in 3.3.

- Support for OSF* has been disabled. If nobody stands up, support will be
  removed in 3.3. See <http://bugs.python.org/issue8606>.

- Peephole constant folding had missed UNARY_POSITIVE.

- Issue #1722344: threading._shutdown() is now called in Py_Finalize(), which
  fixes the problem of some exceptions being thrown at shutdown when the
  interpreter is killed. Patch by Adam Olsen.

- Issue #7147: Remove support for compiling Python without complex number
  support.

- Issue #7120: logging: Removed import of multiprocessing which is causing crash
  in GAE.

- Issue #1754094: Improve the stack depth calculation in the compiler.  There
  should be no other effect than a small decrease in memory use.  Patch by
  Christopher Tur Lesniewski-Laas.

- Issue #7065: Fix a crash in bytes.maketrans and bytearray.maketrans when using
  byte values greater than 127.  Patch by Derk Drukker.

- Issue #1571184: The Unicode database contains properties for more characters.
  The tables for code points representing numeric values, white spaces or line
  breaks are now generated from the official Unicode Character Database files,
  and include information from the Unihan.txt file.

- Issue #7019: Raise ValueError when unmarshalling bad long data, instead of
  producing internally inconsistent Python longs.

- Issue #6990: Fix threading.local subclasses leaving old state around after a
  reference cycle GC which could be recycled by new locals.

- Issue #5460: Fix an ambiguity in the grammar.

- Issue #1766304: Improve performance of membership tests on range objects.

- Issue #6713: Improve performance of integer -> string conversions.

- Issue #6846: Fix bug where bytearray.pop() returns negative integers.

- Issue #6750: A text file opened with io.open() could duplicate its output when
  writing from multiple threads at the same time.

- Issue #6707: dir() on an uninitialized module caused a crash.

- Issue #6540: Fixed crash for bytearray.translate() with invalid parameters.

- Issue #6573: set.union() stopped processing inputs if an instance of self
  occurred in the argument chain.

- Issue #6070: On posix platforms import no longer copies the execute bit from
  the .py file to the .pyc file if it is set.

- Issue #1616979: Added the cp720 (Arabic DOS) encoding.

- Issue #6428: Since Python 3.0, the __bool__ method must return a bool object,
  and not an int.  Fix the corresponding error message, and the documentation.

- The deprecated PyCObject has been removed.

- Issue #6347: Include inttypes.h as well as stdint.h in pyport.h.  This fixes a
  build failure on HP-UX: int32_t and uint32_t are defined in inttypes.h instead
  of stdint.h on that platform.

- Issue #6373: Fixed a SystemError when encoding with the latin-1 codec and the
  'surrogateescape' error handler, a string which contains unpaired surrogates.

- Issue #4856: Remove checks for win NT.

- Issue #6687: PyBytes_FromObject() no longer accepts an integer as its argument
  to construct a null-initialized bytes object.

- Issue #1023290: Add from_bytes() and to_bytes() methods to integers.  These
  methods allow the conversion of integers to bytes, and vice-versa.

- Issue #7382: Fix bug in bytes.__getnewargs__ that prevented bytes instances
  from being copied with copy.copy(), and bytes subclasses from being pickled
  properly.

- Code objects now support weak references.

- Issue #7072: isspace(0xa0) is true on Mac OS X.

- Issue #8084: PEP 370 now conforms to system conventions for framework builds
  on MacOS X. That is, "python setup.py install --user" will install into
  "~/Library/Python/2.7" instead of "~/.local".

C-API
-----

- Issue #2443: A new macro, `Py_VA_COPY`, copies the state of the
  variable argument list.  `Py_VA_COPY` is equivalent to C99
  `va_copy`, but available on all python platforms.

- PySlice_GetIndicesEx now clips the step to [-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX]
  instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX].  This makes it safe to do
  "step = -step" when reversing a slice.

- Issue #5753: A new C API function, `PySys_SetArgvEx`, allows embedders of the
  interpreter to set sys.argv without also modifying sys.path.  This helps fix
  `CVE-2008-5983
  <http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_.

- Add PyArg_ValidateKeywordArguments, which checks if all keyword arguments are
  strings in an efficient manner.

- Issue #8276: PyEval_CallObject() is now only available in macro form.  The
  function declaration, which was kept for backwards compatibility reasons, is
  now removed (the macro was introduced in 1997!).

- Issue #7767: New function PyLong_AsLongLongAndOverflow added, analogous to
  PyLong_AsLongAndOverflow.

- Make PyUnicode_CompareWithASCIIString return not equal if the Python string
  has '\0' at the end.

- Issue #5080: The argument parsing functions PyArg_ParseTuple,
  PyArg_ParseTupleAndKeywords, PyArg_VaParse, PyArg_VaParseTupleAndKeywords and
  PyArg_Parse now raise a DeprecationWarning for float arguments passed with the
  'L' format code.  This will become a TypeError in a future version of Python,
  to match the behaviour of the other integer format codes.

- Issue #7033: Function ``PyErr_NewExceptionWithDoc()`` added.

- Issue #7414: 'C' code wasn't being skipped properly (for keyword arguments) in
  PyArg_ParseTupleAndKeywords.

- Issue #7228: Add '%lld' and '%llu' support to PyString_FromFormat(V) and
  PyErr_Format, on machines with HAVE_LONG_LONG defined.

- Issue #6151: Made PyDescr_COMMON conform to standard C (like PyObject_HEAD in
  PEP 3123).  The PyDescr_TYPE and PyDescr_NAME macros should be should used for
  accessing the d_type and d_name members of structures using PyDescr_COMMON.

- Issue #6405: Remove duplicate type declarations in descrobject.h.

- The code flags for old __future__ features are now available again.

- Issue #5954: Add a PyFrame_GetLineNumber() function to replace most uses of
  PyCode_Addr2Line().

- Issue #5959: Add a PyCode_NewEmpty() function to create a new empty code
  object at a specified file, function, and line number.

- Issue #1419652: Change the first argument to PyImport_AppendInittab() to
  ``const char *`` as the string is stored beyond the call.

- Issue #2422: When compiled with the ``--with-valgrind`` option, the pymalloc
  allocator will be automatically disabled when running under Valgrind.  This
  gives improved memory leak detection when running under Valgrind, while taking
  advantage of pymalloc at other times.

Library
-------

- In pdb, when Ctrl-C is entered while defining commands for a breakpoint, the
  old commands are restored.

- For traceback debugging, the pdb listing now also shows the locations where
  the exception was originally (re)raised, if it differs from the last line
  executed (e.g. in case of finally clauses).

- The pdb command "source" has been added.  It displays the source code for a
  given object, if possible.

- The pdb command "longlist" has been added.  It displays the whole source code
  for the current function.

- Issue #1503502: Make pdb.Pdb easier to subclass by putting message and error
  output into methods.

- Issue #809887: Make the output of pdb's breakpoint deletions more consistent;
  emit a message when a breakpoint is enabled or disabled.

- Issue #5294: Fix the behavior of pdb's "continue" command when called in the
  top-level debugged frame.

- Issue #5727: Restore the ability to use readline when calling into pdb in
  doctests.

- Issue #6719: In pdb, do not stop somewhere in the encodings machinery if the
  source file to be debugged is in a non-builtin encoding.

- Issue #8048: Prevent doctests from failing when sys.displayhook has been
  reassigned.

- Issue #8015: In pdb, do not crash when an empty line is entered as a
  breakpoint command.

- In pdb, allow giving a line number to the "until" command.

- Issue #1437051: For pdb, allow "continue" and related commands in .pdbrc
  files.  Also, add a command-line option "-c" that runs a command as if given
  in .pdbrc.

- Issue #4179: In pdb, allow "list ." as a command to return to the currently
  debugged line.

- Issue #4108: In urllib.robotparser, if there are multiple ``User-agent: *``
  entries, consider the first one.

- Issue #6630: Allow customizing regex flags when subclassing the
  string.Template class.

- Issue #9411: Allow specifying an encoding for config files in the configparser
  module.

- Issue #1682942: Improvements to configparser: support alternate delimiters,
  alternate comment prefixes and empty lines in values.

- Issue #9354: Provide getsockopt() in asyncore's file_wrapper.

- Issue #8966: ctypes: Remove implicit bytes-unicode conversion.

- Issue #9378: python -m pickle <pickle file> will now load and display the
  first object in the pickle file.

- Issue #4770: Restrict binascii module to accept only bytes (as specified).
  And fix the email package to encode to ASCII instead of ``raw-unicode-escape``
  before ASCII-to-binary decoding.

- Issue #9384: ``python -m tkinter`` will now display a simple demo applet.

- The default size of the re module's compiled regular expression cache has been
  increased from 100 to 500 and the cache replacement policy has changed from
  simply clearing the entire cache on overflow to forgetting the least recently
  used cached compiled regular expressions.  This is a performance win for
  applications that use a lot of regular expressions and limits the impact of
  the performance hit anytime the cache is exceeded.

- Issue #7113: Speed up loading in configparser. Patch by Łukasz Langa.

- Issue #9032: XML-RPC client retries the request on EPIPE error.  The EPIPE
  error occurs when the server closes the socket and the client sends a big
  XML-RPC request.

- Issue #4629: getopt raises an error if an argument ends with "=", whereas
  getopt doesn't accept a value (eg. --help= is rejected if getopt uses
  ['help='] long options).

- Issue #7989: Added pure python implementation of the `datetime` module.  The C
  module is renamed to `_datetime` and if available, overrides all classes
  defined in datetime with fast C impementation.  Python implementation is based
  on the original python prototype for the datetime module by Tim Peters with
  minor modifications by the PyPy project.  The test suite now tests `datetime`
  module with and without `_datetime` acceleration using the same test cases.

- Issue #7895: platform.mac_ver() no longer crashes after calling os.fork().

- Issue #9323: Fixed a bug in trace.py that resulted in loosing the name of the
  script being traced.  Patch by Eli Bendersky.

- Issue #9282: Fixed --listfuncs option of trace.py.  Thanks Eli Bendersky for
  the patch.

- Issue #3704: http.cookiejar was not properly handling URLs with a / in the
  parameters.

- Issue #9268: ``pickletools.dis()`` now has an optional *annotate* argument
  which controls printing of opcode descriptions in ``dis()`` output.

- Issue #1555570: email no longer inserts extra blank lines when a \r\n combo
  crosses an 8192 byte boundary.

- Issue #9243: Fix sndhdr module and add unit tests, contributed by James Lee.

- ``ast.literal_eval()`` now allows byte literals.

- Issue #9137: Fix issue in MutableMapping.update, which incorrectly treated
  keyword arguments called 'self' or 'other' specially.

- ``ast.literal_eval()`` now allows set literals.

- Issue #9164: Ensure that sysconfig handles duplicate -arch flags in CFLAGS.

- Issue #7646: The fnmatch pattern cache no longer grows without bound.

- Issue #9136: Fix 'dictionary changed size during iteration' RuntimeError
  produced when profiling the decimal module.  This was due to a dangerous
  iteration over 'locals()' in Context.__init__.

- Fix extreme speed issue in Decimal.pow when the base is an exact power of 10
  and the exponent is tiny (for example, ``Decimal(10) **
  Decimal('1e-999999999')``).

- Issue #9186: Fix math.log1p(-1.0) to raise ValueError, not OverflowError.

- Issue #9130: Fix validation of relative imports in parser module.

- Issue #9128: Fix validation of class decorators in parser module.

- Issue #9094: python -m pickletools will now disassemble pickle files listed in
  the command line arguments.  See output of python -m pickletools -h for more
  details.

- Issue #5468: urlencode to handle bytes type and other encodings in its query
  parameter. Patch by Dan Mahn.

- Issue #7673: Fix security vulnerability (CVE-2010-2089) in the audioop module,
  ensure that the input string length is a multiple of the frame size.

- Issue #6507: Accept source strings in dis.dis().  Original patch by Daniel
  Urban.

- Issue #7829: Clearly document that the dis module is exposing an
  implementation detail that is not stable between Python VMs or releases.

- Issue #6589: cleanup asyncore.socket_map in case smtpd.SMTPServer constructor
  raises an exception.

- Issue #9110: Addition of ContextDecorator to contextlib, for creating APIs
  that act as both context managers and decorators. contextmanager changes to
  use ContextDecorator.

- Implement importlib.abc.SourceLoader and deprecate PyLoader and PyPycLoader
  for removal in Python 3.4.

- Issue #9064: pdb's "up" and "down" commands now accept an optional argument
  giving the number of frames to go.

- Issue #9018: os.path.normcase() now raises a TypeError if the argument is not
  ``str`` or ``bytes``.

- Issue #9075: In the ssl module, remove the setting of a ``debug`` flag on an
  OpenSSL structure.

- Issue #8682: The ssl module now temporary increments the reference count of a
  socket object got through ``PyWeakref_GetObject``, so as to avoid possible
  deallocation while the object is still being used.

- Issue #1368368: FancyURLOpener class changed to throw an Exception on wrong
  password instead of presenting an interactive prompt.  Older behavior can be
  obtained by passing retry=True to http_error_xxx methods of FancyURLOpener.

- Issue #8720: Fix regression caused by fix for #4050 by making getsourcefile
  smart enough to find source files in the linecache.

- Issue #5610: feedparser no longer eats extra characters at the end of a body
  part if the body part ends with a ``\r\n``.

- Issue #8986: math.erfc was incorrectly raising OverflowError for values
  between -27.3 and -30.0 on some platforms.

- Issue #8784: Set tarfile default encoding to 'utf-8' on Windows.

- Issue #8966: If a ctypes structure field is an array of c_char, convert its
  value to bytes instead of str (as done for c_char and c_char_p).

- Issue #8188: Comparisons between Decimal and Fraction objects are now
  permitted, returning a result based on the exact numerical values of the
  operands.  This builds on issue #2531, which allowed Decimal-to-float
  comparisons; all comparisons involving numeric types (bool, int, float,
  complex, Decimal, Fraction) should now act as expected.

- Issue #8897: Fix sunau module, use bytes to write the header. Patch written by
  Thomas Jollans.

- Issue #8899: time.struct_time now has class and attribute docstrings.

- Issue #6470: Drop UNC prefix in FixTk.

- Issue #4768: base64 encoded email body parts were incorrectly stored as binary
  strings.  They are now correctly converted to strings.

- Issue #8833: tarfile created hard link entries with a size field != 0 by
  mistake.

- Charset.body_encode now correctly handles base64 encoding by encoding with the
  output_charset before calling base64mime.encode.  Passes the tests from 2.x
  issue #1368247.

- Issue #8845: sqlite3 Connection objects now have a read-only in_transaction
  attribute that is True iff there are uncommitted changes.

- Issue #1289118: datetime.timedelta objects can now be multiplied by float and
  divided by float and int objects.  Results are rounded to the nearest multiple
  of timedelta.resolution with ties resolved using round-half-to-even method.

- Issue #7150: Raise OverflowError if the result of adding or subtracting
  timedelta from date or datetime falls outside of the MINYEAR:MAXYEAR range.

- Issue #8806: add SSL contexts support to ftplib.

- Issue #4769: Fix main() function of the base64 module, use sys.stdin.buffer
  and sys.stdout.buffer (instead of sys.stdin and sys.stdout) to use the bytes
  API.

- Issue #8770: Now sysconfig displays information when it's called as a script.
  Initial idea by Sridhar Ratnakumar.

- Issue #6662: Fix parsing of malformatted charref (&#bad;), patch written by
  Fredrik Håård.

- Issue #8540: Decimal module: rename the Context._clamp attribute to
  Context.clamp and make it public.  This is useful in creating contexts that
  correspond to the decimal interchange formats specified in IEEE 754.

- Issue #6268: Fix seek() method of codecs.open(), don't read or write the BOM
  twice after seek(0). Fix also reset() method of codecs, UTF-16, UTF-32 and
  StreamWriter classes.

- Issue #3798: sys.exit(message) writes the message to sys.stderr file, instead
  of the C file stderr, to use stderr encoding and error handler.

- Issue #8782: Add a trailing newline in linecache.updatecache to the last line
  of files without one.

- Issue #8729: Return NotImplemented from collections.Mapping.__eq__ when
  comparing to a non-mapping.

- Issue #8774: tabnanny uses the encoding cookie (#coding:...) to use the
  correct encoding.

- Issue #4870: Add an `options` attribute to SSL contexts, as well as several
  ``OP_*`` constants to the `ssl` module.  This allows to selectively disable
  protocol versions, when used in combination with `PROTOCOL_SSLv23`.

- Issue #8759: Fixed user paths in sysconfig for posix and os2 schemes.

- Issue #8663: distutils.log emulates backslashreplace error handler. Fix
  compilation in a non-ASCII directory if stdout encoding is ASCII (eg. if
  stdout is not a TTY).

- Issue #8513: os.get_exec_path() supports b'PATH' key and bytes value.
  subprocess.Popen() and os._execvpe() support bytes program name. Add
  os.supports_bytes_environ flag: True if the native OS type of the environment
  is bytes (eg. False on Windows).

- Issue #8633: tarfile is now able to read and write archives with "raw" binary
  pax headers as described in POSIX.1-2008.

- Issue #1285086: Speed up urllib.parse functions: quote, quote_from_bytes,
  unquote, unquote_to_bytes.

- Issue #8688: Distutils now recalculates MANIFEST every time.

- Issue #8477: ssl.RAND_egd() and ssl._test_decode_cert() support str with
  surrogates and bytes for the filename.

- Issue #8550: Add first class ``SSLContext`` objects to the ssl module.

- Issue #8681: Make the zlib module's error messages more informative when the
  zlib itself doesn't give any detailed explanation.

- The audioop module now supports sound fragments of length greater than 2**31
  bytes on 64-bit machines, and is PY_SSIZE_T_CLEAN.

- Issue #4972: Add support for the context manager protocol to the ftplib.FTP
  class.

- Issue #8664: In py_compile, create __pycache__ when the compiled path is
  given.

- Issue #8514: Add os.fsencode() function (Unix only): encode a string to bytes
  for use in the file system, environment variables or the command line.

- Issue #8571: Fix an internal error when compressing or decompressing a chunk
  larger than 1GB with the zlib module's compressor and decompressor objects.

- Issue #8603: Support bytes environmental variables on Unix: Add os.environb
  mapping and os.getenvb() function. os.unsetenv() encodes str argument to the
  file system encoding with the surrogateescape error handler (instead of
  utf8/strict) and accepts bytes. posix.environ keys and values are now bytes.

- Issue #8573: asyncore _strerror() function might throw ValueError.

- Issue #8483: asyncore.dispatcher's __getattr__ method produced confusing error
  messages when accessing undefined class attributes because of the cheap
  inheritance with the underlying socket object.  The cheap inheritance has been
  deprecated.

- Issue #4265: shutil.copyfile() was leaking file descriptors when disk fills.
  Patch by Tres Seaver.

- Issue #8390: tarfile uses surrogateescape as the default error handler
  (instead of replace in read mode or strict in write mode).

- Issue #7755: Use an unencumbered audio file for tests.

- Issue #8621: uuid.uuid4() returned the same sequence of values in the parent
  and any children created using ``os.fork`` on MacOS X 10.6.

- Issue #8567: Fix precedence of signals in Decimal module: when a Decimal
  operation raises multiple signals and more than one of those signals is
  trapped, the specification determines the order in which the signals should be
  handled.  In many cases this order wasn't being followed, leading to the wrong
  Python exception being raised.

- Issue #7865: The close() method of ``io`` objects should not swallow
  exceptions raised by the implicit flush().  Also qensure that calling close()
  several times is supported.  Patch by Pascal Chambon.

- Issue #4687: Fix accuracy of garbage collection runtimes displayed with
  gc.DEBUG_STATS.

- Issue #8354: The siginterrupt setting is now preserved for all signals, not
  just SIGCHLD.

- Issue #7192: webbrowser.get("firefox") now works on Mac OS X, as does
  webbrowser.get("safari").

- Issue #8464: tarfile no longer creates files with execute permissions set when
  mode="w|" is used.

- Issue #7834: Fix connect() of Bluetooth L2CAP sockets with recent versions of
  the Linux kernel.  Patch by Yaniv Aknin.

- Issue #8295: Added shutil.unpack_archive.

- Issue #6312: Fixed http HEAD request when the transfer encoding is chunked.
  It should correctly return an empty response now.

- Issue #8546: Reject None given as the buffering argument to _pyio.open.

- Issue #8549: Fix compiling the _ssl extension under AIX.  Patch by
  Sridhar Ratnakumar.

- Issue #6656: fix locale.format_string to handle escaped percents
  and mappings.

- Issue #2302: Fix a race condition in SocketServer.BaseServer.shutdown, where
  the method could block indefinitely if called just before the event loop
  started running.  This also fixes the occasional freezes witnessed in
  test_httpservers.

- Issue #8524: When creating an SSL socket, the timeout value of the original
  socket wasn't retained (instead, a socket with a positive timeout would be
  turned into a non-blocking SSL socket).

- Issue #5103: SSL handshake would ignore the socket timeout and block
  indefinitely if the other end didn't respond.

- The do_handshake() method of SSL objects now adjusts the blocking mode of the
  SSL structure if necessary (as other methods already do).

- Issue #8391: os.execvpe() and os.getenv() supports unicode with surrogates and
  bytes strings for environment keys and values.

- Issue #8467: Pure Python implementation of subprocess encodes the error
  message using surrogatepass error handler to support surrogates in the
  message.

- Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames.

- Issue #8451: Syslog module now uses basename(sys.argv[0]) instead of the
  string "python" as the *ident*.  openlog() arguments are all optional and
  keywords.

- Issue #8108: Fix the unwrap() method of SSL objects when the socket has a
  non-infinite timeout.  Also make that method friendlier with applications
  wanting to continue using the socket in clear-text mode, by disabling
  OpenSSL's internal readahead.  Thanks to Darryl Miles for guidance.

- Issue #8496: make mailcap.lookup() always return a list, rather than an
  iterator.  Patch by Gregory Nofi.

- Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
  collation name contains a surrogate character.

- Issue #8484: Load all ciphers and digest algorithms when initializing the _ssl
  extension, such that verification of some SSL certificates doesn't fail
  because of an "unknown algorithm".

- Issue #6547: Added the ignore_dangling_symlinks option to shutil.copytree.

- Issue #1540112: Now allowing the choice of a copy function in shutil.copytree.

- Issue #4814: timeout parameter is now applied also for connections resulting
  from PORT/EPRT commands.

- Issue #8463: added missing reference to bztar in shutil's documentation.

- Issue #7154: urllib.request can now detect the proxy settings on OSX 10.6 (as
  long as the user didn't specify 'automatic proxy configuration').

- Issue #3817: ftplib.FTP.abort() method now considers 225 a valid response code
  as stated in RFC-959 at chapter 5.4.

- Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
  surrogates.

- Issue #850728: Add a *timeout* parameter to the `acquire()` method of
  `threading.Semaphore` objects.  Original patch by Torsten Landschoff.

- Issue #8322: Add a *ciphers* argument to SSL sockets, so as to change the
  available cipher list.  Helps fix test_ssl with OpenSSL 1.0.0.

- Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
  the current working directory.

- Issue #7606: XML-RPC traceback stored in X-traceback is now encoded to ASCII
  using backslashreplace error handler.

- Issue #8412: os.system() now accepts bytes, bytearray and str with surrogates.

- Issue #2987: RFC2732 support for urlparse (IPv6 addresses). Patch by Tony
  Locke and Hans Ulrich Niedermann.

- Issue #5277: Fix quote counting when parsing RFC 2231 encoded parameters.

- Issue #7316: The acquire() method of lock objects in the ``threading``
  module now takes an optional timeout argument in seconds.  Timeout support
  relies on the system threading library, so as to avoid a semi-busy wait loop.

- Issue #8383: pickle and pickletools use surrogatepass error handler when
  encoding unicode as utf8 to support lone surrogates and stay compatible with
  Python 2.x and 3.x.

- Issue #7585: difflib context and unified diffs now place a tab between
  filename and date, conforming to the 'standards' they were originally designed
  to follow.  This improves compatibility with patch tools.

- Issue #7472: Fixed typo in email.encoders module; messages using ISO-2022
  character sets will now consistently use a Content-Transfer-Encoding of 7bit
  rather than sometimes being marked as 8bit.

- Issue #8375: test_distutils now checks if the temporary directory are still
  present before it cleans them.

- Issue #8374: Update the internal alias table in the ``locale`` module to
  cover recent locale changes and additions.

- Issue #8321: Give access to OpenSSL version numbers from the `ssl` module,
  using the new attributes `ssl.OPENSSL_VERSION`, `ssl.OPENSSL_VERSION_INFO` and
  `ssl.OPENSSL_VERSION_NUMBER`.

- Add functools.total_ordering() and functools.cmp_to_key().

- Issue #8257: The Decimal construct now accepts a float instance directly,
  converting that float to a Decimal of equal value:

     >>> Decimal(1.1)
     Decimal('1.100000000000000088817841970012523233890533447265625')

- Issue #8294: The Fraction constructor now accepts Decimal and float instances
  directly.

- Issue #7279: Comparisons involving a Decimal signaling NaN now signal
  InvalidOperation instead of returning False.  (Comparisons involving a quiet
  NaN are unchanged.)  Also, Decimal quiet NaNs are now hashable; Decimal
  signaling NaNs remain unhashable.

- Issue #2531: Comparison operations between floats and Decimal instances now
  return a result based on the numeric values of the operands; previously they
  returned an arbitrary result based on the relative ordering of id(float) and
  id(Decimal).  See also issue #8188, which adds Decimal-to-Fraction
  comparisons.

- Added a subtract() method to collections.Counter().

- Issue #8233: When run as a script, py_compile.py optionally takes a single
  argument `-` which tells it to read files to compile from stdin.  Each line is
  read on demand and the named file is compiled immediately.  (Original patch by
  Piotr Ożarowski).

- Backwards incompatible change: Unicode codepoints line tabulation (0x0B) and
  form feed (0x0C) are now considered linebreaks, as specified in Unicode
  Standard Annex #14.  See issue #7643.  http://www.unicode.org/reports/tr14/

- Comparisons using one of <, <=, >, >= between a complex instance and a
  Fractions instance now raise TypeError instead of returning True/False.  This
  makes Fraction <=> complex comparisons consistent with int <=> complex, float
  <=> complex, and complex <=> complex comparisons.

- Issue #8139: ossaudiodev didn't initialize its types properly, therefore some
  methods (such as oss_mixer_device.fileno()) were not available.  Initial patch
  by Bertrand Janin.

- Issue #8205: Remove the "Modules" directory from sys.path when Python is
  running from the build directory (POSIX only).

- Issue #7512: shutil.copystat() could raise an OSError when the filesystem
  didn't support chflags() (for example ZFS under FreeBSD).  The error is now
  silenced.

- Issue #7860: platform.uname now reports the correct 'machine' type when Python
  is running in WOW64 mode on 64 bit Windows.

- Issue #3890, #8222: Fix recv() and recv_into() on non-blocking SSL sockets.
  Also, enable the SSL_MODE_AUTO_RETRY flag on SSL sockets, so that blocking
  reads and writes are always retried by OpenSSL itself.

- Issue #4282: Fix the main function of the profile module for a non-ASCII
  script, open the file in binary mode and not in text mode with the default
  (utf8) encoding.

- Issue #8179: Fix macpath.realpath() on a non-existing path.

- Issue #8024: Update the Unicode database to 5.2.

- Issue #8168: py_compile now handles files with utf-8 BOMS.

- ``tokenize.detect_encoding`` now returns ``'utf-8-sig'`` when a UTF-8 BOM is
  detected.

- Issue #6716/2: Backslash-replace error output in compilall.

- Issue #4961: Inconsistent/wrong result of askyesno function in tkMessageBox
  with Tcl/Tk-8.5.

- Issue #8140: extend compileall to compile single files.  Add -i option.

- Issue #7356: ctypes.util: Make parsing of ldconfig output independent of the
  locale.

- The internals of the subprocess module on POSIX systems have been replaced by
  an extension module (_posixsubprocess) so that the fork()+exec() can be done
  safely without the possibility of deadlock in multithreaded applications.

- subprocess.Popen now has restore_signals and start_new_session features.  The
  default of restore_signals=True is a new behavior compared to earlier Python
  versions.  This means that signals such as SIGPIPE are not ignored by default
  in subprocesses launched by Python (Issue #1652).

- Issue #6472: The xml.etree package is updated to ElementTree 1.3.  The
  cElementTree module is updated too.

- Issue #7774: Set sys.executable to an empty string if argv[0] has been set to
  an non existent program name and Python is unable to retrieve the real program
  name.

- Issue #7880: Fix sysconfig when the python executable is a symbolic link.

- Issue #6509: fix re.sub to work properly when the pattern, the string, and the
  replacement were all bytes.  Patch by Antoine Pitrou.

- The sqlite3 module was updated to pysqlite 2.6.0. This fixes several obscure
  bugs and allows loading SQLite extensions from shared libraries.

- Issue #1054943: Fix ``unicodedata.normalize('NFC', text)`` for the Public
  Review Issue #29 (http://unicode.org/review/pr-29.html).

- Issue #7494: fix a crash in _lsprof (cProfile) after clearing the profiler,
  reset also the pointer to the current pointer context.

- Issue #7232: Add support for the context manager protocol to the TarFile
  class.

- Issue #7250: Fix info leak of os.environ across multi-run uses of
  wsgiref.handlers.CGIHandler.

- Issue #1729305: Fix doctest to handle encode error with "backslashreplace".

- Issue #691291: codecs.open() should not convert end of lines on reading and
  writing.

- Issue #7869: logging: improved diagnostic for format-time errors.

- Issue #7868: logging: added loggerClass attribute to Manager.

- logging: Implemented PEP 391.

- Issue #1537721: Add a writeheader() method to csv.DictWriter.

- Issue #7959: ctypes callback functions are now registered correctly with the
  cycle garbage collector.

- Issue #5801: removed spurious empty lines in wsgiref.

- Issue #6666: fix bug in trace.py that applied the list of directories to be
  ignored only to the first file.  Noted by Bogdan Opanchuk.

- Issue #7597: curses.use_env() can now be called before initscr().  Noted by
  Kan-Ru Chen.

- Issue #7310: fix the __repr__ of os.environ to show the environment variables.

- Issue #7970: email.Generator.flatten now correctly flattens message/rfc822
  messages parsed by email.Parser.HeaderParser.

- Issue #7361: Importlib was not properly checking the number of bytes in
  bytecode file when it was less then 8 bytes.

- Issue #7633: In the decimal module, Context class methods (with the exception
  of canonical and is_canonical) now accept instances of int and long wherever a
  Decimal instance is accepted, and implicitly convert that argument to Decimal.
  Previously only some arguments were converted.

- Issue #7835: shelve should no longer produce mysterious warnings during
  interpreter shutdown.

- Issue #2746: Don't escape ampersands and angle brackets ("&", "<", ">") in XML
  processing instructions and comments.  These raw characters are allowed by the
  XML specification, and are necessary when outputting e.g.  PHP code in a
  processing instruction.  Patch by Neil Muller.

- Issue #6233: ElementTree failed converting unicode characters to XML entities
  when they could't be represented in the requested output encoding.  Patch by
  Jerry Chen.

- Issue #6003: add an argument to ``zipfile.Zipfile.writestr`` to specify the
  compression type.

- Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is
  specified, rather than fall through to AF_PACKET (in the `socket` module).
  Also, raise ValueError rather than TypeError when an unknown TIPC address type
  is specified.  Patch by Brian Curtin.

- Issue #6939: Fix file I/O objects in the `io` module to keep the original file
  position when calling `truncate()`.  It would previously change the file
  position to the given argument, which goes against the tradition of
  ftruncate() and other truncation APIs.  Patch by Pascal Chambon.

- Issue #7610: Reworked implementation of the internal
  ``zipfile.ZipExtFile`` class used to represent files stored inside an
  archive.  The new implementation is significantly faster and can be wrapped in
  a ``io.BufferedReader`` object for more speedups.  It also solves an
  issue where interleaved calls to `read()` and `readline()` give wrong results.
  Patch by Nir Aides.

- Issue #6963: Added "maxtasksperchild" argument to multiprocessing.Pool,
  allowing for a maximum number of tasks within the pool to be completed by the
  worker before that worker is terminated, and a new one created to replace it.

- Issue #7792: Registering non-classes to ABCs raised an obscure error.

- Issue #7785: Don't accept bytes in FileIO.write().

- Removed the functions 'verify' and 'vereq' from Lib/test/support.py.

- Issue #7773: Fix an UnboundLocalError in platform.linux_distribution() when
  the release file is empty.

- Issue #7561: Fix crashes when using bytearray objects with the posix
  module.

- Issue #1670765: Prevent email.generator.Generator from re-wrapping headers in
  multipart/signed MIME parts, which fixes one of the sources of invalid
  modifications to such parts by Generator.

- Issue #7703: Add support for the new buffer API to `binascii.a2bhqx`.  Patch
  by Florent Xicluna, along with some additional tests.

- Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a 1-byte
  argument.  Patch by Victor Stinner.

- Issue #3299: Fix possible crash in the _sre module when given bad argument
  values in debug mode.  Patch by Victor Stinner.

- Issue #2846: Add support for gzip.GzipFile reading zero-padded files.  Patch
  by Brian Curtin.

- Issue #7681: Use floor division in appropiate places in the wave module.

- Issue #5372: Drop the reuse of .o files in Distutils' ccompiler (since
  Extension extra options may change the output without changing the .c
  file). Initial patch by Collin Winter.

- Issue #7617: Make sure distutils.unixccompiler.UnixCCompiler recognizes gcc
  when it has a fully qualified configuration prefix. Initial patch by Arfrever.

- Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against the
  destruction of weakref'ed objects while iterating.

- Issue #7455: Fix possible crash in cPickle on invalid input.  Patch by Victor
  Stinner.

- Issue #1628205: Socket file objects returned by socket.socket.makefile() now
  properly handles EINTR within the read, readline, write & flush methods.  The
  socket.sendall() method now properly handles interrupted system calls.

- Issue #7471: Improve the performance of GzipFile's buffering mechanism, and
  make it implement the `io.BufferedIOBase` ABC to allow for further speedups by
  wrapping it in an `io.BufferedReader`.  Patch by Nir Aides.

- Issue #3972: http.client.HTTPConnection now accepts an optional source_address
  parameter to allow specifying where your connections come from.

- socket.create_connection now accepts an optional source_address parameter.

- Issue #5511: now zipfile.ZipFile can be used as a context manager.  Initial
  patch by Brian Curtin.

- Issue #7556: Make sure Distutils' msvc9compile reads and writes the MSVC XML
  Manifest file in text mode so string patterns can be used in regular
  expressions.

- Issue #7552: Removed line feed in the base64 Authorization header in the
  Distutils upload command to avoid an error when PyPI reads it.  This occurs on
  long passwords. Initial patch by JP St. Pierre.

- Issue #7231: urllib2 cannot handle https with proxy requiring auth.  Patch by
  Tatsuhiro Tsujikawa.

- Issue #4757: `zlib.compress` and other methods in the zlib module now raise a
  TypeError when given an `str` object (rather than a `bytes`-like object).
  Patch by Victor Stinner and Florent Xicluna.

- Issue #7349: Make methods of file objects in the io module accept None as an
  argument where file-like objects (ie StringIO and BytesIO) accept them to mean
  the same as passing no argument.

- Issue #7357: tarfile no longer suppresses fatal extraction errors by default.

- Issue #5949: added check for correct lineends in input from IMAP server in
  imaplib.

- Add count() and reverse() methods to collections.deque().

- Fix variations of extending deques:  d.extend(d)  d.extendleft(d)  d+=d

- Issue #6986: Fix crash in the JSON C accelerator when called with the wrong
  parameter types.  Patch by Victor Stinner.

- Issue #7457: added a read_pkg_file method to
  distutils.dist.DistributionMetadata.

- logging: Added optional `secure` parameter to SMTPHandler, to enable use of
  TLS with authentication credentials.

- Issue #1923: Fixed the removal of meaningful spaces when PKG-INFO is generated
  in Distutils.  Patch by Stephen Emslie.

- Issue #4120: Drop reference to CRT from manifest when building extensions with
  msvc9compiler.

- Issue #7333: The `posix` module gains an `initgroups()` function providing
  access to the initgroups(3) C library call on Unix systems which implement it.
  Patch by Jean-Paul Calderone.

- Issue #7408: Fixed distutils.tests.sdist so it doesn't check for group
  ownership when the group is not forced, because the group may be different
  from the user's group and inherit from its container when the test is run.

- Issue #4486: When an exception has an explicit cause, do not print its
  implicit context too.  This affects the `traceback` module as well as built-in
  exception printing.

- Issue #1515: Enable use of deepcopy() with instance methods.  Patch by Robert
  Collins.

- Issue #7403: logging: Fixed possible race condition in lock creation.

- Issue #6845: Add restart support for binary upload in ftplib.  The
  `storbinary()` method of FTP and FTP_TLS objects gains an optional `rest`
  argument.  Patch by Pablo Mouzo.

- Issue #5788: `datetime.timedelta` objects get a new `total_seconds()` method
  returning the total number of seconds in the duration.  Patch by Brian
  Quinlan.

- Issue #7133: SSL objects now support the new buffer API.

- Issue #1488943: difflib.Differ() doesn't always add hints for tab characters.

- Issue #6123: tarfile now opens empty archives correctly and consistently
  raises ReadError on empty files.

- Issue #7354: distutils.tests.test_msvc9compiler - dragfullwindows can be 2.

- Issue #5037: Proxy the __bytes__ special method instead to __bytes__ instead
  of __str__.

- Issue #7341: Close the internal file object in the TarFile constructor in case
  of an error.

- Issue #7293: distutils.test_msvc9compiler is fixed to work on any fresh
  Windows box. Help provided by David Bolen.

- Issue #2054: ftplib now provides an FTP_TLS class to do secure FTP using TLS
  or SSL.  Patch by Giampaolo Rodola'.

- Issue #7328: pydoc no longer corrupts sys.path when run with the '-m' switch.

- Issue #4969: The mimetypes module now reads the MIME database from the
  registry under Windows.  Patch by Gabriel Genellina.

- Issue #6816: runpy now provides a run_path function that allows Python code to
  execute file paths that refer to source or compiled Python files as well as
  zipfiles, directories and other valid sys.path entries that contain a
  __main__.py file.  This allows applications that run other Python scripts to
  support the same flexibility as the CPython command line itself.

- Issue #7318: multiprocessing now uses a timeout when it fails to establish a
  connection with another process, rather than looping endlessly.  The default
  timeout is 20 seconds, which should be amply sufficient for local connections.

- Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
  unpickled.  This fixes crashes under Windows when trying to run
  test_multiprocessing in verbose mode.

- Issue #7893: ``unittest.TextTestResult`` is made public and a ``resultclass``
  argument added to the TextTestRunner constructor allowing a different result
  class to be used without having to subclass.

- Issue #7588: ``unittest.TextTestResult.getDescription`` now includes the test
  name in failure reports even if the test has a docstring.

- Issue #3001: Add a C implementation of recursive locks which is used by
  default when instantiating a `threading.RLock` object. This makes recursive
  locks as fast as regular non-recursive locks (previously, they were slower by
  10x to 15x).

- Issue #7282: Fix a memory leak when an RLock was used in a thread other than
  those started through `threading.Thread` (for example, using
  `_thread.start_new_thread()`).

- Issue #7187: Importlib would not silence the IOError raised when trying to
  write new bytecode when it was made read-only.

- Issue #7264: Fix a possible deadlock when deallocating thread-local objects
  which are part of a reference cycle.

- Issue #7211: Allow 64-bit values for the `ident` and `data` fields of kevent
  objects on 64-bit systems.  Patch by Michael Broghton.

- Issue #6896: mailbox.Maildir now invalidates its internal cache each time a
  modification is done through it.  This fixes inconsistencies and test failures
  on systems with slightly bogus mtime behaviour.

- Issue #7246 & Issue #7208: getpass now properly flushes input before reading
  from stdin so that existing input does not confuse it and lead to incorrect
  entry or an IOError.  It also properly flushes it afterwards to avoid the
  terminal echoing the input afterwards on OSes such as Solaris.

- Issue #7233: Fix a number of two-argument Decimal methods to make sure that
  they accept an int or long as the second argument.  Also fix buggy handling of
  large arguments (those with coefficient longer than the current precision) in
  shift and rotate.

- Issue #4750: Store the basename of the original filename in the gzip FNAME
  header as required by RFC 1952.

- Issue #1180: Added a new global option to ignore ~/.pydistutils.cfg in
  Distutils.

- Issue #7218: Fix test_site for win32, the directory comparison was done with
  an uppercase.

- Issue #7205: Fix a possible deadlock when using a BZ2File object from
  several threads at once.

- Issue #7077: logging: SysLogHandler now treats Unicode as per RFC 5424.

- Issue #7099: Decimal.is_normal now returns True for numbers with exponent
  larger than emax.

- Issue #7080: locale.strxfrm() raises a MemoryError on 64-bit non-Windows
  platforms, and assorted locale fixes by Derk Drukker.

- Issue #5833: Fix extra space character in readline completion with the GNU
  readline library version 6.0.

- Issue #6894: Fixed the issue urllib2 doesn't respect "no_proxy" environment.

- Issue #7086: Added TCP support to SysLogHandler, and tidied up some
  anachronisms in the code which were a relic of 1.5.2 compatibility.

- Issue #7082: When falling back to the MIME 'name' parameter, the correct place
  to look for it is the Content-Type header.

- Make tokenize.detect_coding() normalize utf-8 and iso-8859-1 variants like the
  builtin tokenizer.

- Issue #7048: Force Decimal.logb to round its result when that result is too
  large to fit in the current precision.

- Issue #6236, #6348: Fix various failures in the I/O library under AIX and
  other platforms, when using a non-gcc compiler. Patch by Derk Drukker.

- Issue #4606: Passing 'None' if ctypes argtype is set to POINTER(...)  does now
  always result in NULL.

- Issue #5042: Structure sub-subclass does now initialize correctly with base
  class positional arguments.

- Issue #6882: Import uuid creates zombies processes.

- Issue #6635: Fix profiler printing usage message.

- Issue #6856: Add a filter keyword argument to TarFile.add().

- Issue #6888: pdb's alias command was broken when no arguments were given.

- Issue #6857: Default format() alignment should be '>' for Decimal instances.

- Issue #6795: int(Decimal('nan')) now raises ValueError instead of returning
  NaN or raising InvalidContext.  Also, fix infinite recursion in
  long(Decimal('nan')).

- Issue #6850: Fix bug in Decimal._parse_format_specifier for formats with no
  type specifier.

- Issue #6239: ctypes.c_char_p return value must return bytes.

- Issue #6838: Use a list to accumulate the value instead of repeatedly
  concatenating strings in http.client's HTTPResponse._read_chunked providing a
  significant speed increase when downloading large files servend with a
  Transfer-Encoding of 'chunked'.

- Trying to import a submodule from a module that is not a package, ImportError
  should be raised, not AttributeError.

- When the globals past to importlib.__import__() has __package__ set to None,
  fall back to computing what __package__ should be instead of giving up.

- Raise a TypeError when the name of a module to be imported for
  importlib.__import__ is not a string (was raising an AttributeError before).

- Allow the fromlist passed into importlib.__import__ to be any iterable.

- Have importlib raise ImportError if None is found in sys.modules.

- Issue #6054: Do not normalize stored pathnames in tarfile.

- Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN
  payloads are now ordered by integer value rather than lexicographically.

- Issue #1356969: Add missing info methods in tix.HList.

- Issue #1522587: New constants and methods for the tix.Grid widget.

- Issue #1250469: Fix the return value of tix.PanedWindow.panes.

- Issue #1119673: Do not override tkinter.Text methods when creating a
  ScrolledText.

- Issue #6665: Fix fnmatch to properly match filenames with newlines in them.

- Issue #1135: Add the XView and YView mix-ins to avoid duplicating the xview*
  and yview* methods.

- Issue #6629: Fix a data corruption issue in the new I/O library, which could
  occur when writing to a BufferedRandom object (e.g. a file opened in "rb+" or
  "wb+" mode) after having buffered a certain amount of data for reading. This
  bug was not present in the pure Python implementation.

- Issue #6622: Fix "local variable 'secret' referenced before assignment" bug in
  POP3.apop.

- Issue #2715: Remove remnants of Carbon.File from binhex module.

- Issue #6595: The Decimal constructor now allows arbitrary Unicode decimal
  digits in input, as recommended by the standard.  Previously it was restricted
  to accepting [0-9].

- Issue #6106: telnetlib.Telnet.process_rawq doesn't handle default WILL/WONT
  DO/DONT correctly.

- Issue #1424152: Fix for http.client, urllib.request to support SSL while
  working through proxy.  Original patch by Christopher Li, changes made by
  Senthil Kumaran.

- Add importlib.abc.ExecutionLoader to represent the PEP 302 protocol for
  loaders that allow for modules to be executed. Both importlib.abc.PyLoader and
  PyPycLoader inherit from this class and provide implementations in relation to
  other methods required by the ABCs.

- importlib.abc.PyLoader did not inherit from importlib.abc.ResourceLoader like
  the documentation said it did even though the code in PyLoader relied on the
  abstract method required by ResourceLoader.

- Issue #6431: Make Fraction type return NotImplemented when it doesn't know how
  to handle a comparison without loss of precision.  Also add correct handling
  of infinities and nans for comparisons with float.

- Issue #6415: Fixed warnings.warn segfault on bad formatted string.

- Issue #6358: The exit status of a command started with os.popen() was reported
  differently than it did with python 2.x.

- Issue #6323: The pdb debugger did not exit when running a script with a syntax
  error.

- Issue #3392: The subprocess communicate() method no longer fails in select()
  when file descriptors are large; communicate() now uses poll() when possible.

- Issue #6369: Fix an RLE decompression bug in the binhex module.

- Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.

- The deprecated function string.maketrans has been removed.

- Issue #4005: Fixed a crash of pydoc when there was a zip file present in
  sys.path.

- Issue #6218: io.StringIO and io.BytesIO instances are now picklable.

- The os.get_exec_path() function to return the list of directories that will be
  searched for an executable when launching a subprocess was added.

- Issue #7481: When a threading.Thread failed to start it would leave the
  instance stuck in initial state and present in threading.enumerate().

- Issue #1068268: The subprocess module now handles EINTR in internal os.waitpid
  and os.read system calls where appropriate.

- Issue #6729: Added ctypes.c_ssize_t to represent ssize_t.

- Issue #6247: The argparse module has been added to the standard library.

- Issue #8235: _socket: Add the constant ``SO_SETFIB``.  SO_SETFIB is a socket
  option available on FreeBSD 7.1 and newer.

- Issue #9315: Fix for the trace module to record correct class name
  for tracing methods.

Extension Modules
-----------------

- Issue #9959: Tweak formula used for computing math.log of an integer,
  making it marginally more accurate for exact powers of 2.

- Issue #9422: Fix memory leak when re-initializing a struct.Struct object.

- Issue #7900: The getgroups(2) system call on MacOSX behaves rather oddly
  compared to other unix systems. In particular, os.getgroups() does not reflect
  any changes made using os.setgroups() but basicly always returns the same
  information as the id command. os.getgroups() can now return more than 16
  groups on MacOSX.

- Issue #6095: Make directory argument to os.listdir optional.

- Issue #9277: Fix bug in struct.pack for bools in standard mode (e.g.,
  struct.pack('>?')): if conversion to bool raised an exception then that
  exception wasn't properly propagated on machines where char is unsigned.

- Issue #5180: Fixed a bug that prevented loading 2.x pickles in 3.x python when
  they contain instances of old-style classes.

- Issue #9165: Add new functions math.isfinite and cmath.isfinite, to accompany
  existing isinf and isnan functions.

- Issue #1578269: Implement os.symlink for Windows 6.0+.  Patch by Jason
  R. Coombs.

- In struct.pack, correctly propogate exceptions from computing the truth of an
  object in the '?' format.

- Issue #9000: datetime.timezone objects now have eval-friendly repr.

- In the math module, correctly lookup __trunc__, __ceil__, and __floor__ as
  special methods.

- Issue #9005: Prevent utctimetuple() from producing year 0 or year 10,000.
  Prior to this change, timezone adjustment in utctimetuple() could produce
  tm_year value of 0 or 10,000.  Now an OverflowError is raised in these edge
  cases.

- Issue #6641: The ``datetime.strptime`` method now supports the ``%z``
  directive.  When the ``%z`` directive is present in the format string, an
  aware ``datetime`` object is returned with ``tzinfo`` bound to a
  ``datetime.timezone`` instance constructed from the parsed offset.  If both
  ``%z`` and ``%Z`` are present, the data in ``%Z`` field is used for timezone
  name, but ``%Z`` data without ``%z`` is discarded.

- Issue #5094: The ``datetime`` module now has a simple concrete class
  implementing ``datetime.tzinfo`` interface.  Instances of the new class,
  ``datetime.timezone``, return fixed name and UTC offset from their
  ``tzname(dt)`` and ``utcoffset(dt)`` methods.  The ``dst(dt)`` method always
  returns ``None``.  A class attribute, ``utc`` contains an instance
  representing the UTC timezone.  Original patch by Rafe Kaplan.

- Issue #8973: Add __all__ to struct module; this ensures that help(struct)
  includes documentation for the struct.Struct class.

- Issue #3129: Trailing digits in struct format string are no longer ignored.
  For example, "1" or "ilib123" are now invalid formats and cause
  ``struct.error`` to be raised.  Patch by Caleb Deveraux.

- Issue #7384: If the system readline library is linked against ncurses, the
  curses module must be linked against ncurses as well. Otherwise it is not safe
  to load both the readline and curses modules in an application.

- Issue #2810: Fix cases where the Windows registry API returns ERROR_MORE_DATA,
  requiring a re-try in order to get the complete result.

- Issue #8692: Optimize math.factorial: replace the previous naive algorithm
  with an improved 'binary-split' algorithm that uses fewer multiplications and
  allows many of the multiplications to be performed using plain C integer
  arithmetic instead of PyLong arithmetic.  Also uses a lookup table for small
  arguments.

- Issue #8674: Fixed a number of incorrect or undefined-behaviour-inducing
  overflow checks in the audioop module.

- Issue #8644: The accuracy of td.total_seconds() has been improved (by
  calculating with integer arithmetic instead of float arithmetic internally):
  the result is now always correctly rounded, and is equivalent to ``td /
  timedelta(seconds=1)``.

- Issue #2706: Allow division of a timedelta by another timedelta: timedelta /
  timedelta, timedelta % timedelta, timedelta // timedelta and divmod(timedelta,
  timedelta) are all supported.

- Issue #8314: Fix unsigned long long bug in libffi on Sparc v8.

- Issue #8300: When passing a non-integer argument to struct.pack with any
  integer format code, struct.pack first attempts to convert the non-integer
  using its __index__ method.  If that method is non-existent or raises
  TypeError it goes on to try the __int__ method, as described below.

- Issue #8142: Update libffi to the 3.0.9 release.

- Issue #6949: Allow the _dbm extension to be built with db 4.8.x.

- Issue #6544: Fix a reference leak in the kqueue implementation's error
  handling.

- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
  msvcr100.dll is not a platform assembly anymore.

- Issue #6508: Add posix.{getresuid,getresgid,setresuid,setresgid}.

- Issue #7078: Set struct.__doc__ from _struct.__doc__.

- Issue #3366: Add erf, erfc, expm1, gamma, lgamma functions to math module.

- Issue #6877: It is now possible to link the readline extension to the libedit
  readline emulation on OSX 10.5 or later.

- Issue #6848: Fix curses module build failure on OS X 10.6.

- Fix a segfault that could be triggered by expat with specially formed input.

- Issue #6561: '\d' in a regex now matches only characters with Unicode category
  'Nd' (Number, Decimal Digit).  Previously it also matched characters with
  category 'No'.

- Issue #4509: Array objects are no longer modified after an operation failing
  due to the resize restriction in-place when the object has exported buffers.

- Issue #2389: Array objects are now pickled in a portable manner.

- Expat: Fix DoS via XML document with malformed UTF-8 sequences
  (CVE_2009_3560).

- Issue #7242: On Solaris 9 and earlier calling os.fork() from within a thread
  could raise an incorrect RuntimeError about not holding the import lock.  The
  import lock is now reinitialized after fork.

- Issue #7999: os.setreuid() and os.setregid() would refuse to accept a -1
  parameter on some platforms such as OS X.

- Build the ossaudio extension on GNU/kFreeBSD.

- Issue #7347: winreg: Add CreateKeyEx and DeleteKeyEx, as well as fix a bug in
  the return value of QueryReflectionKey.

- Issue #7567: PyCurses_setupterm: Don't call ``setupterm`` twice.

Build
-----

- Use OpenSSL 1.0.0a on Windows.

- Issue #9280: Make sharedinstall depend on sharedmods.

- Issue #9189: Make a user-specified CFLAGS, CPPFLAGS, or LDFLAGS setting
  override the configure and makefile defaults, without deleting options the
  user didn't intend to override.  Developers should no longer need to specify
  OPT or EXTRA_CFLAGS, although those variables are still present for
  backward-compatibility.

- Issue #8854: Fix finding Visual Studio 2008 on Windows x64.

- Issue #1759169, #8864: Drop _XOPEN_SOURCE on Solaris, define it for
  multiprocessing only.

- Issue #8625: Turn off optimization in --with-pydebug builds with gcc.
  (Optimization was unintentionally turned on in gcc --with-pydebug builds as a
  result of the issue #1628484 fix, combined with autoconf's strange choice of
  default CFLAGS produced by AC_PROG_CC for gcc.)

- Issue #3646: It is now easily possible to install a Python framework into your
  home directory on MacOSX, see Mac/README for more information.

- Issue #3928: os.mknod() now available in Solaris, also.

- Issue #3326: Build Python without -fno-strict-aliasing when the gcc does not
  give false warnings.

- Issue #1628484: The Makefile doesn't ignore the CFLAGS environment variable
  anymore.  It also forwards the LDFLAGS settings to the linker when building a
  shared library.

- Issue #6716: Quote -x arguments of compileall in MSI installer.  Exclude 2to3
  tests from compileall.

- Issue #3920, #7903: Define _BSD_SOURCE on OpenBSD 4.4 through 4.9.

- Issue #7632: When Py_USING_MEMORY_DEBUGGER is defined, disable the private
  memory allocation scheme in dtoa.c and use PyMem_Malloc and PyMem_Free
  instead.  Also disable caching of powers of 5.

- Issue #6491: Allow --with-dbmliborder to specify that no dbms will be built.

- Issue #6943: Use pkg-config to find the libffi headers when the
  --with-system-ffi flag is used.

- Issue #7609: Add a --with-system-expat option that causes the system's expat
  library to be used for the pyexpat module instead of the one included with
  Python.

- Issue #7589: Only build the nis module when the correct header files are
  found.

- Switch to OpenSSL 0.9.8l and sqlite 3.6.21 on Windows.

- Issue #5792: Extend the short float repr support to x86 systems using
  icc or suncc.

- Issue #6603: Change READ_TIMESTAMP macro in ceval.c so that it compiles
  correctly under gcc on x86-64.  This fixes a reported problem with the
  --with-tsc build on x86-64.

- Issue #6802: Fix build issues on MacOSX 10.6.

- Issue #6244: Allow detect_tkinter to look for Tcl/Tk 8.6.

- Issue #4601: 'make install' did not set the appropriate permissions on
  directories.

- Issue #5390: Add uninstall icon independent of whether file extensions are
  installed.

- Issue #7541: When using ``python-config`` with a framework install the
  compiler might use the wrong library.

- python-config now supports multiple options on the same command line.

- Issue #8509: Fix quoting in help strings and code snippets in configure.in.

- Issue #8510: Update to autoconf2.65.

Documentation
-------------

- Issue #9817: Add expat COPYING file; add expat, libffi and expat licenses
  to Doc/license.rst.

- Issue #9524: Document that two CTRL* signals are meant for use only
  with os.kill.

- Issue #9255: Document that the 'test' package is meant for internal Python use
  only.

- A small WSGI server was added as Tools/scripts/serve.py, and is used to
  implement a local documentation server via 'make serve' in the doc directory.

- Updating `Using Python` documentation to include description of CPython's -J
  and -X options.

- Document that importing a module that has None in sys.modules triggers an
  ImportError.

- Issue #6556: Fixed the Distutils configuration files location explanation for
  Windows.

- Update python manual page (options -B, -O0, -s, environment variables
  PYTHONDONTWRITEBYTECODE, PYTHONNOUSERSITE).

- Issue #8909: Added the size of the bitmap used in the installer created by
  distutils' bdist_wininst. Patch by Anatoly Techtonik.

Tests
-----

- Issue #9251: test_threaded_import didn't fail when run through regrtest if the
  import lock was disabled.

- Issue #8605: Skip test_gdb if Python is compiled with optimizations.

- Issue #7449: Skip test_socketserver if threading support is disabled.

- Issue #8672: Add a zlib test ensuring that an incomplete stream can be handled
  by a decompressor object without errors (it returns incomplete uncompressed
  data).

- Issue #8533: regrtest uses backslashreplace error handler for stdout to avoid
  UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding).

- Issue #8576: Remove use of find_unused_port() in test_smtplib and
  test_multiprocessing.  Patch by Paul Moore.

- Issue #7449: Fix many tests to support Python compiled without thread
  support. Patches written by Jerry Seutter.

- Issue #8108: test_ftplib's non-blocking SSL server now has proper handling of
  SSL shutdowns.

- Issues #8279, #8330, #8437, #8480, #8495: Fix test_gdb failures, patch written
  by Dave Malcolm.

- Issue #3864: Skip three test_signal tests on freebsd6 because they fail if any
  thread was previously started, most likely due to a platform bug.

- Issue #8193: Fix test_zlib failure with zlib 1.2.4.

- Issue #8248: Add some tests for the bool type.  Patch by Gregory Nofi.

- Issue #8263: Now regrtest.py will report a failure if it receives a
  KeyboardInterrupt (SIGINT).

- Issue #8180 and #8207: Fix test_pep277 on OS X and add more tests for special
  Unicode normalization cases.

- Issue #7783: test.support.open_urlresource invalidates the outdated files from
  the local cache.

- Issue #7849: Now the utility ``check_warnings`` verifies if the warnings are
  effectively raised.

- The four path modules (genericpath, macpath, ntpath, posixpath) share a common
  TestCase for some tests: test_genericpath.CommonTest.

- Print platform information when running the whole test suite, or using the
  --verbose flag.

- Issue #767675: enable test_pep277 on POSIX platforms with Unicode-friendly
  filesystem encoding.

- Issue #6292: for the moment at least, the test suite runs cleanly if python is
  run with the -OO flag.  Tests requiring docstrings are skipped.

- Issue #7712: test.support gained a new `temp_cwd` context manager which is now
  also used by regrtest to run all the tests in a temporary directory.  The
  original CWD is saved in `support.SAVEDCWD`.  Thanks to Florent Xicluna who
  helped with the patch.

- Issue #7924: Fix an intermittent 'XXX undetected error' failure in test_capi
  (only seen so far on platforms where the curses module wasn't built), due to
  an uncleared exception.

- Issue #7728: test_timeout was changed to use support.bind_port instead of a
  hard coded port.

- Issue #7376: Instead of running a self-test (which was failing) when called
  with no arguments, doctest.py now gives a usage message.

- Issue #7396: fix regrtest -s, which was broken by the -j enhancement.

- Issue #7498: test_multiprocessing now uses test.support.find_unused_port
  instead of a hardcoded port number in test_rapid_restart.

- Issue #7431: Use TESTFN in test_linecache instead of trying to create a file
  in the Lib/test directory, which might be read-only for the user running the
  tests.

- Issue #7324: Add a sanity check to regrtest argument parsing to catch the case
  of an option with no handler.

- Issue #7312: Add a -F flag to run the selected tests in a loop until a test
  fails.  Can be combined with -j.

- Issue #6551: test_zipimport could import and then destroy some modules of the
  encodings package, which would make other tests fail further down the road
  because the internally cached encoders and decoders would point to empty
  global variables.

- Issue #7295: Do not use a hardcoded file name in test_tarfile.

- Issue #7270: Add some dedicated unit tests for multi-thread synchronization
  primitives such as Lock, RLock, Condition, Event and Semaphore.

- Issue #7248 (part 2): Use a unique temporary directory for importlib source
  tests instead of tempfile.tempdir. This prevents the tests from sharing state
  between concurrent executions on the same system.

- Issue #7248: In importlib.test.source.util a try/finally block did not make
  sure that some referenced objects actually were created in the block before
  calling methods on the object.

- Issue #7222: Make thread "reaping" more reliable so that reference
  leak-chasing test runs give sensible results.  The previous method of reaping
  threads could return successfully while some Thread objects were still
  referenced.  This also introduces a new private function:
  ``_thread._count()``.

- Issue #7151: Fixed regrtest -j so that output to stderr from a test no longer
  runs the risk of causing the worker thread to fail.

- Issue #7055: test___all__ now greedily detects all modules which have an
  __all__ attribute, rather than using a hardcoded and incomplete list.

- Issue #7058: Added save/restore for things like sys.argv and cwd to
  runtest_inner in regrtest, with warnings if the called test modifies them, and
  a new section in the summary report at the end.

- Issue #7042: Fix test_signal (test_itimer_virtual) failure on OS X 10.6.

- Fixed tests in importlib.test.source.test_abc_loader that were masking the
  proper exceptions that should be raised for missing or improper code object
  bytecode.

- Removed importlib's custom test discovery code and switched to
  unittest.TestLoader.discover().

Tools/Demos
-----------

- Issue #5464, #8974: Implement plural forms in msgfmt.py.

- iobench (a file I/O benchmark) and ccbench (a concurrency benchmark) were
  added to the `Tools/` directory.  They were previously living in the sandbox.


What's New in Python 3.1?
=========================

*Release date: 27-June-2009*

Core and Builtins
-----------------

- Issue #6334: Fix bug in range length calculation for ranges with
  large arguments.

- Issue #6329: Fixed iteration for memoryview objects (it was being blocked
  because it wasn't recognized as a sequence).

Library
-------

- Issue #6126: Fixed pdb command-line usage.

- Issue #6314: logging: performs extra checks on the "level" argument.

- Issue #6274: Fixed possible file descriptors leak in subprocess.py

- Accessing io.StringIO.buffer now raises an AttributeError instead of
  io.UnsupportedOperation.

- Issue #6271: mmap tried to close invalid file handle (-1) when anonymous.
  (On Unix)

- Issue #1202: zipfile module would cause a struct.error when attempting to
  store files with a CRC32 > 2**31-1.

Extension Modules
-----------------

- Issue #5590: Remove unused global variable in pyexpat extension.


What's New in Python 3.1 Release Candidate 2?
=============================================

*Release date: 13-June-2009*

Core and Builtins
-----------------

- Fixed SystemError triggered by "range([], 1, -1)".

- Issue #5924: On Windows, a large PYTHONPATH environment variable
  (more than 255 characters) would be completely ignored.

- Issue #4547: When debugging a very large function, it was not always
  possible to update the lineno attribute of the current frame.

- Issue #5330: C functions called with keyword arguments were not reported by
  the various profiling modules (profile, cProfile). Patch by Hagen Fürstenau.

Library
-------

- Issue #6438: Fixed distutils.cygwinccompiler.get_versions : the regular
  expression string pattern was trying to match against a bytes returned by
  Popen. Tested under win32 to build the py-postgresql project.

- Issue #6258: Support AMD64 in bdist_msi.

- Issue #6195: fixed doctest to no longer try to read 'source' data from
  binary files.

- Issue #5262: Fixed bug in next rollover time computation in
  TimedRotatingFileHandler.

- Issue #6217: The C implementation of io.TextIOWrapper didn't include the
  errors property.  Additionally, the errors and encoding properties of StringIO
  are always None now.

- Issue #6137: The pickle module now translates module names when loading
  or dumping pickles with a 2.x-compatible protocol, in order to make data
  sharing and migration easier. This behaviour can be disabled using the
  new `fix_imports` optional argument.

- Removed the ipaddr module.

- Issue #3613: base64.{encode,decode}string are now called
  base64.{encode,decode}bytes which reflects what type they accept and return.
  The old names are still there as deprecated aliases.

- Issue #5767: Remove sgmlop support from xmlrpc.client.

- Issue #6150: Fix test_unicode on wide-unicode builds.

- Issue #6149: Fix initialization of WeakValueDictionary objects from non-empty
  parameters.

Windows
-------

- Issue #6221: Delete test registry key before running the test.

- Issue #6158: Package Sine-1000Hz-300ms.aif in MSI file.

C-API
-----

- Issue #5735: Python compiled with --with-pydebug should throw an
  ImportError when trying to import modules compiled without
  --with-pydebug, and vice-versa.


Build
-----

- Issue #6154: Make sure the intl library is added to LIBS if needed. Also
  added LIBS to OS X framework builds.

- Issue #5809: Specifying both --enable-framework and --enable-shared is
  an error. Configure now explicity tells you about this.



What's New in Python 3.1 release candidate 1?
=============================================

*Release date: 2009-05-30*

Core and Builtins
-----------------

- Issue #6097: Escape UTF-8 surrogates resulting from mbstocs conversion
  of the command line.

- Issue #6012: Add cleanup support to O& argument parsing.

- Issue #6089: Fixed str.format with certain invalid field specifiers
  that would raise SystemError.

- Issue #5982: staticmethod and classmethod now expose the wrapped
  function with __func__.

- Added support for multiple context managers in the same with-statement.
  Deprecated contextlib.nested() which is no longer needed.

- Issue #5829: complex("1e500") no longer raises OverflowError.  This
  makes it consistent with float("1e500") and interpretation of real
  and imaginary literals.

- Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.

- Issue #5994: the marshal module now has docstrings.

- Issue #5981: Fix three minor inf/nan issues in float.fromhex:
  (1) inf and nan strings with trailing whitespace were incorrectly
  rejected;  (2) parsing of strings representing infinities and nans
  was locale aware; and (3) the interpretation of fromhex('-nan')
  didn't match that of float('-nan').

Library
-------

- Issue #4859: Implement PEP 383 for pwd, spwd, and grp.

- smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259).

- Issue #6121: pydoc now ignores leading and trailing spaces in the
  argument to the 'help' function.

- Issue #6118: urllib.parse.quote_plus ignored the encoding and errors
  arguments for strings with a space in them.

- collections.namedtuple() was not working with the following field
  names:  cls, self, tuple, itemgetter, and property.

- In unittest, using a skipping decorator on a class is now equivalent to
  skipping every test on the class.  The ClassTestSuite class has been removed.

- Issue #6050: Don't fail extracting a directory from a zipfile if
  the directory already exists.

- Issue #1309352: fcntl now converts its third arguments to a C `long` rather
  than an int, which makes some operations possible under 64-bit Linux (e.g.
  DN_MULTISHOT with F_NOTIFY).

- Issue #5761: Add the name of the underlying file to the repr() of various
  IO objects.

- Issue #5259: smtplib plain auth login no longer gives a traceback.  Fix
  by Musashi Tamura, tests by Marcin Bachry.

- Issue #1983: Fix functions taking or returning a process identifier to use
  the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
  a process identifier type wider than the standard C integer type.

- Issue #4066: smtplib.SMTP_SSL._get_socket now correctly returns the socket.
  Patch by Farhan Ahmad, test by Marcin Bachry.

- Issue #2116: Weak references and weak dictionaries now support copy()ing and
  deepcopy()ing.

- Issue #1655: Make imaplib IPv6-capable. Patch by Derek Morr.

- Issue #5918: Fix a crash in the parser module.

- Issue #1664: Make nntplib IPv6-capable. Patch by Derek Morr.

- Issue #5006: Better handling of unicode byte-order marks (BOM) in the io
  library. This means, for example, that opening an UTF-16 text file in
  append mode doesn't add a BOM at the end of the file if the file isn't
  empty.

- Issue #4050: inspect.findsource/getsource now raise an IOError if the 'source'
  file is a binary.  Patch by Brodie Rao, tests by Daniel Diniz.  This fix
  corrects a pydoc regression.

- Issue #5955: aifc's close method did not close the file it wrapped,
  now it does.  This also means getfp method now returns the real fp.

Installation
------------

- Issue #6047: fullinstall has been removed because Python 3's executable will
  now be known as python3.

- Lib/smtpd.py is no longer installed as a script.

Extension Modules
-----------------

- Issue #3061: Use wcsftime for time.strftime where available.

- Issue #4873: Fix resource leaks in error cases of pwd and grp.

- Issue #6093: Fix off-by-one error in locale.strxfrm.

- The _functools and _locale modules are now built into the libpython shared
  library instead of as extension modules.

Build
-----

- Issue #3585: Add pkg-config support. It creates a python-2.7.pc file
  and a python3.pc symlink in the $(LIBDIR)/pkgconfig directory. Patch by
  Clinton Roy.

Tests
-----

- Issue #5442: Tests for importlib were not properly skipping case-sensitivity
  tests on darwin even when the OS was installed on a case-sensitive
  filesystem. Also fixed tests that should not be run when
  sys.dont_write_bytecode is true.


What's New in Python 3.1 beta 1?
================================

*Release date: 2009-05-06*

Core and Builtins
-----------------

- Issue #5914: Add new C API function PyOS_string_to_double, and
  deprecate PyOS_ascii_strtod and PyOS_ascii_atof.

- Issue #3382: float.__format__, complex.__format__, and %-formatting
  no longer map 'F' to 'f'. Because of issue #5859 (below), this only
  affects nan -> NAN and inf -> INF.

- Issue #5799: ntpath (ie, os.path on Windows) fully supports UNC pathnames
  in all operations, including splitdrive, split, etc.  splitunc() now issues
  a PendingDeprecation warning.

- Issue #5920: For float.__format__, change the behavior with the
  empty presentation type (that is, not one of 'e', 'f', 'g', or 'n')
  to be like 'g' but with at least one decimal point and with a
  default precision of 12. Previously, the behavior the same but with
  a default precision of 6.  This more closely matches str(), and
  reduces surprises when adding alignment flags to the empty
  presentation type. This also affects the new complex.__format__ in
  the same way.

- Implement PEP 383, Non-decodable Bytes in System Character Interfaces.

- Issue #5890: in subclasses of 'property' the __doc__ attribute was
  shadowed by classtype's, even if it was None.  property now
  inserts the __doc__ into the subclass instance __dict__.

- Issue #4426: The UTF-7 decoder was too strict and didn't accept some legal
  sequences. Patch by Nick Barnes and Victor Stinner.

- Issue #3672: Reject surrogates in utf-8 codec; add surrogatepass error handler.

- Issue #5883: In the io module, the BufferedIOBase and TextIOBase ABCs have
  received a new method, detach().  detach() disconnects the underlying stream
  from the buffer or text IO and returns it.

- Issue #5859: Remove switch from '%f' to '%g'-style formatting for
  floats with absolute value over 1e50.  Also remove length
  restrictions for float formatting: '%.67f' % 12.34 and '%.120e' %
  12.34 no longer raise an exception.

- Issue #1588: Add complex.__format__. For example,
  format(complex(1, 2./3), '.5') now produces a sensible result.

- Issue #5864: Fix empty format code formatting for floats so that it
  never gives more than the requested number of significant digits.

- Issue #5793: Rationalize isdigit / isalpha / tolower, etc. Includes
  new Py_ISDIGIT / Py_ISALPHA / Py_TOLOWER, etc. in pctypes.h.

- Issue #5835: Deprecate PyOS_ascii_formatd.

- Issue #4971: Fix titlecase for characters that are their own
  titlecase, but not their own uppercase.

- Issue #5283: Setting __class__ in __del__ caused a segfault.

- Issue #5816: complex(repr(z)) now recovers z exactly, even when
  z involves nans, infs or negative zeros.

- Issue #3166: Make int -> float conversions correctly rounded.

- Issue #1869 (and many duplicates): make round(x, n) correctly
  rounded for a float x, by using the decimal <-> binary conversions
  from Python/dtoa.c.  As a consequence, (e.g.) round(x, 2) now
  consistently agrees with format(x, '.2f').

- Issue #5787: object.__getattribute__(some_type, "__bases__") segfaulted on
  some builtin types.

- Issue #5772: format(1e100, '<') produces '1e+100', not '1.0e+100'.

- Issue #5515: str.format() type 'n' combined with commas and leading
  zeros no longer gives odd results with ints and floats.

- Implement PEP 378, Format Specifier for Thousands Separator, for
  floats.

- The str function switches to exponential notation at
  1e11, not 1e12.  This avoids printing 13 significant digits in
  situations where only 12 of them are correct.  Example problem
  value: str(1e11 + 0.5).  (This minor issue has existed in 2.x for a
  long time.)

- Issue #1580: On most platforms, use a 'short' float repr: for a
  finite float x, repr(x) now outputs a string based on the shortest
  sequence of decimal digits that rounds to x.  Previous behaviour was
  to output 17 significant digits and then strip trailing zeros.
  Another minor difference is that the new repr switches to
  exponential notation at 1e16 instead of the previous 1e17; this
  avoids misleading output in some cases.

  There's a new sys attribute sys.float_repr_style, which takes
  the value 'short' to indicate that we're using short float repr,
  and 'legacy' if the short float repr isn't available for one
  reason or another.

  The float repr change involves incorporating David Gay's 'perfect
  rounding' code into the Python core (it's in Python/dtoa.c).  As a
  secondary consequence, all string-to-float and float-to-string
  conversions (including all float formatting operations) will be
  correctly rounded on these platforms.

  See issue #1580 discussions for details of platforms for which
  this change does not apply.

- Issue #5759: float() didn't call __float__ on str subclasses.

- The string.maketrans() function is deprecated; there is a new static method
  maketrans() on the bytes and bytearray classes.  This removes confusion about
  the types string.maketrans() is supposed to work with, and mirrors the
  methods available on the str class.

- Issue #2170: refactored xml.dom.minidom.normalize, increasing both
  its clarity and its speed.

- Issue #1113244: Py_XINCREF, Py_DECREF, Py_XDECREF: Add ``do { ... } while (0)``
  to avoid compiler warnings.

- Issue #3739: The unicode-internal encoder now reports the number of characters
  consumed like any other encoder (instead of the number of bytes).

Installation
------------

- Issue #5756: Install idle and pydoc with a 3 suffix.

Library
-------

- Issue #8203: Fix IDLE Credits dialog: view_file() uses its encoding argument.

- Issue #5311: bdist_msi can now build packages that do not depend on a
  specific Python version.

- Issue #5150: IDLE's format menu now has an option to strip trailing
  whitespace.

- Issue #5940: distutils.command.build_clib.check_library_list was not doing
  the right type checkings anymore.

- Issue #4875: On win32, ctypes.util.find_library does no longer
  return directories.

- Issue #5142: Add the ability to skip modules while stepping to pdb.

- Issue #1309567: Fix linecache behavior of stripping subdirectories when
  looking for files given by a relative filename.

- Issue #5923: Update the ``turtle`` module to version 1.1, add two new
  turtle demos in Demo/turtle.

- Issue #5692: In ``zipfile.Zipfile``, fix wrong path calculation when
  extracting a file to the root directory.

- Issue #5913: os.listdir() should fail for empty path on windows.

- Issue #5084: unpickling now interns the attribute names of pickled objects,
  saving memory and avoiding growth in size of subsequent pickles. Proposal
  and original patch by Jake McGuire.

- The json module now works exclusively with str and not bytes.

- Issue #3959: The ipaddr module has been added to the standard library.
  Contributed by Google.

- Issue #3002: ``shutil.copyfile()`` and ``shutil.copytree()`` now raise an
  error when a named pipe is encountered, rather than blocking infinitely.

- Issue #5857: tokenize.tokenize() now returns named tuples.

- Issue #4305: ctypes should now build again on mipsel-linux-gnu

- Issue #1734234: Massively speedup ``unicodedata.normalize()`` when the
  string is already in normalized form, by performing a quick check beforehand.
  Original patch by Rauli Ruohonen.

- Issue #5853: calling a function of the mimetypes module from several threads
  at once could hit the recursion limit if the mimetypes database hadn't been
  initialized before.

- Issue #5854: Updated __all__ to include some missing names and remove some
  names which should not be exported.

- Issue #3102:  All global symbols that the _ctypes extension defines
  are now prefixed with 'Py' or '_ctypes'.

- Issue #5041: ctypes does now allow pickling wide character.

- Issue #5812: For the two-argument form of the Fraction constructor,
  Fraction(m, n), m and n are permitted to be arbitrary Rational
  instances.

- Issue #5812: Fraction('1e6') is valid: more generally, any string
  that's valid for float() is now valid for Fraction(), with the
  exception of strings representing NaNs and infinities.

- Issue #5734: BufferedRWPair was poorly tested and had several glaring
  bugs. Patch by Brian Quinlan.

- Issue #1161031: fix readwrite select flag handling: POLLPRI now
  results in a handle_expt_event call, not handle_read_event, and POLLERR
  and POLLNVAL now call handle_close, not handle_expt_event.  Also,
  dispatcher now has an 'ignore_log_types' attribute for suppressing
  log messages, which is set to 'warning' by default.

- Issue #2703: SimpleXMLRPCDispatcher.__init__: Provide default values for
  new arguments introduced in 2.5.

- Issue #5828 (Invalid behavior of unicode.lower): Fixed bogus logic in
  makeunicodedata.py and regenerated the Unicode database (This fixes
  u'\u1d79'.lower() == '\x00').

Extension Modules
-----------------

- Issue #5881: Remove old undocumented compatibility interfaces in hashlib and
  pwd.

- Issue #5463: In struct module, remove deprecated float coercion
  for integer type codes: struct.pack('L', 0.3) should now raise
  an error.  The _PY_STRUCT_FLOAT_COERCE constant has been removed.
  The version number has been bumped to 0.3.

- Issue #5359: Readd the Berkeley DB detection code to allow _dbm be built
  using Berkeley DB.

Tests
-----

- Issue #5354: New test support function import_fresh_module() makes
  it easy to import both normal and optimised versions of modules.
  test_heapq and test_warnings have been adjusted to use it, tests for
  other modules with both C and Python implementations in the stdlib
  can be adjusted to use it over time.

- Issue #5837: Certain sequences of calls to set() and unset() for
  support.EnvironmentVarGuard objects restored the environment variables
  incorrectly on __exit__.

C-API
-----

- Issue #5630: A replacement PyCObject API, PyCapsule, has been added.


What's New in Python 3.1 alpha 2?
=================================

*Release date: 2009-4-4*

Core and Builtins
-----------------

- Implement PEP 378, Format Specifier for Thousands Separator, for
  integers.

- Issue #5666: Py_BuildValue's 'c' code should create byte strings.

- Issue #5499: The 'c' code for argument parsing functions now only accepts a
  byte, and the 'C' code only accepts a unicode character.

- Fix a problem in PyErr_NormalizeException that leads to "undetected errors"
  when hitting the recursion limit under certain circumstances.

- Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.

- Fix a segfault when running test_exceptions with coverage, caused by
  insufficient checks in accessors of Exception.__context__.

- Issue #5604: non-ASCII characters in module name passed to
  imp.find_module() were converted to UTF-8 while the path is
  converted to the default filesystem encoding, causing nonsense.

- Issue #5126: str.isprintable() returned False for space characters.

- Issue #4865: On MacOSX /Library/Python/2.7/site-packages is added to
  the end sys.path, for compatibility with the system install of Python.

- Issue #4688: Add a heuristic so that tuples and dicts containing only
  untrackable objects are not tracked by the garbage collector. This can
  reduce the size of collections and therefore the garbage collection overhead
  on long-running programs, depending on their particular use of datatypes.

- Issue #5512: Rewrite PyLong long division algorithm (x_divrem) to
  improve its performance.  Long divisions and remainder operations
  are now between 50% and 150% faster.

- Issue #4258: Make it possible to use base 2**30 instead of base
  2**15 for the internal representation of integers, for performance
  reasons.  Base 2**30 is enabled by default on 64-bit machines.  Add
  --enable-big-digits option to configure, which overrides the
  default.  Add sys.int_info structseq to provide information about
  the internal format.

- Issue #4474: PyUnicode_FromWideChar now converts characters outside
  the BMP to surrogate pairs, on systems with sizeof(wchar_t) == 4
  and sizeof(Py_UNICODE) == 2.

- Issue #5237: Allow auto-numbered fields in str.format(). For
  example: '{} {}'.format(1, 2) == '1 2'.

- Issue #5392: when a very low recursion limit was set, the interpreter would
  abort with a fatal error after the recursion limit was hit twice.

- Issue #3845: In PyRun_SimpleFileExFlags avoid invalid memory access with
  short file names.

Library
-------

- Issue #2625: added missing items() call to the for loop in
  mailbox.MH.get_message().

- Issue #5640: Fix _multibytecodec so that CJK codecs don't repeat
  error substitutions from non-strict codec error callbacks in
  incrementalencoder and StreamWriter.

- Issue #5656: Fix the coverage reporting when running the test suite with
  the -T argument.

- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.

- Issue #5624: Fix the _winreg module name still used in several modules.

- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.

- Issue #5619: Multiprocessing children disobey the debug flag and causes
  popups on windows buildbots. Patch applied to work around this issue.

- Issue #5400: Added patch for multiprocessing on netbsd compilation/support

- Issue #5387: Fixed mmap.move crash by integer overflow.

- Issue #5261: Patch multiprocessing's semaphore.c to support context
  manager use: "with multiprocessing.Lock()" works now.

- Issue #5236: Change time.strptime() to only take strings. Didn't work with
  bytes already but the failure was non-obvious.

- Issue #5177: Multiprocessing's SocketListener class now uses
  socket.SO_REUSEADDR on all connections so that the user no longer needs
  to wait 120 seconds for the socket to expire.

- Issue #5595: Fix UnboundedLocalError in ntpath.ismount().

- Issue #1174606: Calling read() without arguments of an unbounded file
  (typically /dev/zero under Unix) could crash the interpreter.

- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
  io.BufferedRandom have been deprecated for removal in Python 3.2.

- Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
  forever on incomplete input. That caused tarfile.open() to hang when used
  with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
  partial bzip2 compressed data.

- Issue #2110: Add support for thousands separator and 'n' type
  specifier to Decimal.__format__

- Fix Decimal.__format__ bug that swapped the meanings of the '<' and
  '>' alignment characters.

- The error detection code in FileIO.close() could fail to reflect the `errno`
  value, and report it as -1 instead.

- Issue #5016: FileIO.seekable() could return False if the file position
  was negative when truncated to a C int. Patch by Victor Stinner.

Extension Modules
-----------------

- Issue #5391: mmap now deals exclusively with bytes.

- Issue #5463: In struct module, remove deprecated overflow wrapping
  when packing an integer: struct.pack('=L', -1) now raises
  struct.error instead of returning b'\xff\xff\xff\xff'.  The
  _PY_STRUCT_RANGE_CHECKING and _PY_STRUCT_OVERFLOW_MASKING constants
  have been removed from the struct module.


What's New in Python 3.1 alpha 1
================================

*Release date: 2009-03-07*

Core and Builtins
-----------------

- The io module has been reimplemented in C for speed.

- Give dict views an informative __repr__.

- Issue #5247: Improve error message when unknown format codes are
  used when using str.format() with str, int, and float arguments.

- Issue #5249: time.strftime returned malformed string when format string
  contained non ascii character on windows.

- Issue #4626: compile(), exec(), and eval() ignore the coding cookie if the
  source has already been decoded into str.

- Issue #5186: Reduce hash collisions for objects with no __hash__ method by
  rotating the object pointer by 4 bits to the right.

- Issue #4575: Fix Py_IS_INFINITY macro to work correctly on x87 FPUs:
  it now forces its argument to double before testing for infinity.

- Issue #5137: Make len() correctly raise a TypeError when a __len__ method
  returns a non-number type.

- Issue #5182: Removed memoryview.__str__.

- Issue #1717: Removed builtin cmp() function, dropped tp_compare
  slot, the C API functions PyObject_Compare and PyUnicode_Compare and
  the type definition cmpfunc.  The tp_compare slot has been renamed
  to tp_reserved, and is reserved for future usage.

- Issue #1242657: the __len__() and __length_hint__() calls in several tools
  were suppressing all exceptions.  These include list() and bytearray().

- Issue #4707: round(x, n) now returns an integer if x is an integer.
  Previously it returned a float.

- Issue #4753: By enabling a configure option named '--with-computed-gotos'
  on compilers that support it (notably: gcc, SunPro, icc), the bytecode
  evaluation loop is compiled with a new dispatch mechanism which gives
  speedups of up to 20%, depending on the system, on various benchmarks.

- Issue #4874: Most builtin decoders now reject unicode input.

- Issue #4842: Don't allow trailing 'L' when constructing an integer
  from a string.

- Issue #4991: os.fdopen now raises an OSError for invalid file descriptors.

- Issue #4838: When a module is deallocated, free the memory backing the
  optional module state data.

- Issue #4910: Rename nb_long slot to nb_reserved, and change its
  type to ``(void *)``.

- Issue #4935: The overflow checking code in the expandtabs() method common
  to str, bytes and bytearray could be optimized away by the compiler, letting
  the interpreter segfault instead of raising an error.

- Issue #3720: Fix a crash when an iterator modifies its class and removes its
  __next__ method.

- Issue #4910: Builtin int() function and PyNumber_Long/PyNumber_Int API
  function no longer attempt to call the __long__ slot to convert an object
  to an integer.  Only the __int__ and __trunc__ slots are examined.

- Issue #4893: Use NT threading on CE.

- Issue #4915: Port sysmodule to Windows CE.

- Issue #4868: utf-8, utf-16 and latin1 decoding are now 2x to 4x faster. The
  common cases are optimized thanks to a dedicated fast path and a moderate
  amount of loop unrolling.

- Issue #4074: Change the criteria for doing a full garbage collection (i.e.
  collecting the oldest generation) so that allocating lots of objects without
  destroying them does not show quadratic performance. Based on a proposal by
  Martin von Löwis at
  http://mail.python.org/pipermail/python-dev/2008-June/080579.html.

- Issue #4604: Some objects of the I/O library could still be used after
  having been closed (for instance, a read() call could return some
  previously buffered data). Patch by Dmitry Vasiliev.

- Issue #4705: Fix the -u ("unbuffered binary stdout and stderr") command-line
  flag to work properly. Furthermore, when specifying -u, the text stdout
  and stderr streams have line-by-line buffering enabled (the default being
  to buffer arbitrary chunks of data).

- The internal table, _PyLong_DigitValue, is now an array of unsigned chars
  instead of ints (reducing its size from 4 to 8 times thereby reducing
  Python's overall memory).

- Issue #1180193: When importing a module from a .pyc (or .pyo) file with
  an existing .py counterpart, override the co_filename attributes of all
  code objects if the original filename is obsolete (which can happen if the
  file has been renamed, moved, or if it is accessed through different paths).
  Patch by Ziga Seilnacht and Jean-Paul Calderone.

- Issue #4580: Fix slicing of memoryviews when the item size is greater than
  one byte. Also fixes the meaning of len() so that it returns the number of
  items, rather than the size in bytes.

- Issue #4075: Use OutputDebugStringW in Py_FatalError.

- Issue #4747: When the terminal does not use utf-8, executing a script with
  non-ascii characters in its name could fail with a "SyntaxError: None" error.

- Issue #4797: IOError.filename was not set when ``_fileio.FileIO`` failed
  to open file with a bytes filename on Windows.

- Issue #3680: Reference cycles created through a dict, set or deque iterator
  did not get collected.

- Issue #4701: PyObject_Hash now implicitly calls PyType_Ready on types
  where the tp_hash and tp_dict slots are both NULL.

- Issue #4759: None is now allowed as the first argument of
  bytearray.translate().  It was always allowed for bytes.translate().

- Added test case to ensure attempts to read from a file opened for writing
  fail.

- Issue #3106: Speedup some comparisons (str/str and int/int).

- Issue #2183: Simplify and optimize bytecode for list, dict and set
  comprehensions. Original patch for list comprehensions by Neal Norwitz.

- Issue #2467: gc.DEBUG_STATS reported invalid elapsed times. Also, always
  print elapsed times, not only when some objects are uncollectable /
  unreachable. Original patch by Neil Schemenauer.

- Issue #3439: Add a bit_length method to int.

- Issue #2173: When getting device encoding, check that return value of
  nl_langinfo is not the empty string.  This was causing silent build
  failures on OS X.

- Issue #4597: Fixed several opcodes that weren't always propagating
  exceptions.

- Issue #4589: Fixed exception handling when the __exit__ function of a
  context manager returns a value that cannot be converted to a bool.

- Issue #4445: Replace "sizeof(PyBytesObject)" with
  "offsetof(PyBytesObject, ob_sval) + 1" when allocating memory for
  bytes instances.  On a typical machine this saves 3 bytes of memory
  (on average) per allocation of a bytes instance.

- Issue #4533: File read operation was dreadfully slow due to a slowly
  growing read buffer. Fixed by using the same growth rate algorithm as
  Python 2.x.

- Issue #4509: Various issues surrounding resize of bytearray objects to
  which there are buffer exports (e.g. memoryview instances).

- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()``
  method on file objects with closefd=False. The file descriptor is still
  kept open but the file object behaves like a closed file. The ``FileIO``
  object also got a new readonly attribute ``closefd``.

- Issue #4569: Interpreter crash when mutating a memoryview with an item size
  larger than 1.

- Issue #4748: Lambda generators no longer return a value.

- The re.sub(), re.subn() and re.split() functions now accept a flags parameter.

- Issue #5108: Handle %s like %S, %R and %A in PyUnicode_FromFormatV(): Call
  PyUnicode_DecodeUTF8() once, remember the result and output it in a second
  step. This avoids problems with counting UTF-8 bytes that ignores the effect
  of using the replace error handler in PyUnicode_DecodeUTF8().

Library
-------

- Issue #7071: byte-compilation in Distutils is now done with respect to
  sys.dont_write_bytecode.

- Issue #7066: archive_util.make_archive now restores the cwd if an error is
  raised. Initial patch by Ezio Melotti.

- Issue #6516: Added owner/group support when creating tar archives in
  Distutils.

- Issue #6954: Fixed crash when using DISTUTILS_DEBUG flag in Distutils.

- Issue #6163: Fixed HP-UX runtime library dir options in
  distutils.unixcompiler. Initial patch by Sridhar Ratnakumar and
  Michael Haubenwallner.

- Issue #6693: New functions in site.py to get user/global site packages paths.

- Issue #6511: ZipFile now raises BadZipfile (instead of an IOError) when
  opening an empty or very small file.

- Issue #6545: Removed assert statements in distutils.Extension, so the
  behavior is similar when used with -O.

- unittest has been split up into a package.  All old names should still work.

- Issue #6466: now distutils.cygwinccompiler and distutils.emxccompiler
  uses the same refactored function to get gcc/ld/dllwrap versions numbers.
  It's `distutils.util.get_compiler_versions`. Added deprecation warnings
  for the obsolete get_versions() functions.

- Issue #6433: fixed issues with multiprocessing.pool.map hanging on empty list

- Issue #6314: logging: Extra checks on the "level" argument in more places.

- Issue #2622: Fixed an ImportError when importing email.message from a
  standalone application built with py2exe or py2app.

- Issue #6455: Fixed test_build_ext under win32.

- Issue #6377: Enabled the compiler option, and deprecate its usage as an
  attribute.

- Issue #6413: Fixed the log level in distutils.dist for announce.

- Issue #6403: Fixed package path usage in build_ext.

- Issues #5155, 5313, 5331: multiprocessing.Process._bootstrap was
  unconditionally calling "os.close(sys.stdin.fileno())" resulting in file
  descriptor errors

- Issue #6365: Distutils build_ext inplace mode was copying the compiled
  extension in a subdirectory if the extension name had dots.

- Issue #6164: Added an AIX specific linker argument in Distutils
  unixcompiler. Original patch by Sridhar Ratnakumar.

- Issue #6286: Now Distutils upload command is based on urllib2 instead of
  httplib, allowing the usage of http_proxy.

- Issue #6287: Added the license field in Distutils documentation.

- Issue #6263: Fixed syntax error in distutils.cygwincompiler.

- Issue #5201: distutils.sysconfig.parse_makefile() now understands `$$`
  in Makefiles. This prevents compile errors when using syntax like:
  `LDFLAGS='-rpath=\$$LIB:/some/other/path'`. Patch by Floris Bruynooghe.

- Issue #6131: test_modulefinder leaked when run after test_distutils.
  Patch by Hirokazu Yamamoto.

- Issue #6048: Now Distutils uses the tarfile module in archive_util.

- Issue #6062: In distutils, fixed the package option of build_ext. Feedback
  and tests on pywin32 by Tim Golden.

- Issue #6053: Fixed distutils tests on win32. patch by Hirokazu Yamamoto.

- Issue #6046: Fixed the library extension when distutils build_ext is used
  inplace. Initial patch by Roumen Petrov.

- Issue #6041: Now distutils `sdist` and `register` commands use `check` as a
  subcommand.

- Issue #6022: a test file was created in the current working directory by
  test_get_outputs in Distutils.

- Issue #5977: distutils build_ext.get_outputs was not taking into account the
  inplace option. Initial patch by kxroberto.

- Issue #5984: distutils.command.build_ext.check_extensions_list checks were broken
  for old-style extensions.

- Issue #5976: Fixed Distutils test_check_environ.

- Issue #5941: Distutils build_clib command was not working anymore because
  of an incomplete costumization of the archiver command. Added ARFLAGS in the
  Makefile besides AR and make Distutils use it. Original patch by David
  Cournapeau.

- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec.

- Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive
  anymore.

- Issue #5810: Fixed Distutils test_build_scripts so it uses
  sysconfig.get_config_vars.

- Issue #4951: Fixed failure in test_httpservers.

- Issue #5795: Fixed test_distutils failure on Debian ppc.

- Issue #5607: fixed Distutils test_get_platform for Mac OS X fat binaries.

- Issue #5741: don't disallow "%%" (which is an escape for "%") when setting
  a value in SafeConfigParser.

- Issue #5732: added a new command in Distutils: check.

- Issue #5731: Distutils bdist_wininst no longer worked on non-Windows
  platforms. Initial patch by Paul Moore.

- Issue #5095: Added bdist_msi to the list of bdist supported formats.
  Initial fix by Steven Bethard.

- Issue #1491431: Fixed distutils.filelist.glob_to_re for edge cases.
  Initial fix by Wayne Davison.

- Issue #5694: removed spurious test output in Distutils (test_clean).

- Issue #1326077: fix the formatting of SyntaxErrors by the traceback module.

- Issue #1665206 (partially): Move imports in cgitb to the top of the module
  instead of performing them in functions. Helps prevent import deadlocking in
  threads.

- Issue #2522: locale.format now checks its first argument to ensure it has
  been passed only one pattern, avoiding mysterious errors where it appeared
  that it was failing to do localization.

- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
  Brandl.

- Issue #1222: locale.format() bug when the thousands separator is a space
  character.

- Issue #5472: Fixed distutils.test_util tear down. Original patch by
  Tim Golden.

- collections.deque() objects now have a read-only attribute called maxlen.

- Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after
  it is has been populated and properly configured in order to prevent
  window flashing.

- Issue #4792: Prevent a segfault in _tkinter by using the
  guaranteed to be safe interp argument given to the PythonCmd in place of
  the Tcl interpreter taken from a PythonCmd_ClientData.

- Issue #5193: Guarantee that tkinter.Text.search returns a string.

- Issue #5394: removed > 2.3 syntax from distutils.msvc9compiler.
  Original patch by Akira Kitada.

- Issue #5334: array.fromfile() failed to insert values when EOFError was raised.

- Issue #5385: Fixed mmap crash after resize failure on windows.

- Issue #5179: Fixed subprocess handle leak on failure on windows.

- PEP 372:  Added collections.OrderedDict().

- The _asdict() for method for namedtuples now returns an OrderedDict().

- configparser now defaults to using an ordered dictionary.

- Issue #5401: Fixed a performance problem in mimetypes when ``from mimetypes
  import guess_extension`` was used.

- Issue #1733986: Fixed mmap crash in accessing elements of second map object
  with same tagname but larger size than first map. (Windows)

- Issue #5386: mmap.write_byte didn't check map size, so it could cause buffer
  overrun.

- Issue #1533164: Installed but not listed ``*.pyo`` was breaking Distutils
  bdist_rpm command.

- Issue #5378: added --quiet option to Distutils bdist_rpm command.

- Issue #5052: make Distutils compatible with 2.3 again.

- Issue #5316: Fixed buildbot failures introduced by multiple inheritance
  in Distutils tests.

- Issue #5287: Add exception handling around findCaller() call to help out
  IronPython.

- Issue #5282: Fixed mmap resize on 32bit windows and unix. When offset > 0,
  The file was resized to wrong size.

- Issue #5292: Fixed mmap crash on its boundary access m[len(m)].

- Issue #2279: distutils.sdist.add_defaults now add files
  from the package_data and the data_files metadata.

- Issue #5257: refactored all tests in distutils, so they use
  support.TempdirManager, to avoid writing in the tests directory.

- Issue #4524: distutils build_script command failed with --with-suffix=3.
  Initial patch by Amaury Forgeot d'Arc.

- Issue #2461: added tests for distutils.util

- Issue #4998: The memory saving effect of __slots__ had been lost on Fractions
  which inherited from numbers.py which did not have __slots__ defined.  The
  numbers hierarchy now has its own __slots__ declarations.

- Issue #4631: Fix urlopen() result when an HTTP response uses chunked
  encoding.

- Issue #5203: Fixed ctypes segfaults when passing a unicode string to a
  function without argtypes (only occurs if HAVE_USABLE_WCHAR_T is false).

- Issue #3386: distutils.sysconfig.get_python_lib prefix argument was ignored
  under NT and OS2. Patch by Philip Jenvey.

- Issue #5128: Make compileall properly inspect bytecode to determine if needs
  to be recreated. This avoids a timing hole thanks to the old reliance on the
  ctime of the files involved.

- Issue #5122: Synchronize tk load failure check to prevent a potential
  deadlock.

- Issue #1818: collections.namedtuple() now supports a keyword argument
  'rename' which lets invalid fieldnames be automatically converted to
  positional names in the form, _1, _2, ...

- Issue #4890: Handle empty text search pattern in Tkinter.Text.search.

- Issue #4512 (part 2): Promote ``ZipImporter._get_filename()`` to be a
  public documented method ``ZipImporter.get_filename()``.

- Issue #4195: The ``runpy`` module (and the ``-m`` switch) now support
  the execution of packages by looking for and executing a ``__main__``
  submodule when a package name is supplied. Initial patch by Andi
  Vajda.

- Issue #1731706: Call Tcl_ConditionFinalize for Tcl_Conditions that will
  not be used again (this requires Tcl/Tk 8.3.1), also fix a memory leak in
  Tkapp_Call when calling from a thread different than the one that created
  the Tcl interpreter. Patch by Robert Hancock.

- Issue #4285: Change sys.version_info to be a named tuple. Patch by
  Ross Light.

- Issue #1520877: Now distutils.sysconfig reads $AR from the
  environment/Makefile. Patch by Douglas Greiman.

- Issue #1276768: The verbose option was not used in the code of
  distutils.file_util and distutils.dir_util.

- Issue #5132: Fixed trouble building extensions under Solaris with
  --enabled-shared activated. Initial patch by Dave Peterson.

- Issue #1581476: Always use the Tcl global namespace when calling into Tcl.

- The shelve module now defaults to pickle protocol 3.

- Fix a bug in the trace module where a bytes object from co_lnotab had its
  items being passed through ord().

- Issue #2047: shutil.move() could believe that its destination path was
  inside its source path if it began with the same letters (e.g. "src" vs.
  "src.new").

- Added the ttk module. See issue #2983: Ttk support for Tkinter.

- Removed isSequenceType(), isMappingType, and isNumberType() from the
  operator module; use the abstract base classes instead.  Also removed
  the repeat() function; use mul() instead.

- Issue #5021:  doctest.testfile() did not create __name__ and
  collections.namedtuple() relied on __name__ being defined.

- Backport importlib from Python 3.1. Only the import_module() function has
  been backported to help facilitate transitions from 2.7 to 3.1.

- Issue #1885: distutils. When running sdist with --formats=tar,gztar
  the tar file was overriden by the gztar one.

- Issue #4863: distutils.mwerkscompiler has been removed.

- Added a new itertools functions:  combinations_with_replacement()
  and compress().

- Issue #5032:  added a step argument to itertools.count() and
  allowed non-integer arguments.

- Fix and properly document the multiprocessing module's logging
  support, expose the internal levels and provide proper usage
  examples.

- Issue #1672332: fix unpickling of subnormal floats, which was
  producing a ValueError on some platforms.

- Issue #3881: Help Tcl to load even when started through the
  unreadable local symlink to "Program Files" on Vista.

- Issue #4710: Extract directories properly in the zipfile module;
  allow adding directories to a zipfile.

- Issue #3807: _multiprocessing build fails when configure is passed
  --without-threads argument. When this occurs, _multiprocessing will
  be disabled, and not compiled.

- Issue #5008: When a file is opened in append mode with the new IO library,
  do an explicit seek to the end of file (so that e.g. tell() returns the
  file size rather than 0). This is consistent with the behaviour of the
  traditional 2.x file object.

- Issue #5013: Fixed a bug in FileHandler which occurred when the delay
  parameter was set.

- Issue #4842: Always append a trailing 'L' when pickling longs using
  pickle protocol 0.  When reading, the 'L' is optional.

- Add the importlib package.

- Issue #4301: Patch the logging module to add processName support, remove
  _check_logger_class from multiprocessing.

- Issue #3325: Remove python2.x try: except: imports for old cPickle from
  multiprocessing.

- Issue #4959: inspect.formatargspec now works for keyword only arguments
  without defaults.

- Issue #3321: ``_multiprocessing.Connection()`` doesn't check handle; added checks
  for Unix machines for negative handles and large int handles. Without this check
  it is possible to segfault the interpreter.

- Issue #4449: AssertionError in mp_benchmarks.py, caused by an underlying issue
  in sharedctypes.py.

- Issue #1225107: inspect.isclass() returned True for instances with a custom
  __getattr__.

- Issue #3826 and #4791: The socket module now closes the underlying socket
  appropriately when it is being used via socket.makefile() objects
  rather than delaying the close by waiting for garbage collection to do it.

- Issue #1696199:  Add collections.Counter() for rapid and convenient
  counting.

- Issue #3860: GzipFile and BZ2File now support the context manager protocol.

- Issue #4867: Fixed a crash in ctypes when passing a string to a
  function without defining argtypes.

- Issue #4272: Add an optional argument to the GzipFile constructor to override
  the timestamp in the gzip stream. The default value remains the current time.
  The information can be used by e.g. gunzip when decompressing. Patch by
  Jacques Frechet.

- Restore Python 2.3 compatibility for decimal.py.

- Issue #3638: Remove functions from _tkinter module level that depend on
  TkappObject to work with multiple threads.

- Issue #4718: Adapt the wsgiref package so that it actually works with
  Python 3.x, in accordance with the `official amendments of the spec
  <http://www.wsgi.org/wsgi/Amendments_1.0>`_.

- Issue #4796: Added Decimal.from_float() and Context.create_decimal_from_float()
  to the decimal module.

- Fractions.from_float() no longer loses precision for integers too big to
  cast as floats.

- Issue #4812: add missing underscore prefix to some internal-use-only
  constants in the decimal module.  (Dec_0 becomes _Dec_0, etc.)

- Issue #4790: The nsmallest() and nlargest() functions in the heapq module
  did unnecessary work in the common case where no key function was specified.

- Issue #4795: inspect.isgeneratorfunction() returns False instead of None when
  the function is not a generator.

- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
  no MSVC compiler is found under Windows. Original patch by Philip Jenvey.

- Issue #4646: distutils was choking on empty options arg in the setup
  function. Original patch by Thomas Heller.

- Issue #3767: Convert Tk object to string in tkColorChooser.

- Issue #3248: Allow placing ScrolledText in a PanedWindow.

- Issue #4444: Allow assertRaises() to be used as a context handler, so that
  the code under test can be written inline if more practical.

- Issue #4739: Add pydoc help topics for symbols, so that e.g. help('@')
  works as expected in the interactive environment.

- Issue #4756: zipfile.is_zipfile() now supports file-like objects. Patch by
  Gabriel Genellina.

- Issue #4574: reading an UTF16-encoded text file crashes if \r on 64-char
  boundary.

- Issue #4223: inspect.getsource() will now correctly display source code
  for packages loaded via zipimport (or any other conformant PEP 302
  loader). Original patch by Alexander Belopolsky.

- Issue #4201: pdb can now access and display source code loaded via
  zipimport (or any other conformant PEP 302 loader). Original patch by
  Alexander Belopolsky.

- Issue #4197: doctests in modules loaded via zipimport (or any other PEP
  302 conformant loader) will now work correctly in most cases (they
  are still subject to the constraints that exist for all code running
  from inside a module loaded via a PEP 302 loader and attempting to
  perform IO operations based on __file__). Original patch by
  Alexander Belopolsky.

- Issues #4082 and #4512: Add runpy support to zipimport in a manner that
  allows backporting to maintenance branches. Original patch by
  Alexander Belopolsky.

- Issue #4163: textwrap module: allow word splitting on a hyphen preceded by
  a non-ASCII letter.

- Issue #4616: TarFile.utime(): Restore directory times on Windows.

- Issue #4021: tokenize.detect_encoding() now raises a SyntaxError when the
  codec cannot be found.  This is for compatibility with the builtin behavior.

- Issue #4084: Fix max, min, max_mag and min_mag Decimal methods to
  give correct results in the case where one argument is a quiet NaN
  and the other is a finite number that requires rounding.

- Issue #4483: _dbm module now builds on systems with gdbm & gdbm_compat
  libs.

- Added the subprocess.check_call_output() convenience function to get output
  from a subprocess on success or raise an exception on error.

- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
  support unusual filenames (such as those containing semi-colons) in
  Content-Disposition headers.

- Issue #4384: Added logging integration with warnings module using
  captureWarnings(). This change includes a NullHandler which does nothing;
  it will be of use to library developers who want to avoid the "No handlers
  could be found for logger XXX" message which can appear if the library user
  doesn't configure logging.

- Issue #3741: DISTUTILS_USE_SDK set causes msvc9compiler.py to raise an
  exception.

- Issue #4529: fix the parser module's validation of try-except-finally
  statements.

- Issue #4458: getopt.gnu_getopt() now recognizes a single "-" as an argument,
  not a malformed option.

- Added the subprocess.check_output() convenience function to get output
  from a subprocess on success or raise an exception on error.

- Issue #4542: On Windows, binascii.crc32 still accepted str as binary input;
  the corresponding tests now pass.

- Issue #4537: webbrowser.UnixBrowser would fail to open the browser because
  it was calling the wrong open() function.

- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
  support unusual filenames (such as those containing semi-colons) in
  Content-Disposition headers.

- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
  biarch systems. Try to rely on ldconfig only, without using objdump and gcc.

- Issue #5104: The socket module now raises OverflowError when 16-bit port and
  protocol numbers are supplied outside the allowed 0-65536 range on bind()
  and getservbyport().

- Windows locale mapping updated to Vista.

Tools/Demos
-----------

- Issue #4704: remove use of cmp() in pybench, bump its version number to 2.1,
  and make it 2.6-compatible.

- Ttk demos added in Demo/tkinter/ttk/

- Issue #4677: add two list comprehension tests to pybench.


Build
-----

- Issue #6094: Build correctly with Subversion 1.7.

- Issue #5847: Remove -n switch on "Edit with IDLE" menu item.

- Issue #5726: Make Modules/ld_so_aix return the actual exit code of the
  linker, rather than always exit successfully. Patch by Floris Bruynooghe.

- Issue #4587: Add configure option --with-dbmliborder=db1:db2:... to specify
  the order that backends for the dbm extension are checked.

- Link the shared python library with $(MODLIBS).

- Issue #5134: Silence compiler warnings when compiling sqlite with VC++.

- Issue #4494: Fix build with Py_NO_ENABLE_SHARED on Windows.

- Issue #4895: Use _strdup on Windows CE.

- Issue #4472: "configure --enable-shared" now works on OSX

- Issues #4728 and #4060: WORDS_BIGEDIAN is now correct in Universal builds.

- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".

- Issue #4289: Remove Cancel button from AdvancedDlg.

- Issue #1656675: Register a drop handler for .py* files on Windows.

- Issue #4120: Exclude manifest from extension modules in VS2008.

- Issue #4091: Install pythonxy.dll in system32 again.

- Issue #4018: Disable "for me" installations on Vista.

- Issue #3758: Add ``patchcheck`` build target to .PHONY.

- Issue #4204: Fixed module build errors on FreeBSD 4.


C-API
-----

- Issue #6624: yArg_ParseTuple with "s" format when parsing argument with
  NUL: Bogus TypeError detail string.

- Issue #5175: PyLong_AsUnsignedLongLong now raises OverflowError
  for negative arguments.  Previously, it raised TypeError.

- Issue #4720: The format for PyArg_ParseTupleAndKeywords can begin with '|'.

- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
  the GIL is released, or owned by another thread.

- Issue #4122: On Windows, fix a compilation error when using the
  Py_UNICODE_ISSPACE macro in an extension module.


Extension Modules
-----------------

- Issue #3745: Fix hashlib to always reject unicode and non buffer-api
  supporting objects as input no matter how it was compiled (built in
  implementations or external openssl library).

- Issue #4397: Fix occasional test_socket failure on OS X.

- Issue #4279: Fix build of parsermodule under Cygwin.

- Issue #4751: hashlib now releases the GIL when hashing large buffers
  (with a hardwired threshold of 2048 bytes), allowing better parallelization
  on multi-CPU systems. Contributed by Lukas Lueg (ebfe) and Victor Stinner.

- Issue #4051: Prevent conflict of UNICODE macros in cPickle.

- Issue #4738: Each zlib object now has a separate lock, allowing to compress
  or decompress several streams at once on multi-CPU systems. Also, the GIL
  is now released when computing the CRC of a large buffer. Patch by ebfe.

- Issue #4228: Pack negative values the same way as 2.4 in struct's L format.

- Issue #1040026: Fix os.times result on systems where HZ is incorrect.

- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
  OpenBSD.

- Issue #4583: array.array would not always prohibit resizing when a buffer
  has been exported, resulting in an interpreter crash when accessing the
  buffer.


- Issue #5228: Make functools.partial objects can now be pickled.

Tests
-----

- Issue #6152: New option '-j'/'--multiprocess' for regrtest allows running
  regression tests in parallel, shortening the total runtime.

- Issue #5450: Moved tests involving loading tk from Lib/test/test_tcl to
  Lib/tkinter/test/test_tkinter/test_loadtk. With this, these tests demonstrate
  the same behaviour as test_ttkguionly (and now also test_tk) which is to
  skip the tests if DISPLAY is defined but can't be used.

- regrtest no longer treats ImportError as equivalent to SkipTest.  Imports
  that should cause a test to be skipped are now done using import_module
  from test support, which does the conversion.

- Issue #5083: New 'gui' resource for regrtest.


Docs
----


What's New in Python 3.0 final
==============================

*Release date: 03-Dec-2008*

Core and Builtins
-----------------

- Issue #3996: On Windows, the PyOS_CheckStack function would cause the
  interpreter to abort ("Fatal Python error: Could not reset the stack!")
  instead of throwing a MemoryError.

- Issue #3689: The list reversed iterator now supports __length_hint__
  instead of __len__.  Behavior now matches other reversed iterators.

- Issue #4367: Python would segfault during compiling when the unicodedata
  module couldn't be imported and \N escapes were present.

- Fix build failure of _cursesmodule.c building with -D_FORTIFY_SOURCE=2.

Library
-------

- Issue #4387: binascii now refuses to accept str as binary input.

- Issue #4073: Add 2to3 support to build_scripts, refactor that support
  in build_py.

- IDLE would print a "Unhandled server exception!" message when internal
  debugging is enabled.

- Issue #4455: IDLE failed to display the windows list when two windows have
  the same title.

- Issue #3741: DISTUTILS_USE_SDK set causes msvc9compiler.py to raise an
  exception.

- Issue #4433: Fixed an access violation when garbage collecting
  _ctypes.COMError instances.

- Issue #4429: Fixed UnicodeDecodeError in ctypes.

- Issue #4373: Corrected a potential reference leak in the pickle module and
  silenced a false positive ref leak in distutils.tests.test_build_ext.

- Issue #4382: dbm.dumb did not specify the expected file encoding for opened
  files.

- Issue #4383: When IDLE cannot make the connection to its subprocess, it would
  fail to properly display the error message.

Build
-----

- Issue #4407: Fix source file that caused the compileall step in Windows installer
  to fail.

Docs
----

- Issue #4449: Fixed multiprocessing examples

- Issue #3799: Document that dbm.gnu and dbm.ndbm will accept string arguments
  for keys and values which will be converted to bytes before committal.


What's New in Python 3.0 release candidate 3?
=============================================

*Release date: 20-Nov-2008*


Core and Builtins
-----------------

- Issue #4349: sys.path included a non-existent platform directory because of a
  faulty Makefile.

- Issue #3327: Don't overallocate in the modules_by_index list.

- Issue #1721812:  Binary set operations and copy() returned the input type
  instead of the appropriate base type.  This was incorrect because set
  subclasses would be created without their __init__() method being called.
  The corrected behavior brings sets into line with lists and dicts.

- Issue #4296: Fix PyObject_RichCompareBool so that "x in [x]" evaluates to
  True, even when x doesn't compare equal to itself.  This was a regression
  from 2.6.

- Issue #3705: Command-line arguments were not correctly decoded when the
  terminal does not use UTF8.

Library
-------

- Issue #4363: The uuid.uuid1() and uuid.uuid4() functions now work even if
  the ctypes module is not present.

- FileIO's mode attribute now always includes ``"b"``.

- Issue #3799: Fix dbm.dumb to accept strings as well as bytes for keys. String
  keys are now written out in UTF-8.

- Issue #4338: Fix distutils upload command.

- Issue #4354: Fix distutils register command.

- Issue #4116: Resolve member name conflict in ScrolledCanvas.__init__.

- Issue #4307: The named tuple that ``inspect.getfullargspec()`` returns now
  uses ``kwonlydefaults`` instead of ``kwdefaults``.

- Issue #4298: Fix a segfault when pickle.loads is passed a ill-formed input.

- Issue #4283: Fix a left-over "iteritems" call in distutils.

Build
-----

- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".

- Issue #4289: Remove Cancel button from AdvancedDlg.

- Issue #1656675: Register a drop handler for .py* files on Windows.

Tools/Demos
-----------

- Demos of the socketserver module now work with Python 3.


What's New in Python 3.0 release candidate 2
============================================

*Release date: 05-Nov-2008*

Core and Builtins
-----------------

- Issue #4211: The __path__ attribute of frozen packages is now a list instead
  of a string as required by PEP 302.

- Issue #3727: Fixed poplib.

- Issue #3714: Fixed nntplib by using bytes where appropriate.

- Issue #1210: Fixed imaplib and its documentation.

- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()`` 
  method on file objects with closefd=False. The file descriptor is still
  kept open but the file object behaves like a closed file. The ``FileIO``
  object also got a new readonly attribute ``closefd``.

- Issue #3626: On cygwin, starting python with a non-existent script name
  would not display anything if the file name is only 1 character long.

- Issue #4176: Fixed a crash when pickling an object which ``__reduce__``
  method does not return iterators for the 4th and 5th items.

- Issue #3723: Fixed initialization of subinterpreters.

- Issue #4213: The file system encoding is now normalized by the
  codec subsystem, for example UTF-8 is turned into utf-8.

- Issue #4200: Changed the atexit module to store its state in its
  PyModuleDef atexitmodule. This fixes a bug with multiple subinterpeters.

- Issue #4237: io.FileIO() was raising invalid warnings caused by
  insufficient initialization of PyFileIOObject struct members.

- Issue #4170: Pickling a collections.defaultdict object would crash the
  interpreter.

- Issue #4146: Compilation on OpenBSD has been restored.

- Issue #3574: compile() incorrectly handled source code encoded as Latin-1.

- Issues #2384 and #3975: Tracebacks were not correctly printed when the
  source file contains a ``coding:`` header: the wrong line was displayed, and
  the encoding was not respected.

- Issue #3740: Null-initialize module state.

- Issue #3946: PyObject_CheckReadBuffer crashed on a memoryview object.

- Issue #1688: On Windows, the input() prompt was not correctly displayed if it
  contains non-ascii characters.

- Bug #3951: Py_USING_MEMORY_DEBUGGER should not be enabled by default.

Library
-------

- Issue #3664: The pickle module could segfault if a subclass of Pickler fails
  to call the base __init__ method.

- Issue #3725: telnetlib now works completely in bytes.

- Issue #4072: Restore build_py_2to3.

- Issue #4014: Don't claim that Python has an Alpha release status, in addition
  to claiming it is Mature.

- Issue #3187: Add sys.setfilesystemencoding.

- Issue #3187: Better support for "undecodable" filenames.  Code by Victor
  Stinner, with small tweaks by GvR.

- Issue #3965: Allow repeated calls to turtle.Screen, by making it a
  true singleton object.

- Issue #3911: ftplib.FTP.makeport() could give invalid port numbers.

- Issue #3929: When the database cannot be opened, dbm.open() would incorrectly
  raise a TypeError: "'tuple' object is not callable" instead of the expected
  dbm.error.

- Bug #3884: Make the turtle module toplevel again.

- Issue #3547: Fixed ctypes structures bitfields of varying integer
  sizes.

Extension Modules
-----------------

- Issue #3659: Subclasses of str didn't work as SQL parameters.

Build
-----

- Issue #4120: Exclude manifest from extension modules in VS2008.

- Issue #4091: Install pythonxy.dll in system32 again.

- Issue #4018: Disable "for me" installations on Vista.

- Issue #4204: Fixed module build errors on FreeBSD 4.

Tools/Demos
-----------

- Issue #3717: Fix Demo/embed/demo.c.

- Issue #4072: Add a distutils demo for build_py_2to3.


What's New in Python 3.0 release candidate 1
============================================

*Release date: 17-Sep-2008*

Core and Builtins
-----------------

- Issue #3827: memoryview lost its size attribute in favor of using len(view).

- Issue #3813: could not lanch python.exe via symbolic link on cygwin.

- Issue #3705: fix crash when given a non-ascii value on the command line for
  the "-c" and "-m" parameters. Now the behaviour is as expected under Linux,
  although under Windows it fails at a later point.

- Issue #3279: Importing site at interpreter was failing silently because the
  site module uses the open builtin which was not initialized at the time.

- Issue #3660: Corrected a reference leak in str.encode() when the encoder
  does not return a bytes object.

- Issue #3774: Added a few more checks in PyTokenizer_FindEncoding to handle
  error conditions.

- Issue #3594: Fix Parser/tokenizer.c:fp_setreadl() to open the file being
  tokenized by either a file path or file pointer for the benefit of
  PyTokenizer_FindEncoding().

- Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin. On
  these systems, the mbstowcs() function is slightly buggy and must be
  replaced with strlen() for the purpose of counting of number of wide
  characters needed to represent the multi-byte character string.

- Issue #3697: "Fatal Python error: Cannot recover from stack overflow"
  could be easily encountered under Windows in debug mode when exercising
  the recursion limit checking code, due to bogus handling of recursion
  limit when USE_STACKCHEK was enabled.

- Issue 3639: The _warnings module could segfault the interpreter when
  unexpected types were passed in as arguments.

- Issue #3712: The memoryview object had a reference leak and didn't support
  cyclic garbage collection.

- Issue #3668: Fix a memory leak with the "s*" argument parser in
  PyArg_ParseTuple and friends, which occurred when the argument for "s*" 
  was correctly parsed but parsing of subsequent arguments failed.

- Issue #3611: An exception __context__ could be cleared in a complex pattern
  involving a __del__ method re-raising an exception.

- Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to 
  match Python 2.5 speed despite the __instancecheck__ / __subclasscheck__
  mechanism. In the process, fix a bug where isinstance() and issubclass(),
  when given a tuple of classes as second argument, were looking up
  __instancecheck__ / __subclasscheck__ on the tuple rather than on each
  type object.

- Issue #3663: Py_None was decref'd when printing SyntaxErrors.

- Issue #3651: Fix various memory leaks when using the buffer
  interface, or when the "s#" code of PyArg_ParseTuple is given a
  bytes object.

- Issue #3657: Fix uninitialized memory read when pickling longs.
  Found by valgrind.

- Apply security patches from Apple.

- Fix crashes on memory allocation failure found with failmalloc.

- Fix memory leaks found with valgrind and update suppressions file.

- Fix compiler warnings in opt mode which would lead to invalid memory reads.

- Fix problem using wrong name in decimal module reported by pychecker.

- Issue #3650: Fixed a reference leak in bytes.split('x').

- bytes(o) now tries to use o.__bytes__() before using fallbacks.

- Issue #1204: The configure script now tests for additional libraries
  that may be required when linking against readline.  This fixes issues
  with x86_64 builds on some platforms (a few Linux flavors and OpenBSD).

C API
-----

- PyObject_Bytes and PyBytes_FromObject were added.

Library
-------

- Issue #3756: make re.escape() handle bytes as well as str.

- Issue #3800: fix filter() related bug in formatter.py.

- Issue #874900: fix behaviour of threading module after a fork.

- Issue #3535: zipfile couldn't read some zip files larger than 2GB.

- Issue #3776: Deprecate the bsddb package for removal in 3.0.

- Issue #3762: platform.architecture() fails if python is lanched via
  its symbolic link.

- Issue #3660: fix a memory leak in the C accelerator of the pickle module.

- Issue #3160: the "bdist_wininst" distutils command didn't work.

- Issue #1658: tkinter changes dict size during iteration in both
    tkinter.BaseWidget and tkinter.scrolledtext.ScrolledText.

- The bsddb module (and therefore the dbm.bsd module) has been removed.
  It is now maintained outside of the standard library at
  http://www.jcea.es/programacion/pybsddb.htm.

- Issue 600362:  Relocated parse_qs() and parse_qsl(), from the cgi module
  to the urlparse one.  Added a DeprecationWarning in the old module, it
  will be deprecated in the future.

- Issue #3719: platform.architecture() fails if there are spaces in the
  path to the Python binary.

- Issue 3602: As part of the merge of r66135, make the parameters on
  warnings.catch_warnings() keyword-only. Also remove a DeprecationWarning.

- The deprecation warnings for the camelCase threading API names were removed.

- Issue #3110: multiprocessing fails to compiel on solaris 10 due to missing 
  SEM_VALUE_MAX.

Extension Modules
-----------------

- Issue #3782: os.write() must not accept unicode strings.

- Issue #2975: When compiling several extension modules with Visual Studio 2008
  from the same python interpreter, some environment variables would grow
  without limit.

- Issue #3643: Added a few more checks to _testcapi to prevent segfaults by
  exploitation of poor argument checking.

- bsddb code updated to version 4.7.3pre2. This code is the same than
  Python 2.6 one, since the intention is to keep an unified 2.x/3.x codebase.
  The Python code is automatically translated using "2to3". Please, do not
  update this code in Python 3.0 by hand. Update the 2.6 one and then
  do "2to3".

- The _bytesio and _stringio modules are now compiled into the python binary.

- Issue #3492 and #3790: Fixed the zlib module and zipimport module uses of
  mutable bytearray objects where they should have been using immutable bytes.

- Issue #3797: Fixed the dbm, marshal, mmap, ossaudiodev, & winreg modules to
  return bytes objects instead of bytearray objects.


Tools/Demos
-----------

- Fix Misc/gdbinit so it works.


Build
-----

- Issue #3812: Failed to build python if configure --without-threads.

- Issue #3791: Remove the bsddb module from the Windows installer, and the
  core bsddb library from the Windows build files.


What's new in Python 3.0b3?
===========================

*Release date: 20-Aug-2008*

Core and Builtins
-----------------

- Issue #3653: Fix a segfault when sys.excepthook was called with invalid
  arguments.

- Issue #2394: implement more of the memoryview API, with the caveat that
  only one-dimensional contiguous buffers are supported and exercised right
  now. Slicing, slice assignment and comparison (equality and inequality)
  have been added. Also, the tolist() method has been implemented, but only
  for byte buffers. Finally, the API has been updated to return bytes objects
  wherever it used to return bytearrays.

- Issue #3560: clean up the new C PyMemoryView API so that naming is
  internally consistent; add macros PyMemoryView_GET_BASE() and
  PyMemoryView_GET_BUFFER() to access useful properties of a memory views
  without relying on a particular implementation; remove the ill-named
  PyMemoryView() function (PyMemoryView_GET_BUFFER() can be used instead).

- ctypes function pointers that are COM methods have a boolean True
  value again.

- Issue #1819: function calls with several named parameters are now on
  average 35% faster (as measured by pybench).

- The undocumented C APIs PyUnicode_AsString() and
  PyUnicode_AsStringAndSize() were made private to the interpreter, in
  order to be able to refine their interfaces for Python 3.1.

  If you need to access the UTF-8 representation of a Unicode object
  as bytes string, please use PyUnicode_AsUTF8String() instead.

- Issue #3460: PyUnicode_Join() implementation is 10% to 80% faster thanks
  to Python 3.0's stricter semantics which allow to avoid successive
  reallocations of the result string (this also affects str.join()).


Library
-------

- Issue #1276: Added temporary aliases for CJK Mac encodings to resolve
  a build problem on MacOS with CJK locales.  It adds four temporary
  mappings to existing legacy codecs that are virtually compatible
  with Mac encodings.  They will be replaced by codecs correctly
  implemented in 3.1.

- Issue #3614: Corrected a typo in xmlrpc.client, leading to a NameError
  "global name 'header' is not defined".

- Issue #2834: update the regular expression library to match the unicode
  standards of py3k. In other words, mixing bytes and unicode strings
  (be it as pattern, search string or replacement string) raises a TypeError.
  Moreover, the re.UNICODE flag is enabled automatically for unicode patterns,
  and can be disabled by specifying a new re.ASCII flag; as for bytes
  patterns, ASCII matching is the only option and trying to specify re.UNICODE
  for such patterns raises a ValueError.

- Issue #3300: make urllib.parse.[un]quote() default to UTF-8.
  Code contributed by Matt Giuca.  quote() now encodes the input
  before quoting, unquote() decodes after unquoting.  There are
  new arguments to change the encoding and errors settings.
  There are also new APIs to skip the encode/decode steps.
  [un]quote_plus() are also affected.

- Issue #2235: numbers.Number now blocks inheritance of the default id()
  based hash because that hash mechanism is not correct for numeric types.
  All concrete numeric types that inherit from Number (rather than just
  registering with it) must explicitly provide a hash implementation in
  order for their instances to be hashable.

- Issue #2676: in the email package, content-type parsing was hanging on
  pathological input because of quadratic or exponential behaviour of a
  regular expression.

- Issue #3476: binary buffered reading through the new "io" library is now
  thread-safe.

- Issue #1342811: Fix leak in Tkinter.Menu.delete. Commands associated to
  menu entries were not deleted.

- Remove the TarFileCompat class from tarfile.py.

- Issue #2491: os.fdopen is now almost an alias for the built-in open(), and
  accepts the same parameters.  It just checks that its first argument is an
  integer.

- Issue #3394: zipfile.writestr sets external attributes when passed a
  file name rather than a ZipInfo instance, so files are extracted with
  mode 0600 rather than 000 under Unix.

- Issue #2523: Fix quadratic behaviour when read()ing a binary file without
  asking for a specific length.

Extension Modules
-----------------

- Bug #3542: Support Unicode strings in _msi module.

What's new in Python 3.0b2?
===========================

*Release date: 17-Jul-2008*

Core and Builtins
-----------------

- Issue #3008: the float type has a new instance method 'float.hex'
  and a new class method 'float.fromhex' to convert floating-point
  numbers to and from hexadecimal strings, respectively.

- Issue #3083: Add alternate (#) formatting for bin, oct, hex output
  for str.format().  This adds the prefix 0b, 0o, or 0x, respectively.

- Issue #3280: like chr(), the "%c" format now accepts unicode code points
  beyond the Basic Multilingual Plane (above 0xffff) on all configurations. On
  "narrow Unicode" builds, the result is a string of 2 code units, forming a
  UTF-16 surrogate pair.

- Issue #3282: str.isprintable() should return False for undefined
  Unicode characters.

- Issue #3236: Return small longs from PyLong_FromString.

- Exception tracebacks now support exception chaining.

Library
-------

- Removed the sunaudio module. Use sunau instead.

- Issue #3554: ctypes.string_at and ctypes.wstring_at did call Python
  api functions without holding the GIL, which could lead to a fatal
  error when they failed.

- Issue #799428: Fix Tkinter.Misc._nametowidget to unwrap Tcl command objects.

- Removed "ast" function aliases from the parser module.

- Issue #3313: Fixed a crash when a failed dlopen() call does not set
  a valid dlerror() message.

- Issue #3258: Fixed a crash when a ctypes POINTER type to an
  incomplete structure was created.

- Issue #2683: Fix inconsistency in subprocess.Popen.communicate(): the
  argument now must be a bytes object in any case.

- Issue #3145: help("modules whatever") failed when trying to load the source
  code of every single module of the standard library, including invalid files
  used in the test suite.

- The gettext library now consistently uses Unicode strings for message ids
  and message strings, and ``ugettext()`` and the like don't exist anymore.

- The traceback module has been expanded to handle chained exceptions.

C API
-----

- Issue #3247: the function Py_FindMethod was removed. Modern types should
  use the tp_methods slot instead.

Tools/Demos
-----------

- The Mac/Demos directory has been removed.

- All of the Mac scripts have been removed (including BuildApplet.py).


What's new in Python 3.0b1?
===========================

*Release date: 18-Jun-2008*

Core and Builtins
-----------------

- Issue #3211: warnings.warn_explicit() did not guard against its 'registry'
  argument being anything other than a dict or None. Also fixed a bug in error
  handling when 'message' and 'category' were both set to None, triggering a
  bus error.

- Issue #3100: Corrected a crash on deallocation of a subclassed weakref which
  holds the last (strong) reference to its referent.

- Issue #2630: implement PEP 3138. repr() now returns printable
  Unicode characters unescaped, to get an ASCII-only representation
  of an object use ascii().

- Issue #1342: On windows, Python could not start when installed in a
  directory with non-ascii characters.

- Implement PEP 3121: new module initialization and finalization API.

- Removed the already-defunct ``-t`` option.

- Issue #2957: Corrected a ValueError "recursion limit exceeded", when
  unmarshalling many code objects, which happens when importing a
  large .pyc file (~1000 functions).

- Issue #2963: fix merging oversight that disabled method cache for
  all types.

- Issue #2964: fix a missing INCREF in instancemethod_descr_get.

- Issue #2895: Don't crash when given bytes objects as keyword names.

- Issue #2798: When parsing arguments with PyArg_ParseTuple, the "s"
  code now allows any unicode string and returns a utf-8 encoded
  buffer, just like the "s#" code already does.  The "z" code was
  corrected as well.

- Issue #2863: generators now have a ``gen.__name__`` attribute that
  equals ``gen.gi_code.co_name``, like ``func.__name___`` that equals
  ``func.func_code.co_name``.  The repr() of a generator now also
  contains this name.

- Issue #2831: enumerate() now has a ``start`` argument.

- Issue #2801: fix bug in the float.is_integer method where a
  ValueError was sometimes incorrectly raised.

- The ``--with-toolbox-glue`` option (and the associated
  pymactoolbox.h) have been removed.

- Issue #2196: hasattr() now lets exceptions which do not inherit
  Exception (KeyboardInterrupt, and SystemExit) propagate instead of
  ignoring them.

- #3021 Exception reraising sematics have been significantly improved.  However,
  f_exc_type, f_exc_value, and f_exc_traceback cannot be accessed from Python
  code anymore.

- Three of PyNumberMethods' members, nb_coerce, nb_hex, and nb_oct, have been
  removed.

Extension Modules
-----------------

- Renamed ``_winreg`` module to ``winreg``.

- Support os.O_ASYNC and fcntl.FASYNC if the constants exist on the
  platform.

- Support for Windows 9x has been removed from the winsound module.

- Issue #2870: cmathmodule.c compile error.

Library
-------

- The methods ``is_in_tuple()``, ``is_vararg()``, and ``is_keywordarg()`` of
  symtable.Symbol have been removed.

- Patch #3133: http.server.CGIHTTPRequestHandler did not work on windows.

- a new ``urllib`` package was created.  It consists of code from
  ``urllib``, ``urllib2``, ``urlparse``, and ``robotparser``.  The old
  modules have all been removed.  The new package has five submodules:
  ``urllib.parse``, ``urllib.request``, ``urllib.response``,
  ``urllib.error``, and ``urllib.robotparser``.  The
  ``urllib.request.urlopen()`` function uses the url opener from
  ``urllib2``.  (Note that the unittests have not been renamed for the
  beta, but they will be renamed in the future.)

- rfc822 has been removed in favor of the email package.

- mimetools has been removed in favor of the email package.

- Patch #2849: Remove use of rfc822 module from standard library.

- Added C optimized implementation of io.StringIO.

- The ``pickle`` module is now automatically use an optimized C
  implementation of Pickler and Unpickler when available. The
  ``cPickle`` module is no longer needed.

- Removed the ``htmllib`` and ``sgmllib`` modules.

- The deprecated ``SmartCookie`` and ``SimpleCookie`` classes have
  been removed from ``http.cookies``.

- The ``commands`` module has been removed. Its getoutput() and
  getstatusoutput() functions have been moved to the ``subprocess`` module.

- The ``http`` package was created; it contains the old ``httplib``
  as ``http.client``, ``Cookie`` as ``http.cookies``, ``cookielib``
  as ``http.cookiejar``, and the content of the three ``HTTPServer``
  modules as ``http.server``.

- The ``xmlrpc`` package was created; it contains the old
  ``xmlrpclib`` module as ``xmlrpc.client`` and the content of
  the old ``SimpleXMLRPCServer`` and ``DocXMLRPCServer`` modules
  as ``xmlrpc.server``.

- The ``dbm`` package was created, containing the old modules
  ``anydbm`` and ``whichdb`` in its ``__init__.py``, and having
  ``dbm.gnu`` (was ``gdbm``), ``dbm.bsd`` (was ``dbhash``),
  ``dbm.ndbm`` (was ``dbm``) and ``dbm.dumb`` (was ``dumbdbm``)
  as submodules.

- The ``repr`` module has been renamed to ``reprlib``.

- The ``statvfs`` module has been removed.

- Issue #1713041: fix pprint's handling of maximum depth.

- Issue #2250: Exceptions raised during evaluation of names in
  rlcompleter's ``Completer.complete()`` method are now caught and
  ignored.

- Patch #2659: Added ``break_on_hyphens`` option to textwrap's
  ``TextWrapper`` class.

- Issue #2487: change the semantics of math.ldexp(x, n) when n is too
  large to fit in a C long.  ldexp(x, n) now returns a zero (with
  suitable sign) if n is large and negative; previously, it raised
  OverflowError.

- The ``ConfigParser`` module has been renamed to ``configparser``.

- Issue #2865: webbrowser.open() works again in a KDE environment.

- The ``multifile`` module has been removed.

- The ``SocketServer`` module has been renamed to ``socketserver``.

- Fixed the ``__all__`` setting on ``collections`` to include
  ``UserList`` and ``UserString``.

- The sre module has been removed.

- The Queue module has been renamed to queue.

- The copy_reg module has been renamed to copyreg.

- The mhlib module has been removed.

- The ihooks module has been removed.

- The fpformat module has been removed.

- The dircache module has been removed.

- The Canvas module has been removed.

- The Decimal module gained the magic methods __round__, __ceil__,
  __floor__ and __trunc__, to give support for round, math.ceil,
  math.floor and math.trunc.

- The user module has been removed.

- The mutex module has been removed.

- The imputil module has been removed.

- os.path.walk has been removed in favor of os.walk.

- pdb gained the "until" command.

- The test.test_support module has been renamed to test.support.

- The threading module API was renamed to be PEP 8 compliant.  The
  old names are still present, but will be removed in the near future.

Tools/Demos
-----------

- The bgen tool has been removed.

Build
-----


What's New in Python 3.0a5?
===========================

*Release date: 08-May-2008*

Core and Builtins
-----------------

- Fixed misbehaviour of PyLong_FromSsize_t on systems where
  sizeof(size_t) > sizeof(long).

- Issue #2221: Corrected a SystemError "error return without exception
  set", when the code executed by exec() raises an exception, and
  sys.stdout.flush() also raises an error.

- Bug #2565: The repr() of type objects now calls them 'class', not
  'type' - whether they are builtin types or not.

- The command line processing was converted to pass Unicode strings
  through as unmodified as possible; as a consequence, the C API
  related to command line arguments was changed to use wchar_t.

- All backslashes in raw strings are interpreted literally.  This
  means that '\u' and '\U' escapes are not treated specially.

Extension Modules
-----------------

Library
-------

- ctypes objects now support the PEP3118 buffer interface.

- Issue #2682: ctypes callback functions now longer contain a cyclic
  reference to themselves.

- Issue #2058: Remove the buf attribute and add __slots__ to the
  TarInfo class in order to reduce tarfile's memory usage.

- Bug #2606: Avoid calling .sort() on a dict_keys object.

- The bundled libffi copy is now in sync with the recently released
  libffi3.0.5 version, apart from some small changes to
  Modules/_ctypes/libffi/configure.ac.

Build
-----

- Issue #1496032: On alpha, use -mieee when gcc is the compiler.

- "make install" is now an alias for "make altinstall", to prevent
  accidentally overwriting a Python 2.x installation.  Use "make
  fullinstall" to force Python 3.0 to be installed as "python".

- Issue #2544: On HP-UX systems, use 'gcc -shared' for linking when
  gcc is used as compiler.


What's New in Python 3.0a4?
===========================

*Release date: 02-Apr-2008*

Core and Builtins
-----------------

- Bug #2301: Don't try decoding the source code into the original
  encoding for syntax errors.

Extension Modules
-----------------

- The dl module was removed, use the ctypes module instead.

- Use wchar_t functions in _locale module.

Library
-------

- The class distutils.commands.build_py.build_py_2to3 can be used as a
  build_py replacement to automatically run 2to3 on modules that are
  going to be installed.

- A new pickle protocol (protocol 3) is added with explicit support
  for bytes.  This is the default protocol.  It intentionally cannot
  be unpickled by Python 2.x.

- When a pickle written by Python 2.x contains an (8-bit) str
  instance, this is now decoded to a (Unicode) str instance.  The
  encoding used to do this defaults to ASCII, but can be overridden
  via two new keyword arguments to the Unpickler class.  Previously
  this would create bytes instances, which is usually wrong: str
  instances are often used to pickle attribute names etc., and text is
  more common than binary data anyway.

- Default to ASCII as the locale.getpreferredencoding, if the POSIX
  system doesn't support CODESET and LANG isn't set or doesn't allow
  deduction of an encoding.

- Issue #1202: zlib.crc32 and zlib.adler32 now return an unsigned
  value.

- Issue #719888: Updated tokenize to use a bytes API.  generate_tokens
  has been renamed tokenize and now works with bytes rather than
  strings.  A new detect_encoding function has been added for
  determining source file encoding according to PEP-0263.  Token
  sequences returned by tokenize always start with an ENCODING token
  which specifies the encoding used to decode the file.  This token is
  used to encode the output of untokenize back to bytes.


What's New in Python 3.0a3?
===========================

*Release date: 29-Feb-2008*

Core and Builtins
-----------------

- Issue #2282: io.TextIOWrapper was not overriding seekable() from
  io.IOBase.

- Issue #2115: Important speedup in setting __slot__ attributes.  Also
  prevent a possible crash: an Abstract Base Class would try to access
  a slot on a registered virtual subclass.

- Fixed repr() and str() of complex numbers with infinity or nan as
  real or imaginary part.

- Clear all free list during a gc.collect() of the highest generation
  in order to allow pymalloc to free more arenas. Python may give back
  memory to the OS earlier.

- Issue #2045: Fix an infinite recursion triggered when printing a
  subclass of collections.defaultdict, if its default_factory is set
  to a bound method.

- Fixed a minor memory leak in dictobject.c. The content of the free
  list was not freed on interpreter shutdown.

- Limit free list of method and builtin function objects to 256
  entries each.

- Patch #1953: Added ``sys._compact_freelists()`` and the C API
  functions ``PyInt_CompactFreeList`` and ``PyFloat_CompactFreeList``
  to compact the internal free lists of pre-allocted ints and floats.

- Bug #1983: Fixed return type of fork(), fork1() and forkpty() calls.
  Python expected the return type int but the fork familie returns
  pi_t.

- Issue #1678380: Fix a bug that identifies 0j and -0j when they
  appear in the same code unit.

- Issue #2025: Added tuple.count() and tuple.index() methods to comply
  with the collections.Sequence API.

- Fixed multiple reinitialization of the Python interpreter. The small
  int list in longobject.c has caused a seg fault during the third
  finalization.

- Issue #1973: bytes.fromhex('') raised SystemError.

- Issue #1771: remove cmp parameter from sorted() and list.sort().

- Issue #1969: split and rsplit in bytearray are inconsistent.

- map() no longer accepts None for the first argument.  Use zip()
  instead.

- Issue #1769: Now int("- 1") is not allowed any more.

- Object/longobject.c: long(float('nan')) raises an OverflowError
  instead of returning 0.

- Issue #1762972: __file__ points to the source file instead of the
  pyc/pyo file if the py file exists.

- Issue #1393: object_richcompare() returns NotImplemented instead of
  False if the objects aren't equal, to give the other side a chance.

- Issue #1692: Interpreter was not displaying location of SyntaxError.

- Improve some exception messages when Windows fails to load an
  extension module.  Now we get for example '%1 is not a valid Win32
  application' instead of 'error code 193'.  Also use Unicode strings
  to deal with non-English locales.

- Issue #1587: Added instancemethod wrapper for PyCFunctions. The
  Python C API has gained a new type *PyInstanceMethod_Type* and the
  functions *PyInstanceMethod_Check(o)*, *PyInstanceMethod_New(func)*
  and *PyInstanceMethod_Function(im)*.

- Constants gc.DEBUG_OBJECT and gc.DEBUG_INSTANCE have been removed
  from the gc module; gc.DEBUG_COLLECTABLE or gc.DEBUG_UNCOLLECTABLE
  are now enough to print the corresponding list of objects considered
  by the garbage collector.

- Issue #1573: Improper use of the keyword-only syntax makes the
  parser crash.

- Issue #1564: The set implementation should special-case PyUnicode
  instead of PyString.

- Patch #1031213: Decode source line in SyntaxErrors back to its
  original source encoding.

- inspect.getsource() includes the decorators again.

- Bug #1713: posixpath.ismount() claims symlink to a mountpoint is a
  mountpoint.

- Fix utf-8-sig incremental decoder, which didn't recognise a BOM when
  the first chunk fed to the decoder started with a BOM, but was
  longer than 3 bytes.

Extension Modules
-----------------

- Code for itertools ifilter(), imap(), and izip() moved to bultins
  and renamed to filter(), map(), and zip().  Also, renamed
  izip_longest() to zip_longest() and ifilterfalse() to filterfalse().

- Issue #1762972: Readded the reload() function as imp.reload().

- Bug #2111: mmap segfaults when trying to write a block opened with
  PROT_READ.

- Issue #2063: correct order of utime and stime in os.times() result
  on Windows.

Library
-------

- Weakref dictionaries now inherit from MutableMapping.

- Created new UserDict class in collections module.  This one inherits
  from and complies with the MutableMapping ABC.  Also, moved
  UserString and UserList to the collections module.  The
  MutableUserString class was removed.

- Removed UserDict.DictMixin.  Replaced all its uses with
  collections.MutableMapping.

- Issue #1703: getpass() should flush after writing prompt.

- Issue #1585: IDLE uses non-existent xrange() function.

- Issue #1578: Problems in win_getpass.

Build
-----

- Renamed --enable-unicode configure flag to --with-wide-unicode,
  since Unicode strings can't be disabled anymore.

C API
-----

- Issue #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE,
  Py_TYPE and Py_REFCNT.

- New API PyImport_ImportModuleNoBlock(), works like
  PyImport_ImportModule() but won't block on the import lock
  (returning an error instead).


What's New in Python 3.0a2?
===========================

*Release date: 07-Dec-2007*

(Note: this list is incomplete.)

Core and Builtins
-----------------

- str8 now has the same construction signature as bytes.

- Comparisons between str and str8 now return False/True for ==/!=.
  sqlite3 returns str8 when recreating on object from it's __conform__
  value.  The struct module returns str8 for all string-related
  formats.  This was true before this change, but becomes more
  apparent thanks to string comparisons always being False.

- Replaced `PyFile_FromFile()` with `PyFile_FromFd(fd, name. mode,
  buffer, encoding, newline)`.

- Fixed `imp.find_module()` to obey the -*- coding: -*- header.

- Changed `__file__` and `co_filename` to unicode. The path names are decoded
  with `Py_FileSystemDefaultEncoding` and a new API method
  `PyUnicode_DecodeFSDefault(char*)` was added.

- io.open() and _fileio.FileIO have grown a new argument closefd. A
  false value disables the closing of the file descriptor.

- Added a new option -b to issues warnings (-bb for errors) about
  certain operations between bytes/buffer and str like str(b'') and
  comparison.

- The standards streams sys.stdin, stdout and stderr may be None when
  the when the C runtime library returns an invalid file descriptor
  for the streams (fileno(stdin) < 0). For now this happens only for
  Windows GUI apps and scripts started with `pythonw.exe`.

- Added PCbuild9 directory for VS 2008.

- Renamed structmember.h WRITE_RESTRICTED to PY_WRITE_RESTRICTED to
  work around a name clash with VS 2008 on Windows.

- Unbound methods are gone for good. ClassObject.method returns an
  ordinary function object, instance.method still returns a bound
  method object.  The API of bound methods is cleaned up, too. The
  im_class attribute is removed and im_func + im_self are renamed to
  __func__ and __self__. The factory PyMethod_New takes only func and
  instance as argument.

- intobject.h is no longer included by Python.h. The remains were
  moved to longobject.h. It still exists to define several aliases
  from PyInt to PyLong functions.

- Removed sys.maxint, use sys.maxsize instead.

Extension Modules
-----------------

- The `hotshot` profiler has been removed; use `cProfile` instead.

Library
-------

- When loading an external file using testfile(), the passed-in
  encoding argument was being ignored if __loader__ is defined and
  forcing the source to be UTF-8.

- The methods `os.tmpnam()`, `os.tempnam()` and `os.tmpfile()` have
  been removed in favor of the tempfile module.

- Removed the 'new' module.

- Removed all types from the 'types' module that are easily accessable
  through builtins.


What's New in Python 3.0a1?
===========================

*Release date: 31-Aug-2007*

Core and Builtins
-----------------

- PEP 3131: Support non-ASCII identifiers.

- PEP 3120: Change default encoding to UTF-8.

- PEP 3123: Use proper C inheritance for PyObject.

- Removed the __oct__ and __hex__ special methods and added a bin()
  builtin function.

- PEP 3127: octal literals now start with "0o". Old-style octal
  literals are invalid. There are binary literals with a prefix of
  "0b".  This also affects int(x, 0).

- None, True, False are now keywords.

- PEP 3119: isinstance() and issubclass() can be overridden.

- Remove BaseException.message.

- Remove tuple parameter unpacking (PEP 3113).

- Remove the f_restricted attribute from frames.  This naturally leads
  to the removal of PyEval_GetRestricted() and PyFrame_IsRestricted().

- PEP 3132 was accepted. That means that you can do ``a, *b =
  range(5)`` to assign 0 to a and [1, 2, 3, 4] to b.

- range() now returns an iterator rather than a list.  Floats are not
  allowed.  xrange() is no longer defined.

- Patch #1660500: hide iteration variable in list comps, add set comps
  and use common code to handle compilation of iterative expressions.

- By default, != returns the opposite of ==, unless the latter returns
  NotImplemented.

- Patch #1680961: sys.exitfunc has been removed and replaced with a
  private C-level API.

- PEP 3115: new metaclasses: the metaclass is now specified as a
  keyword arg in the class statement, which can now use the full
  syntax of a parameter list. Also, the metaclass can implement a
  __prepare__ function which will be called to create the dictionary
  for the new class namespace.

- The long-deprecated argument "pend" of PyFloat_FromString() has been
  removed.

- The dir() function has been extended to call the __dir__() method on
  its argument, if it exists. If not, it will work like before. This
  allows customizing the output of dir() in the presence of a
  __getattr__().

- Removed support for __members__ and __methods__.

- Removed indexing/slicing on BaseException.

- input() became raw_input(): the name input() now implements the
  functionality formerly known as raw_input(); the name raw_input() is
  no longer defined.

- Classes listed in an 'except' clause must inherit from
  BaseException.

- PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
  and .keys(), .items(), .values() return dict views, which behave
  like sets.

- PEP 3105: print is now a function.  Also (not in the PEP) the
  'softspace' attribute of files is now gone (since print() doesn't
  use it).  A side effect of this change is that you can get
  incomplete output lines in interactive sessions:

  >>> print(42, end="")
  42>>>

  We may be able to fix this after the I/O library rewrite.

- PEP 3102: keyword-only arguments.

- Int/Long unification is complete.  The 'long' built-in type and
  literals with trailing 'L' or 'l' have been removed.  Performance
  may be sub-optimal (haven't really benchmarked).

- 'except E, V' must now be spelled as 'except E as V' and deletes V
  at the end of the except clause; V must be a simple name.

- Added function annotations per PEP 3107.

- Added nonlocal declaration from PEP 3104:

  >>> def f(x):
  ...     def inc():
  ...         nonlocal x
  ...         x += 1
  ...         return x
  ...     return inc
  ...
  >>> inc = f(0)
  >>> inc()
  1
  >>> inc()
  2

- Moved intern() to sys.intern().

- exec is now a function.

- Renamed nb_nonzero to nb_bool and __nonzero__ to __bool__.

- Classic classes are a thing of the past.  All classes are new style.

- Exceptions *must* derive from BaseException.

- Integer division always returns a float.  The -Q option is no more.
  All the following are gone:

  * PyNumber_Divide and PyNumber_InPlaceDivide
  * __div__, __rdiv__, and __idiv__
  * nb_divide, nb_inplace_divide
  * operator.div, operator.idiv, operator.__div__, operator.__idiv__
    (Only __truediv__ and __floordiv__ remain, not sure how to handle
    them if we want to re-use __div__ and friends.  If we do, it will
    make it harder to write code for both 2.x and 3.x.)

- 'as' and 'with' are keywords.

- Absolute import is the default behavior for 'import foo' etc.

- Removed support for syntax: backticks (ie, `x`), <>.

- Removed these Python builtins: apply(), callable(), coerce(),
  execfile(), file(), reduce(), reload().

- Removed these Python methods: {}.has_key.

- Removed these opcodes: BINARY_DIVIDE, INPLACE_DIVIDE, UNARY_CONVERT.

- Remove C API support for restricted execution.

- zip(), map() and filter() now return iterators, behaving like their
  itertools counterparts.  This also affect map()'s behavior on
  sequences of unequal length -- it now stops after the shortest one
  is exhausted.

- Additions: set literals, set comprehensions, ellipsis literal.

- Added class decorators per PEP 3129.


Extension Modules
-----------------

- Removed the imageop module.  Obsolete long with its unit tests
  becoming useless from the removal of rgbimg and imgfile.

- Removed these attributes from the operator module: div, idiv,
  __div__, __idiv__, isCallable, sequenceIncludes.

- Removed these attributes from the sys module: exc_clear(), exc_type,
  exc_value, exc_traceback.


Library
-------

- Removed the compiler package.  Use of the _ast module and (an
  eventual) AST -> bytecode mechanism.

- Removed these modules: audiodev, Bastion, bsddb185, exceptions,
  linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha,
  stringold, strop, sunaudiodev, timing, xmllib.

- Moved the toaiff module to Tools/Demos.

- Removed obsolete IRIX modules: al/AL, cd/CD, cddb, cdplayer, cl/CL,
  DEVICE, ERRNO, FILE, fl/FL, flp, fm, GET, gl/GL, GLWS, IN, imgfile,
  IOCTL, jpeg, panel, panelparser, readcd, sgi, sv/SV, torgb, WAIT.

- Removed obsolete functions: commands.getstatus(), os.popen*().

- Removed functions in the string module that are also string methods;
  Remove string.{letters, lowercase, uppercase}.

- Removed support for long obsolete platforms: plat-aix3, plat-irix5.

- Removed xmlrpclib.SlowParser.  It was based on xmllib.

- Patch #1680961: atexit has been reimplemented in C.

- Add new codecs for UTF-32, UTF-32-LE and UTF-32-BE.

Build
-----

C API
-----

- Removed these Python slots: __coerce__, __div__, __idiv__, __rdiv__.

- Removed these C APIs: PyNumber_Coerce(), PyNumber_CoerceEx(),
  PyMember_Get, PyMember_Set.

- Removed these C slots/fields: nb_divide, nb_inplace_divide.

- Removed these macros: staticforward, statichere, PyArg_GetInt,
  PyArg_NoArgs, _PyObject_Del.

- Removed these typedefs: intargfunc, intintargfunc, intobjargproc,
  intintobjargproc, getreadbufferproc, getwritebufferproc,
  getsegcountproc, getcharbufferproc, memberlist.

Tests
-----

- Removed test.testall as test.regrtest replaces it.

Documentation
-------------

Mac
---

- The cfmfile module was removed.

Platforms
---------

- Support for BeOS and AtheOS was removed (according to PEP 11).

- Support for RiscOS, Irix, Tru64 was removed (alledgedly).

Tools/Demos
-----------


What's New in Python 2.5 release candidate 1?
=============================================

*Release date: 17-AUG-2006*

Core and builtins
-----------------

- Unicode objects will no longer raise an exception when being
  compared equal or unequal to a string and a UnicodeDecodeError
  exception occurs, e.g. as result of a decoding failure.

  Instead, the equal (==) and unequal (!=) comparison operators will
  now issue a UnicodeWarning and interpret the two objects as
  unequal. The UnicodeWarning can be filtered as desired using
  the warning framework, e.g. silenced completely, turned into an
  exception, logged, etc.

  Note that compare operators other than equal and unequal will still
  raise UnicodeDecodeError exceptions as they've always done.

- Fix segfault when doing string formatting on subclasses of long.

- Fix bug related to __len__ functions using values > 2**32 on 64-bit machines
  with new-style classes.

- Fix bug related to __len__ functions returning negative values with
  classic classes.

- Patch #1538606, Fix __index__() clipping.  There were some problems
  discovered with the API and how integers that didn't fit into Py_ssize_t
  were handled.  This patch attempts to provide enough alternatives
  to effectively use __index__.

- Bug #1536021: __hash__ may now return long int; the final hash
  value is obtained by invoking hash on the long int.

- Bug #1536786: buffer comparison could emit a RuntimeWarning.

- Bug #1535165: fixed a segfault in input() and raw_input() when
  sys.stdin is closed.

- On Windows, the PyErr_Warn function is now exported from
  the Python dll again.

- Bug #1191458: tracing over for loops now produces a line event
  on each iteration.  Fixing this problem required changing the .pyc
  magic number.  This means that .pyc files generated before 2.5c1
  will be regenerated.

- Bug #1333982: string/number constants were inappropriately stored
  in the byte code and co_consts even if they were not used, ie
  immediately popped off the stack.

- Fixed a reference-counting problem in property().


Library
-------

- Fix a bug in the ``compiler`` package that caused invalid code to be
  generated for generator expressions.

- The distutils version has been changed to 2.5.0. The change to
  keep it programmatically in sync with the Python version running
  the code (introduced in 2.5b3) has been reverted. It will continue
  to be maintained manually as static string literal.

- If the Python part of a ctypes callback function returns None,
  and this cannot be converted to the required C type, an exception is
  printed with PyErr_WriteUnraisable.  Before this change, the C
  callback returned arbitrary values to the calling code.

- The __repr__ method of a NULL ctypes.py_object() no longer raises
  an exception.

- uuid.UUID now has a bytes_le attribute. This returns the UUID in
  little-endian byte order for Windows. In addition, uuid.py gained some
  workarounds for clocks with low resolution, to stop the code yielding
  duplicate UUIDs.

- Patch #1540892: site.py Quitter() class attempts to close sys.stdin
  before raising SystemExit, allowing IDLE to honor quit() and exit().

- Bug #1224621: make tabnanny recognize IndentationErrors raised by tokenize.

- Patch #1536071: trace.py should now find the full module name of a
  file correctly even on Windows.

- logging's atexit hook now runs even if the rest of the module has
  already been cleaned up.

- Bug #1112549, fix DoS attack on cgi.FieldStorage.

- Bug #1531405, format_exception no longer raises an exception if
  str(exception) raised an exception.

- Fix a bug in the ``compiler`` package that caused invalid code to be
  generated for nested functions.


Extension Modules
-----------------

- Patch #1511317: don't crash on invalid hostname (alias) info.

- Patch #1535500: fix segfault in BZ2File.writelines and make sure it
  raises the correct exceptions.

- Patch # 1536908: enable building ctypes on OpenBSD/AMD64.  The
  '-no-stack-protector' compiler flag for OpenBSD has been removed.

- Patch #1532975 was applied, which fixes Bug #1533481: ctypes now
  uses the _as_parameter_ attribute when objects are passed to foreign
  function calls.  The ctypes version number was changed to 1.0.1.

- Bug #1530559, struct.pack raises TypeError where it used to convert.
  Passing float arguments to struct.pack when integers are expected
  now triggers a DeprecationWarning.


Tests
-----

- test_socketserver should now work on cygwin and not fail sporadically
  on other platforms.

- test_mailbox should now work on cygwin versions 2006-08-10 and later.

- Bug #1535182: really test the xreadlines() method of bz2 objects.

- test_threading now skips testing alternate thread stack sizes on
  platforms that don't support changing thread stack size.


Documentation
-------------

- Patch #1534922: unittest docs were corrected and enhanced.


Build
-----

- Bug #1535502, build _hashlib on Windows, and use masm assembler
  code in OpenSSL.

- Bug #1534738, win32 debug version of _msi should be _msi_d.pyd.

- Bug #1530448, ctypes build failure on Solaris 10 was fixed.


C API
-----

- New API for Unicode rich comparisons: PyUnicode_RichCompare()

- Bug #1069160.  Internal correctness changes were made to
  ``PyThreadState_SetAsyncExc()``.  A test case was added, and
  the documentation was changed to state that the return value
  is always 1 (normal) or 0 (if the specified thread wasn't found).


What's New in Python 2.5 beta 3?
================================

*Release date: 03-AUG-2006*

Core and builtins
-----------------

- _PyWeakref_GetWeakrefCount() now returns a Py_ssize_t; it previously
  returned a long (see PEP 353).

- Bug #1515471: string.replace() accepts character buffers again.

- Add PyErr_WarnEx() so C code can pass the stacklevel to warnings.warn().
  This provides the proper warning for struct.pack().
  PyErr_Warn() is now deprecated in favor of PyErr_WarnEx().

- Patch #1531113: Fix augmented assignment with yield expressions.
  Also fix a SystemError when trying to assign to yield expressions.

- Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
  with PEP 302.  This was fixed by adding an ``imp.NullImporter`` type that is
  used in ``sys.path_importer_cache`` to cache non-directory paths and avoid
  excessive filesystem operations during imports.

- Bug #1521947: When checking for overflow, ``PyOS_strtol()`` used some
  operations on signed longs that are formally undefined by C.
  Unfortunately, at least one compiler now cares about that, so complicated
  the code to make that compiler happy again.

- Bug #1524310: Properly report errors from FindNextFile in os.listdir.

- Patch #1232023: Stop including current directory in search
  path on Windows.

- Fix some potential crashes found with failmalloc.

- Fix warnings reported by Klocwork's static analysis tool.

- Bug #1512814, Fix incorrect lineno's when code within a function
  had more than 255 blank lines.

- Patch #1521179: Python now accepts the standard options ``--help`` and
  ``--version`` as well as ``/?`` on Windows.

- Bug #1520864: unpacking singleton tuples in a 'for' loop (for x, in) works
  again.  Fixing this problem required changing the .pyc magic number.
  This means that .pyc files generated before 2.5b3 will be regenerated.

- Bug #1524317:  Compiling Python ``--without-threads`` failed.
  The Python core compiles again, and, in a build without threads, the
  new ``sys._current_frames()`` returns a dictionary with one entry,
  mapping the faux "thread id" 0 to the current frame.

- Bug #1525447: build on MacOS X on a case-sensitive filesystem.


Library
-------

- Fix #1693149.  Now you can pass several modules separated by
  comma to trace.py in the same --ignore-module option.

- Correction of patch #1455898: In the mbcs decoder, set final=False
  for stream decoder, but final=True for the decode function.

- os.urandom no longer masks unrelated exceptions like SystemExit or
  KeyboardInterrupt.

- Bug #1525866: Don't copy directory stat times in
  shutil.copytree on Windows

- Bug #1002398: The documentation for os.path.sameopenfile now correctly
  refers to file descriptors, not file objects.

- The renaming of the xml package to xmlcore, and the import hackery done
  to make it appear at both names, has been removed.  Bug #1511497,
  #1513611, and probably others.

- Bug #1441397: The compiler module now recognizes module and function
  docstrings correctly as it did in Python 2.4.

- Bug #1529297:  The rewrite of doctest for Python 2.4 unintentionally
  lost that tests are sorted by name before being run.  This rarely
  matters for well-written tests, but can create baffling symptoms if
  side effects from one test to the next affect outcomes.  ``DocTestFinder``
  has been changed to sort the list of tests it returns.

- The distutils version has been changed to 2.5.0, and is now kept
  in sync with sys.version_info[:3].

- Bug #978833: Really close underlying socket in _socketobject.close.

- Bug #1459963: urllib and urllib2 now normalize HTTP header names with
  title().

- Patch #1525766: In pkgutil.walk_packages, correctly pass the onerror callback
  to recursive calls and call it with the failing package name.

- Bug #1525817: Don't truncate short lines in IDLE's tool tips.

- Patch #1515343: Fix printing of deprecated string exceptions with a
  value in the traceback module.

- Resync optparse with Optik 1.5.3: minor tweaks for/to tests.

- Patch #1524429: Use repr() instead of backticks in Tkinter again.

- Bug #1520914: Change time.strftime() to accept a zero for any position in its
  argument tuple.  For arguments where zero is illegal, the value is forced to
  the minimum value that is correct.  This is to support an undocumented but
  common way people used  to fill in inconsequential information in the time
  tuple pre-2.4.

- Patch #1220874: Update the binhex module for Mach-O.

- The email package has improved RFC 2231 support, specifically for
  recognizing the difference between encoded (name*0*=<blah>) and non-encoded
  (name*0=<blah>) parameter continuations.  This may change the types of
  values returned from email.message.Message.get_param() and friends.
  Specifically in some cases where non-encoded continuations were used,
  get_param() used to return a 3-tuple of (None, None, string) whereas now it
  will just return the string (since non-encoded continuations don't have
  charset and language parts).

  Also, whereas % values were decoded in all parameter continuations, they are
  now only decoded in encoded parameter parts.

- Bug #1517990: IDLE keybindings on MacOS X now work correctly

- Bug #1517996: IDLE now longer shows the default Tk menu when a
  path browser, class browser or debugger is the frontmost window on MacOS X

- Patch #1520294: Support for getset and member descriptors in types.py,
  inspect.py, and pydoc.py.  Specifically, this allows for querying the type
  of an object against these built-in types and more importantly, for getting
  their docstrings printed in the interactive interpreter's help() function.


Extension Modules
-----------------

- Patch #1519025 and bug #926423: If a KeyboardInterrupt occurs during
  a socket operation on a socket with a timeout, the exception will be
  caught correctly.  Previously, the exception was not caught.

- Patch #1529514: The _ctypes extension is now compiled on more
  openbsd target platforms.

- The ``__reduce__()`` method of the new ``collections.defaultdict`` had
  a memory leak, affecting pickles and deep copies.

- Bug #1471938: Fix curses module build problem on Solaris 8; patch by
  Paul Eggert.

- Patch #1448199: Release interpreter lock in _winreg.ConnectRegistry.

- Patch #1521817: Index range checking on ctypes arrays containing
  exactly one element enabled again.  This allows iterating over these
  arrays, without the need to check the array size before.

- Bug #1521375: When the code in ctypes.util.find_library was
  run with root privileges, it could overwrite or delete
  /dev/null in certain cases; this is now fixed.

- Bug #1467450: On Mac OS X 10.3, RTLD_GLOBAL is now used as the
  default mode for loading shared libraries in ctypes.

- Because of a misspelled preprocessor symbol, ctypes was always
  compiled without thread support; this is now fixed.

- pybsddb Bug #1527939: bsddb module DBEnv dbremove and dbrename
  methods now allow their database parameter to be None as the
  sleepycat API allows.

- Bug #1526460: Fix socketmodule compile on NetBSD as it has a different
  bluetooth API compared with Linux and FreeBSD.

Tests
-----

- Bug #1501330: Change test_ossaudiodev to be much more tolerant in terms of
  how long the test file should take to play.  Now accepts taking 2.93 secs
  (exact time) +/- 10% instead of the hard-coded 3.1 sec.

- Patch #1529686: The standard tests ``test_defaultdict``, ``test_iterlen``,
  ``test_uuid`` and ``test_email_codecs`` didn't actually run any tests when
  run via ``regrtest.py``. Now they do.

Build
-----

- Bug #1439538: Drop usage of test -e in configure as it is not portable.

Mac
---

- PythonLauncher now works correctly when the path to the script contains
  characters that are treated specially by the shell (such as quotes).

- Bug #1527397: PythonLauncher now launches scripts with the working directory
  set to the directory that contains the script instead of the user home
  directory. That latter was an implementation accident and not what users
  expect.


What's New in Python 2.5 beta 2?
================================

*Release date: 11-JUL-2006*

Core and builtins
-----------------

- Bug #1441486: The literal representation of -(sys.maxint - 1)
  again evaluates to a int object, not a long.

- Bug #1501934: The scope of global variables that are locally assigned
  using augmented assignment is now correctly determined.

- Bug #927248: Recursive method-wrapper objects can now safely
  be released.

- Bug #1417699: Reject locale-specific decimal point in float()
  and atof().

- Bug #1511381: codec_getstreamcodec() in codec.c is corrected to
  omit a default "error" argument for NULL pointer.  This allows
  the parser to take a codec from cjkcodecs again.

- Bug #1519018: 'as' is now validated properly in import statements.

- On 64 bit systems, int literals that use less than 64 bits are
  now ints rather than longs.

- Bug #1512814, Fix incorrect lineno's when code at module scope
  started after line 256.

- New function ``sys._current_frames()`` returns a dict mapping thread
  id to topmost thread stack frame.  This is for expert use, and is
  especially useful for debugging application deadlocks.  The functionality
  was previously available in Fazal Majid's ``threadframe`` extension
  module, but it wasn't possible to do this in a wholly threadsafe way from
  an extension.

Library
-------

- Bug #1257728: Mention Cygwin in distutils error message about a missing
  VS 2003.

- Patch #1519566: Update turtle demo, make begin_fill idempotent.

- Bug #1508010: msvccompiler now requires the DISTUTILS_USE_SDK
  environment variable to be set in order to the SDK environment
  for finding the compiler, include files, etc.

- Bug #1515998: Properly generate logical ids for files in bdist_msi.

- warnings.py now ignores ImportWarning by default

- string.Template() now correctly handles tuple-values. Previously,
  multi-value tuples would raise an exception and single-value tuples would
  be treated as the value they contain, instead.

- Bug #822974: Honor timeout in telnetlib.{expect,read_until}
  even if some data are received.

- Bug #1267547: Put proper recursive setup.py call into the
  spec file generated by bdist_rpm.

- Bug #1514693: Update turtle's heading when switching between
  degrees and radians.

- Reimplement turtle.circle using a polyline, to allow correct
  filling of arcs.

- Bug #1514703: Only setup canvas window in turtle when the canvas
  is created.

- Bug #1513223: .close() of a _socketobj now releases the underlying
  socket again, which then gets closed as it becomes unreferenced.

- Bug #1504333: Make sgmllib support angle brackets in quoted
  attribute values.

- Bug #853506: Fix IPv6 address parsing in unquoted attributes in
  sgmllib ('[' and ']' were not accepted).

- Fix a bug in the turtle module's end_fill function.

- Bug #1510580: The 'warnings' module improperly required that a Warning
  category be either a types.ClassType and a subclass of Warning.  The proper
  check is just that it is a subclass with Warning as the documentation states.

- The compiler module now correctly compiles the new try-except-finally
  statement (bug #1509132).

- The wsgiref package is now installed properly on Unix.

- A bug was fixed in logging.config.fileConfig() which caused a crash on
  shutdown when fileConfig() was called multiple times.

- The sqlite3 module did cut off data from the SQLite database at the first
  null character before sending it to a custom converter. This has been fixed
  now.

Extension Modules
-----------------

- #1494314: Fix a regression with high-numbered sockets in 2.4.3. This
  means that select() on sockets > FD_SETSIZE (typically 1024) work again.
  The patch makes sockets use poll() internally where available.

- Assigning None to pointer type fields in ctypes structures possible
  overwrote the wrong fields, this is fixed now.

- Fixed a segfault in _ctypes when ctypes.wintypes were imported
  on non-Windows platforms.

- Bug #1518190: The ctypes.c_void_p constructor now accepts any
  integer or long, without range checking.

- Patch #1517790: It is now possible to use custom objects in the ctypes
  foreign function argtypes sequence as long as they provide a from_param
  method, no longer is it required that the object is a ctypes type.

- The '_ctypes' extension module now works when Python is configured
  with the --without-threads option.

- Bug #1513646: os.access on Windows now correctly determines write
  access, again.

- Bug #1512695: cPickle.loads could crash if it was interrupted with
  a KeyboardInterrupt.

- Bug #1296433: parsing XML with a non-default encoding and
  a CharacterDataHandler could crash the interpreter in pyexpat.

- Patch #1516912: improve Modules support for OpenVMS.

Build
-----

- Automate Windows build process for the Win64 SSL module.

- 'configure' now detects the zlib library the same way as distutils.
  Previously, the slight difference could cause compilation errors of the
  'zlib' module on systems with more than one version of zlib.

- The MSI compileall step was fixed to also support a TARGETDIR
  with spaces in it.

- Bug #1517388: sqlite3.dll is now installed on Windows independent
  of Tcl/Tk.

- Bug #1513032: 'make install' failed on FreeBSD 5.3 due to lib-old
  trying to be installed even though it's empty.

Tests
-----

- Call os.waitpid() at the end of tests that spawn child processes in order
  to minimize resources (zombies).

Documentation
-------------

- Cover ImportWarning, PendingDeprecationWarning and simplefilter() in the
  documentation for the warnings module.

- Patch #1509163: MS Toolkit Compiler no longer available.

- Patch #1504046: Add documentation for xml.etree.


What's New in Python 2.5 beta 1?
================================

*Release date: 20-JUN-2006*

Core and builtins
-----------------

- Patch #1507676: Error messages returned by invalid abstract object operations
  (such as iterating over an integer) have been improved and now include the
  type of the offending object to help with debugging.

- Bug #992017: A classic class that defined a __coerce__() method that returned
  its arguments swapped would infinitely recurse and segfault the interpreter.

- Fix the socket tests so they can be run concurrently.

- Removed 5 integers from C frame objects (PyFrameObject).
  f_nlocals, f_ncells, f_nfreevars, f_stack_size, f_restricted.

- Bug #532646: object.__call__() will continue looking for the __call__
  attribute on objects until one without one is found.  This leads to recursion
  when you take a class and set its __call__ attribute to an instance of the
  class.  Originally fixed for classic classes, but this fix is for new-style.
  Removes the infinite_rec_3 crasher.

- The string and unicode methods startswith() and endswith() now accept
  a tuple of prefixes/suffixes to look for. Implements RFE #1491485.

- Buffer objects, at the C level, never used the char buffer
  implementation even when the char buffer for the wrapped object was
  explicitly requested (originally returned the read or write buffer).
  Now a TypeError is raised if the char buffer is not present but is
  requested.

- Patch #1346214: Statements like "if 0: suite" are now again optimized
  away like they were in Python 2.4.

- Builtin exceptions are now full-blown new-style classes instead of
  instances pretending to be classes, which speeds up exception handling
  by about 80% in comparison to 2.5a2.

- Patch #1494554: Update unicodedata.numeric and unicode.isnumeric to
  Unicode 4.1.

- Patch #921466: sys.path_importer_cache is now used to cache valid and
  invalid file paths for the built-in import machinery which leads to
  fewer open calls on startup.

- Patch #1442927: ``long(str, base)`` is now up to 6x faster for non-power-
  of-2 bases.  The largest speedup is for inputs with about 1000 decimal
  digits.  Conversion from non-power-of-2 bases remains quadratic-time in
  the number of input digits (it was and remains linear-time for bases
  2, 4, 8, 16 and 32).

- Bug #1334662: ``int(string, base)`` could deliver a wrong answer
  when ``base`` was not 2, 4, 8, 10, 16 or 32, and ``string`` represented
  an integer close to ``sys.maxint``.  This was repaired by patch
  #1335972, which also gives a nice speedup.

- Patch #1337051: reduced size of frame objects.

- PyErr_NewException now accepts a tuple of base classes as its
  "base" parameter.

- Patch #876206: function call speedup by retaining allocated frame
  objects.

- Bug #1462152: file() now checks more thoroughly for invalid mode
  strings and removes a possible "U" before passing the mode to the
  C library function.

- Patch #1488312, Fix memory alignment problem on SPARC in unicode

- Bug #1487966: Fix SystemError with conditional expression in assignment

- WindowsError now has two error code attributes: errno, which carries
  the error values from errno.h, and winerror, which carries the error
  values from winerror.h. Previous versions put the winerror.h values
  (from GetLastError()) into the errno attribute.

- Patch #1475845: Raise IndentationError for unexpected indent.

- Patch #1479181: split open() and file() from being aliases for each other.

- Patch #1497053 & bug #1275608: Exceptions occurring in ``__eq__()``
  methods were always silently ignored by dictionaries when comparing keys.
  They are now passed through (except when using the C API function
  ``PyDict_GetItem()``, whose semantics did not change).

- Bug #1456209: In some obscure cases it was possible for a class with a
  custom ``__eq__()`` method to confuse dict internals when class instances
  were used as a dict's keys and the ``__eq__()`` method mutated the dict.
  No, you don't have any code that did this ;-)

Extension Modules
-----------------

- Bug #1295808: expat symbols should be namespaced in pyexpat

- Patch #1462338: Upgrade pyexpat to expat 2.0.0

- Change binascii.hexlify to accept a read-only buffer instead of only a char
  buffer and actually follow its documentation.

- Fixed a potentially invalid memory access of CJKCodecs' shift-jis decoder.

- Patch #1478788 (modified version): The functional extension module has
  been renamed to _functools and a functools Python wrapper module added.
  This provides a home for additional function related utilities that are
  not specifically about functional programming. See PEP 309.

- Patch #1493701: performance enhancements for struct module.

- Patch #1490224: time.altzone is now set correctly on Cygwin.

- Patch #1435422: zlib's compress and decompress objects now have a
  copy() method.

- Patch #1454481: thread stack size is now tunable at runtime for thread
  enabled builds on Windows and systems with Posix threads support.

- On Win32, os.listdir now supports arbitrarily-long Unicode path names
  (up to the system limit of 32K characters).

- Use Win32 API to implement os.{access,chdir,chmod,mkdir,remove,rename,rmdir,utime}.
  As a result, these functions now raise WindowsError instead of OSError.

- ``time.clock()`` on Win64 should use the high-performance Windows
  ``QueryPerformanceCounter()`` now (as was already the case on 32-bit
  Windows platforms).

- Calling Tk_Init twice is refused if the first call failed as that
  may deadlock.

- bsddb: added the DB_ARCH_REMOVE flag and fixed db.DBEnv.log_archive() to
  accept it without potentially using an uninitialized pointer.

- bsddb: added support for the DBEnv.log_stat() and DBEnv.lsn_reset() methods
  assuming BerkeleyDB >= 4.0 and 4.4 respectively.  [pybsddb project SF
  patch numbers 1494885 and 1494902]

- bsddb: added an interface for the BerkeleyDB >= 4.3 DBSequence class.
  [pybsddb project SF patch number 1466734]

- bsddb: fix DBCursor.pget() bug with keyword argument names when no data
  parameter is supplied.  [SF pybsddb bug #1477863]

- bsddb: the __len__ method of a DB object has been fixed to return correct
  results.  It could previously incorrectly return 0 in some cases.
  Fixes SF bug 1493322 (pybsddb bug 1184012).

- bsddb: the bsddb.dbtables Modify method now raises the proper error and
  aborts the db transaction safely when a modifier callback fails.
  Fixes SF python patch/bug #1408584.

- bsddb: multithreaded DB access using the simple bsddb module interface
  now works reliably.  It has been updated to use automatic BerkeleyDB
  deadlock detection and the bsddb.dbutils.DeadlockWrap wrapper to retry
  database calls that would previously deadlock. [SF python bug #775414]

- Patch #1446489: add support for the ZIP64 extensions to zipfile.

- Patch #1506645: add Python wrappers for the curses functions
  is_term_resized, resize_term and resizeterm.

Library
-------

- Patch #815924: Restore ability to pass type= and icon= in tkMessageBox
  functions.

- Patch #812986: Update turtle output even if not tracing.

- Patch #1494750: Destroy master after deleting children in
  Tkinter.BaseWidget.

- Patch #1096231: Add ``default`` argument to Tkinter.Wm.wm_iconbitmap.

- Patch #763580: Add name and value arguments to Tkinter variable
  classes.

- Bug #1117556: SimpleHTTPServer now tries to find and use the system's
  mime.types file for determining MIME types.

- Bug #1339007: Shelf objects now don't raise an exception in their
  __del__ method when initialization failed.

- Patch #1455898: The MBCS codec now supports the incremental mode for
  double-byte encodings.

- ``difflib``'s ``SequenceMatcher.get_matching_blocks()`` was changed to
  guarantee that adjacent triples in the return list always describe
  non-adjacent blocks.  Previously, a pair of matching blocks could end
  up being described by multiple adjacent triples that formed a partition
  of the matching pair.

- Bug #1498146: fix optparse to handle Unicode strings in option help,
  description, and epilog.

- Bug #1366250: minor optparse documentation error.

- Bug #1361643: fix textwrap.dedent() so it handles tabs appropriately;
  clarify docs.

- The wsgiref package has been added to the standard library.

- The functions update_wrapper() and wraps() have been added to the functools
  module. These make it easier to copy relevant metadata from the original
  function when writing wrapper functions.

- The optional ``isprivate`` argument to ``doctest.testmod()``, and the
  ``doctest.is_private()`` function, both deprecated in 2.4, were removed.

- Patch #1359618: Speed up charmap encoder by using a trie structure
  for lookup.

- The functions in the ``pprint`` module now sort dictionaries by key
  before computing the display.  Before 2.5, ``pprint`` sorted a dictionary
  if and only if its display required more than one line, although that
  wasn't documented.  The new behavior increases predictability; e.g.,
  using ``pprint.pprint(a_dict)`` in a doctest is now reliable.

- Patch #1497027: try HTTP digest auth before basic auth in urllib2
  (thanks for J. J. Lee).

- Patch #1496206: improve urllib2 handling of passwords with respect to
  default HTTP and HTTPS ports.

- Patch #1080727: add "encoding" parameter to doctest.DocFileSuite.

- Patch #1281707: speed up gzip.readline.

- Patch #1180296: Two new functions were added to the locale module:
  format_string() to get the effect of  "format % items" but locale-aware,
  and currency() to format a monetary number with currency sign.

- Patch #1486962: Several bugs in the turtle Tk demo module were fixed
  and several features added, such as speed and geometry control.

- Patch #1488881: add support for external file objects in bz2 compressed
  tarfiles.

- Patch #721464: pdb.Pdb instances can now be given explicit stdin and
  stdout arguments, making it possible to redirect input and output
  for remote debugging.

- Patch #1484695: Update the tarfile module to version 0.8. This fixes
  a couple of issues, notably handling of long file names using the
  GNU LONGNAME extension.

- Patch #1478292. ``doctest.register_optionflag(name)`` shouldn't create a
  new flag when ``name`` is already the name of an option flag.

- Bug #1385040: don't allow "def foo(a=1, b): pass" in the compiler
  package.

- Patch #1472854: make the rlcompleter.Completer class usable on non-
  UNIX platforms.

- Patch #1470846: fix urllib2 ProxyBasicAuthHandler.

- Bug #1472827: correctly escape newlines and tabs in attribute values in
  the saxutils.XMLGenerator class.


Build
-----

- Bug #1502728: Correctly link against librt library on HP-UX.

- OpenBSD 3.9 is supported now.

- Patch #1492356: Port to Windows CE.

- Bug/Patch #1481770: Use .so extension for shared libraries on HP-UX for ia64.

- Patch #1471883: Add --enable-universalsdk.

C API
-----

Tests
-----

Tools
-----

Documentation
-------------



What's New in Python 2.5 alpha 2?
=================================

*Release date: 27-APR-2006*

Core and builtins
-----------------

- Bug #1465834: 'bdist_wininst preinstall script support' was fixed
  by converting these apis from macros into exported functions again:

    PyParser_SimpleParseFile PyParser_SimpleParseString PyRun_AnyFile
    PyRun_AnyFileEx PyRun_AnyFileFlags PyRun_File PyRun_FileEx
    PyRun_FileFlags PyRun_InteractiveLoop PyRun_InteractiveOne
    PyRun_SimpleFile PyRun_SimpleFileEx PyRun_SimpleString
    PyRun_String Py_CompileString

- Under COUNT_ALLOCS, types are not necessarily immortal anymore.

- All uses of PyStructSequence_InitType have been changed to initialize
  the type objects only once, even if the interpreter is initialized
  multiple times.

- Bug #1454485, array.array('u') could crash the interpreter.  This was
  due to PyArgs_ParseTuple(args, 'u#', ...) trying to convert buffers (strings)
  to unicode when it didn't make sense.  'u#' now requires a unicode string.

- Py_UNICODE is unsigned.  It was always documented as unsigned, but
  due to a bug had a signed value in previous versions.

- Patch #837242: ``id()`` of any Python object always gives a positive
  number now, which might be a long integer. ``PyLong_FromVoidPtr`` and
  ``PyLong_AsVoidPtr`` have been changed accordingly.  Note that it has
  never been correct to implement a ``__hash()__`` method that returns the
  ``id()`` of an object:

      def __hash__(self):
          return id(self)  # WRONG

  because a hash result must be a (short) Python int but it was always
  possible for ``id()`` to return a Python long.  However, because ``id()``
  could return negative values before, on a 32-bit box an ``id()`` result
  was always usable as a hash value before this patch.  That's no longer
  necessarily so.

- Python on OS X 10.3 and above now uses dlopen() (via dynload_shlib.c)
  to load extension modules and now provides the dl module. As a result,
  sys.setdlopenflags() now works correctly on these systems. (SF patch
  #1454844)

- Patch #1463867: enhanced garbage collection to allow cleanup of cycles
  involving generators that have paused outside of any ``try`` or ``with``
  blocks.  (In 2.5a1, a paused generator that was part of a reference
  cycle could not be garbage collected, regardless of whether it was
  paused in a ``try`` or ``with`` block.)

Extension Modules
-----------------

- Patch #1191065: Fix preprocessor problems on systems where recvfrom
  is a macro.

- Bug #1467952: os.listdir() now correctly raises an error if readdir()
  fails with an error condition.

- Fixed bsddb.db.DBError derived exceptions so they can be unpickled.

- Bug #1117761: bsddb.*open() no longer raises an exception when using
  the cachesize parameter.

- Bug #1149413: bsddb.*open() no longer raises an exception when using
  a temporary db (file=None) with the 'n' flag to truncate on open.

- Bug #1332852: bsddb module minimum BerkeleyDB version raised to 3.3
  as older versions cause excessive test failures.

- Patch #1062014: AF_UNIX sockets under Linux have a special
  abstract namespace that is now fully supported.

Library
-------

- Bug #1223937: subprocess.CalledProcessError reports the exit status
  of the process using the returncode attribute, instead of
  abusing errno.

- Patch #1475231: ``doctest`` has a new ``SKIP`` option, which causes
  a doctest to be skipped (the code is not run, and the expected output
  or exception is ignored).

- Fixed contextlib.nested to cope with exceptions being raised and
  caught inside exit handlers.

- Updated optparse module to Optik 1.5.1 (allow numeric constants in
  hex, octal, or binary; add ``append_const`` action; keep going if
  gettext cannot be imported; added ``OptionParser.destroy()`` method;
  added ``epilog`` for better help generation).

- Bug #1473760: ``tempfile.TemporaryFile()`` could hang on Windows, when
  called from a thread spawned as a side effect of importing a module.

- The pydoc module now supports documenting packages contained in
  .zip or .egg files.

- The pkgutil module now has several new utility functions, such
  as ``walk_packages()`` to support working with packages that are either
  in the filesystem or zip files.

- The mailbox module can now modify and delete messages from
  mailboxes, in addition to simply reading them.  Thanks to Gregory
  K. Johnson for writing the code, and to the 2005 Google Summer of
  Code for funding his work.

- The ``__del__`` method of class ``local`` in module ``_threading_local``
  returned before accomplishing any of its intended cleanup.

- Patch #790710: Add breakpoint command lists in pdb.

- Patch #1063914: Add Tkinter.Misc.clipboard_get().

- Patch #1191700: Adjust column alignment in bdb breakpoint lists.

- SimpleXMLRPCServer relied on the fcntl module, which is unavailable on
  Windows. Bug #1469163.

- The warnings, linecache, inspect, traceback, site, and doctest modules
  were updated to work correctly with modules imported from zipfiles or
  via other PEP 302 __loader__ objects.

- Patch #1467770: Reduce usage of subprocess._active to processes which
  the application hasn't waited on.

- Patch #1462222: Fix Tix.Grid.

- Fix exception when doing glob.glob('anything*/')

- The pstats.Stats class accepts an optional stream keyword argument to
  direct output to an alternate file-like object.

Build
-----

- The Makefile now has a reindent target, which runs reindent.py on
  the library.

- Patch #1470875: Building Python with MS Free Compiler

- Patch #1161914: Add a python-config script.

- Patch #1324762:Remove ccpython.cc; replace --with-cxx with
  --with-cxx-main. Link with C++ compiler only if --with-cxx-main was
  specified. (Can be overridden by explicitly setting LINKCC.) Decouple
  CXX from --with-cxx-main, see description in README.

- Patch #1429775: Link extension modules with the shared libpython.

- Fixed a libffi build problem on MIPS systems.

- ``PyString_FromFormat``, ``PyErr_Format``, and ``PyString_FromFormatV``
  now accept formats "%u" for unsigned ints, "%lu" for unsigned longs,
  and "%zu" for unsigned integers of type ``size_t``.

Tests
-----

- test_contextlib now checks contextlib.nested can cope with exceptions
  being raised and caught inside exit handlers.

- test_cmd_line now checks operation of the -m and -c command switches

- The test_contextlib test in 2.5a1 wasn't actually run unless you ran
  it separately and by hand.  It also wasn't cleaning up its changes to
  the current Decimal context.

- regrtest.py now has a -M option to run tests that test the new limits of
  containers, on 64-bit architectures. Running these tests is only sensible
  on 64-bit machines with more than two gigabytes of memory. The argument
  passed is the maximum amount of memory for the tests to use.

Tools
-----

- Added the Python benchmark suite pybench to the Tools/ directory;
  contributed by Marc-Andre Lemburg.

Documentation
-------------

- Patch #1473132: Improve docs for ``tp_clear`` and ``tp_traverse``.

- PEP 343: Added Context Types section to the library reference
  and attempted to bring other PEP 343 related documentation into
  line with the implementation and/or python-dev discussions.

- Bug #1337990: clarified that ``doctest`` does not support examples
  requiring both expected output and an exception.


What's New in Python 2.5 alpha 1?
=================================

*Release date: 05-APR-2006*

Core and builtins
-----------------

- PEP 338: -m command line switch now delegates to runpy.run_module
  allowing it to support modules in packages and zipfiles

- On Windows, .DLL is not an accepted file name extension for
  extension modules anymore; extensions are only found if they
  end in .PYD.

- Bug #1421664: sys.stderr.encoding is now set to the same value as
  sys.stdout.encoding.

- __import__ accepts keyword arguments.

- Patch #1460496: round() now accepts keyword arguments.

- Fixed bug #1459029 - unicode reprs were double-escaped.

- Patch #1396919: The system scope threads are reenabled on FreeBSD
  5.4 and later versions.

- Bug #1115379: Compiling a Unicode string with an encoding declaration
  now gives a SyntaxError.

- Previously, Python code had no easy way to access the contents of a
  cell object. Now, a ``cell_contents`` attribute has been added
  (closes patch #1170323).

- Patch #1123430: Python's small-object allocator now returns an arena to
  the system ``free()`` when all memory within an arena becomes unused
  again.  Prior to Python 2.5, arenas (256KB chunks of memory) were never
  freed.  Some applications will see a drop in virtual memory size now,
  especially long-running applications that, from time to time, temporarily
  use a large number of small objects.  Note that when Python returns an
  arena to the platform C's ``free()``, there's no guarantee that the
  platform C library will in turn return that memory to the operating system.
  The effect of the patch is to stop making that impossible, and in tests it
  appears to be effective at least on Microsoft C and gcc-based systems.
  Thanks to Evan Jones for hard work and patience.

- Patch #1434038: property() now uses the getter's docstring if there is
  no "doc" argument given. This makes it possible to legitimately use
  property() as a decorator to produce a read-only property.

- PEP 357, patch 1436368: add an __index__ method to int/long and a matching
  nb_index slot to the PyNumberMethods struct.  The slot is consulted instead
  of requiring an int or long in slicing and a few other contexts, enabling
  other objects (e.g. Numeric Python's integers) to be used as slice indices.

- Fixed various bugs reported by Coverity's Prevent tool.

- PEP 352, patch #1104669: Make exceptions new-style objects.  Introduced the
  new exception base class, BaseException, which has a new message attribute.
  KeyboardInterrupt and SystemExit to directly inherit from BaseException now.
  Raising a string exception now raises a DeprecationWarning.

- Patch #1438387, PEP 328: relative and absolute imports. Imports can now be
  explicitly relative, using 'from .module import name' to mean 'from the same
  package as this module is in. Imports without dots still default to the
  old relative-then-absolute, unless 'from __future__ import
  absolute_import' is used.

- Properly check if 'warnings' raises an exception (usually when a filter set
  to "error" is triggered) when raising a warning for raising string
  exceptions.

- CO_GENERATOR_ALLOWED is no longer defined. This behavior is the default.
  The name was removed from Include/code.h.

- PEP 308: conditional expressions were added: (x if cond else y).

- Patch 1433928:
  - The copy module now "copies" function objects (as atomic objects).
  - dict.__getitem__ now looks for a __missing__ hook before raising
    KeyError.

- PEP 343: with statement implemented. Needs ``from __future__ import
  with_statement``. Use of 'with' as a variable will generate a warning.
  Use of 'as' as a variable will also generate a warning (unless it's
  part of an import statement).
  The following objects have __context__ methods:
  - The built-in file type.
  - The thread.LockType type.
  - The following types defined by the threading module:
    Lock, RLock, Condition, Semaphore, BoundedSemaphore.
  - The decimal.Context class.

- Fix the encodings package codec search function to only search
  inside its own package. Fixes problem reported in patch #1433198.

  Note: Codec packages should implement and register their own
  codec search function. PEP 100 has the details.

- PEP 353: Using ``Py_ssize_t`` as the index type.

- ``PYMALLOC_DEBUG`` builds now add ``4*sizeof(size_t)`` bytes of debugging
  info to each allocated block, since the ``Py_ssize_t`` changes (PEP 353)
  now allow Python to make use of memory blocks exceeding 2**32 bytes for
  some purposes on 64-bit boxes.  A ``PYMALLOC_DEBUG`` build was limited
  to 4-byte allocations before.

- Patch #1400181, fix unicode string formatting to not use the locale.
  This is how string objects work.  u'%f' could use , instead of .
  for the decimal point.  Now both strings and unicode always use periods.

- Bug #1244610, #1392915, fix build problem on OpenBSD 3.7 and 3.8.
  configure would break checking curses.h.

- Bug #959576: The pwd module is now built in. This allows Python to be
  built on UNIX platforms without $HOME set.

- Bug #1072182, fix some potential problems if characters are signed.

- Bug #889500, fix line number on SyntaxWarning for global declarations.

- Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter.

- Support for converting hex strings to floats no longer works.
  This was not portable.  float('0x3') now raises a ValueError.

- Patch #1382163: Expose Subversion revision number to Python.  New C API
  function Py_GetBuildNumber().  New attribute sys.subversion.  Build number
  is now displayed in interactive prompt banner.

- Implementation of PEP 341 - Unification of try/except and try/finally.
  "except" clauses can now be written together with a "finally" clause in
  one try statement instead of two nested ones.  Patch #1355913.

- Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec
  now encodes backslash correctly.

- Patch #1350409: Work around signal handling bug in Visual Studio 2005.

- Bug #1281408: Py_BuildValue now works correctly even with unsigned longs
  and long longs.

- SF Bug #1350188, "setdlopenflags" leads to crash upon "import"
  It was possible for dlerror() to return a NULL pointer, so
  it will now use a default error message in this case.

- Replaced most Unicode charmap codecs with new ones using the
  new Unicode translate string feature in the built-in charmap
  codec; the codecs were created from the mapping tables available
  at ftp.unicode.org and contain a few updates (e.g. the Mac OS
  encodings now include a mapping for the Apple logo)

- Added a few more codecs for Mac OS encodings

- Sped up some Unicode operations.

- A new AST parser implementation was completed. The abstract
  syntax tree is available for read-only (non-compile) access
  to Python code; an _ast module was added.

- SF bug #1167751: fix incorrect code being produced for generator expressions.
  The following code now raises a SyntaxError:  foo(a = i for i in range(10))

- SF Bug #976608: fix SystemError when mtime of an imported file is -1.

- SF Bug #887946: fix segfault when redirecting stdin from a directory.
  Provide a warning when a directory is passed on the command line.

- Fix segfault with invalid coding.

- SF bug #772896: unknown encoding results in MemoryError.

- All iterators now have a Boolean value of True.  Formerly, some iterators
  supported a __len__() method which evaluated to False when the iterator
  was empty.

- On 64-bit platforms, when __len__() returns a value that cannot be
  represented as a C int, raise OverflowError.

- test__locale is skipped on OS X < 10.4 (only partial locale support is
  present).

- SF bug #893549: parsing keyword arguments was broken with a few format
  codes.

- Changes donated by Elemental Security to make it work on AIX 5.3
  with IBM's 64-bit compiler (SF patch #1284289).  This also closes SF
  bug #105470: test_pwd fails on 64bit system (Opteron).

- Changes donated by Elemental Security to make it work on HP-UX 11 on
  Itanium2 with HP's 64-bit compiler (SF patch #1225212).

- Disallow keyword arguments for type constructors that don't use them
  (fixes bug #1119418).

- Forward UnicodeDecodeError into SyntaxError for source encoding errors.

- SF bug #900092: When tracing (e.g. for hotshot), restore 'return' events for
  exceptions that cause a function to exit.

- The implementation of set() and frozenset() was revised to use its
  own internal data structure.  Memory consumption is reduced by 1/3
  and there are modest speed-ups as well.  The API is unchanged.

- SF bug #1238681:  freed pointer is used in longobject.c:long_pow().

- SF bug #1229429: PyObject_CallMethod failed to decrement some
  reference counts in some error exit cases.

- SF bug #1185883:  Python's small-object memory allocator took over
  a block managed by the platform C library whenever a realloc specified
  a small new size.  However, there's no portable way to know then how
  much of the address space following the pointer is valid, so there's no
  portable way to copy data from the C-managed block into Python's
  small-object space without risking a memory fault.  Python's small-object
  realloc now leaves such blocks under the control of the platform C
  realloc.

- SF bug #1232517: An overflow error was not detected properly when
  attempting to convert a large float to an int in os.utime().

- SF bug #1224347: hex longs now print with lowercase letters just
  like their int counterparts.

- SF bug #1163563: the original fix for bug #1010677 ("thread Module
  Breaks PyGILState_Ensure()") broke badly in the case of multiple
  interpreter states; back out that fix and do a better job (see
  http://mail.python.org/pipermail/python-dev/2005-June/054258.html
  for a longer write-up of the problem).

- SF patch #1180995: marshal now uses a binary format by default when
  serializing floats.

- SF patch #1181301: on platforms that appear to use IEEE 754 floats,
  the routines that promise to produce IEEE 754 binary representations
  of floats now simply copy bytes around.

- bug #967182: disallow opening files with 'wU' or 'aU' as specified by PEP
  278.

- patch #1109424: int, long, float, complex, and unicode now check for the
  proper magic slot for type conversions when subclassed.  Previously the
  magic slot was ignored during conversion.  Semantics now match the way
  subclasses of str always behaved.  int/long/float, conversion of an instance
  to the base class has been moved to the proper nb_* magic slot and out of
  PyNumber_*().
  Thanks Walter Dörwald.

- Descriptors defined in C with a PyGetSetDef structure, where the setter is
  NULL, now raise an AttributeError when attempting to set or delete the
  attribute.  Previously a TypeError was raised, but this was inconsistent
  with the equivalent pure-Python implementation.

- It is now safe to call PyGILState_Release() before
  PyEval_InitThreads() (note that if there is reason to believe there
  are multiple threads around you still must call PyEval_InitThreads()
  before using the Python API; this fix is for extension modules that
  have no way of knowing if Python is multi-threaded yet).

- Typing Ctrl-C whilst raw_input() was waiting in a build with threads
  disabled caused a crash.

- Bug #1165306: instancemethod_new allowed the creation of a method
  with im_class == im_self == NULL, which caused a crash when called.

- Move exception finalisation later in the shutdown process - this
  fixes the crash seen in bug #1165761

- Added two new builtins, any() and all().

- Defining a class with empty parentheses is now allowed
  (e.g., ``class C(): pass`` is no longer a syntax error).
  Patch #1176012 added support to the 'parser' module and 'compiler' package
  (thanks to logistix for that added support).

- Patch #1115086: Support PY_LONGLONG in structmember.

- Bug #1155938: new style classes did not check that __init__() was
  returning None.

- Patch #802188: Report characters after line continuation character
  ('\') with a specific error message.

- Bug #723201: Raise a TypeError for passing bad objects to 'L' format.

- Bug #1124295: the __name__ attribute of file objects was
  inadvertently made inaccessible in restricted mode.

- Bug #1074011: closing sys.std{out,err} now causes a flush() and
  an ferror() call.

- min() and max() now support key= arguments with the same meaning as in
  list.sort().

- The peephole optimizer now performs simple constant folding in expressions:
      (2+3) --> (5).

- set and frozenset objects can now be marshalled.  SF #1098985.

- Bug #1077106: Poor argument checking could cause memory corruption
  in calls to os.read().

- The parser did not complain about future statements in illegal
  positions.  It once again reports a syntax error if a future
  statement occurs after anything other than a doc string.

- Change the %s format specifier for str objects so that it returns a
  unicode instance if the argument is not an instance of basestring and
  calling __str__ on the argument returns a unicode instance.

- Patch #1413181:  changed ``PyThreadState_Delete()`` to forget about the
  current thread state when the auto-GIL-state machinery knows about
  it (since the thread state is being deleted, continuing to remember it
  can't help, but can hurt if another thread happens to get created with
  the same thread id).

Extension Modules
-----------------

- Patch #1380952: fix SSL objects timing out on consecutive read()s

- Patch #1309579: wait3 and wait4 were added to the posix module.

- Patch #1231053: The audioop module now supports encoding/decoding of alaw.
  In addition, the existing ulaw code was updated.

- RFE #567972: Socket objects' family, type and proto properties are
  now exposed via new attributes.

- Everything under lib-old was removed.  This includes the following modules:
    Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep,
    lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse,
    util, whatsound, whrandom, zmod

- The following modules were removed:  regsub, reconvert, regex, regex_syntax.

- re and sre were swapped, so help(re) provides full help.  importing sre
  is deprecated.  The undocumented re.engine variable no longer exists.

- Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle
  SS2 (single-shift 2) escape sequences correctly.

- The unicodedata module was updated to the 4.1 version of the Unicode
  database. The 3.2 version is still available as unicodedata.db_3_2_0
  for applications that require this specific version (such as IDNA).

- The timing module is no longer built by default.  It was deprecated
  in PEP 4 in Python 2.0 or earlier.

- Patch 1433928: Added a new type, defaultdict, to the collections module.
  This uses the new __missing__ hook behavior added to dict (see above).

- Bug #854823: socketmodule now builds on Sun platforms even when
  INET_ADDRSTRLEN is not defined.

- Patch #1393157: os.startfile() now has an optional argument to specify
  a "command verb" to invoke on the file.

- Bug #876637, prevent stack corruption when socket descriptor
  is larger than FD_SETSIZE.

- Patch #1407135, bug #1424041: harmonize mmap behavior of anonymous memory.
  mmap.mmap(-1, size) now returns anonymous memory in both Unix and Windows.
  mmap.mmap(0, size) should not be used on Windows for anonymous memory.

- Patch #1422385: The nis module now supports access to domains other
  than the system default domain.

- Use Win32 API to implement os.stat/fstat. As a result, subsecond timestamps
  are reported, the limit on path name lengths is removed, and stat reports
  WindowsError now (instead of OSError).

- Add bsddb.db.DBEnv.set_tx_timestamp allowing time based database recovery.

- Bug #1413192, fix seg fault in bsddb if a transaction was deleted
  before the env.

- Patch #1103116: Basic AF_NETLINK support.

- Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...)

- Bug #1400822, _curses over{lay,write} doesn't work when passing 6 ints.
  Also fix ungetmouse() which did not accept arguments properly.
  The code now conforms to the documented signature.

- Bug #1400115, Fix segfault when calling curses.panel.userptr()
  without prior setting of the userptr.

- Fix 64-bit problems in bsddb.

- Patch #1365916: fix some unsafe 64-bit mmap methods.

- Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build
  problem on AIX.

- Bug #869197: os.setgroups rejects long integer arguments

- Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint

- Bug #1344508, Fix UNIX mmap leaking file descriptors

- Patch #1338314, Bug #1336623: fix tarfile so it can extract
  REGTYPE directories from tarfiles written by old programs.

- Patch #1407992, fixes broken bsddb module db associate when using
  BerkeleyDB 3.3, 4.0 or 4.1.

- Get bsddb module to build with BerkeleyDB version 4.4

- Get bsddb module to build with BerkeleyDB version 3.2

- Patch #1309009, Fix segfault in pyexpat when the XML document is in latin_1,
  but Python incorrectly assumes it is in UTF-8 format

- Fix parse errors in the readline module when compiling without threads.

- Patch #1288833: Removed thread lock from socket.getaddrinfo on
  FreeBSD 5.3 and later versions which got thread-safe getaddrinfo(3).

- Patches #1298449 and #1298499: Add some missing checks for error
  returns in cStringIO.c.

- Patch #1297028: fix segfault if call type on MultibyteCodec,
  MultibyteStreamReader, or MultibyteStreamWriter

- Fix memory leak in posix.access().

- Patch #1213831: Fix typo in unicodedata._getcode.

- Bug #1007046: os.startfile() did not accept unicode strings encoded in
  the file system encoding.

- Patch #756021: Special-case socket.inet_aton('255.255.255.255') for
  platforms that don't have inet_aton().

- Bug #1215928: Fix bz2.BZ2File.seek() for 64-bit file offsets.

- Bug #1191043: Fix bz2.BZ2File.(x)readlines for files containing one
  line without newlines.

- Bug #728515: mmap.resize() now resizes the file on Unix as it did
  on Windows.

- Patch #1180695: Add nanosecond stat resolution, and st_gen,
  st_birthtime for FreeBSD.

- Patch #1231069: The fcntl.ioctl function now uses the 'I' code for
  the request code argument, which results in more C-like behaviour
  for large or negative values.

- Bug #1234979: For the argument of thread.Lock.acquire, the Windows
  implementation treated all integer values except 1 as false.

- Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly.

- Patch #1212117: os.stat().st_flags is now accessible as a attribute
  if available on the platform.

- Patch #1103951: Expose O_SHLOCK and O_EXLOCK in the posix module if
  available on the platform.

- Bug #1166660: The readline module could segfault if hook functions
  were set in a different thread than that which called readline.

- collections.deque objects now support a remove() method.

- operator.itemgetter() and operator.attrgetter() now support retrieving
  multiple fields.  This provides direct support for sorting on multiple
  keys (primary, secondary, etc).

- os.access now supports Unicode path names on non-Win32 systems.

- Patches #925152, #1118602: Avoid reading after the end of the buffer
  in pyexpat.GetInputContext.

- Patches #749830, #1144555: allow UNIX mmap size to default to current
  file size.

- Added functional.partial().  See PEP309.

- Patch #1093585: raise a ValueError for negative history items in readline.
  {remove_history,replace_history}

- The spwd module has been added, allowing access to the shadow password
  database.

- stat_float_times is now True.

- array.array objects are now picklable.

- the cPickle module no longer accepts the deprecated None option in the
  args tuple returned by __reduce__().

- itertools.islice() now accepts None for the start and step arguments.
  This allows islice() to work more readily with slices:
      islice(s.start, s.stop, s.step)

- datetime.datetime() now has a strptime class method which can be used to
  create datetime object using a string and format.

- Patch #1117961: Replace the MD5 implementation from RSA Data Security Inc
  with the implementation from http://sourceforge.net/projects/libmd5-rfc/.

Library
-------

- Patch #1388073: Numerous __-prefixed attributes of unittest.TestCase have
  been renamed to have only a single underscore prefix.  This was done to
  make subclassing easier.

- PEP 338: new module runpy defines a run_module function to support
  executing modules which provide access to source code or a code object
  via the PEP 302 import mechanisms.

- The email module's parsedate_tz function now sets the daylight savings
  flag to -1 (unknown) since it can't tell from the date whether it should
  be set.

- Patch #624325: urlparse.urlparse() and urlparse.urlsplit() results
  now sport attributes that provide access to the parts of the result.

- Patch #1462498: sgmllib now handles entity and character references
  in attribute values.

- Added the sqlite3 package. This is based on pysqlite2.1.3, and provides
  a DB-API interface in the standard library. You'll need sqlite 3.0.8 or
  later to build this - if you have an earlier version, the C extension
  module will not be built.

- Bug #1460340: ``random.sample(dict)`` failed in various ways.  Dicts
  aren't officially supported here, and trying to use them will probably
  raise an exception some day.  But dicts have been allowed, and "mostly
  worked", so support for them won't go away without warning.

- Bug #1445068: getpass.getpass() can now be given an explicit stream
  argument to specify where to write the prompt.

- Patch #1462313, bug #1443328: the pickle modules now can handle classes
  that have __private names in their __slots__.

- Bug #1250170: mimetools now handles socket.gethostname() failures gracefully.

- patch #1457316: "setup.py upload" now supports --identity to select the
  key to be used for signing the uploaded code.

- Queue.Queue objects now support .task_done() and .join() methods
  to make it easier to monitor when daemon threads have completed
  processing all enqueued tasks.  Patch #1455676.

- popen2.Popen objects now preserve the command in a .cmd attribute.

- Added the ctypes ffi package.

- email 4.0 package now integrated.  This is largely the same as the email 3.0
  package that was included in Python 2.3, except that PEP 8 module names are
  now used (e.g. mail.message instead of email.Message).  The MIME classes
  have been moved to a subpackage (e.g. email.mime.text instead of
  email.MIMEText).  The old names are still supported for now.  Several
  deprecated Message methods have been removed and lots of bugs have been
  fixed.  More details can be found in the email package documentation.

- Patches #1436130/#1443155: codecs.lookup() now returns a CodecInfo object
  (a subclass of tuple) that provides incremental decoders and encoders
  (a way to use stateful codecs without the stream API). Python functions
  codecs.getincrementaldecoder() and codecs.getincrementalencoder() as well
  as C functions PyCodec_IncrementalEncoder() and PyCodec_IncrementalDecoder()
  have been added.

- Patch #1359365: Calling next() on a closed StringIO.String object raises
  a ValueError instead of a StopIteration now (like file and cString.String do).
  cStringIO.StringIO.isatty() will raise a ValueError now if close() has been
  called before (like file and StringIO.StringIO do).

- A regrtest option -w was added to re-run failed tests in verbose mode.

- Patch #1446372: quit and exit can now be called from the interactive
  interpreter to exit.

- The function get_count() has been added to the gc module, and gc.collect()
  grew an optional 'generation' argument.

- A library msilib to generate Windows Installer files, and a distutils
  command bdist_msi have been added.

- PEP 343: new module contextlib.py defines decorator @contextmanager
  and helpful context managers nested() and closing().

- The compiler package now supports future imports after the module docstring.

- Bug #1413790: zipfile now sanitizes absolute archive names that are
  not allowed by the specs.

- Patch #1215184: FileInput now can be given an opening hook which can
  be used to control how files are opened.

- Patch #1212287: fileinput.input() now has a mode parameter for
  specifying the file mode input files should be opened with.

- Patch #1215184: fileinput now has a fileno() function for getting the
  current file number.

- Patch #1349274: gettext.install() now optionally installs additional
  translation functions other than _() in the builtins namespace.

- Patch #1337756: fileinput now accepts Unicode filenames.

- Patch #1373643: The chunk module can now read chunks larger than
  two gigabytes.

- Patch #1417555: SimpleHTTPServer now returns Last-Modified headers.

- Bug #1430298: It is now possible to send a mail with an empty
  return address using smtplib.

- Bug #1432260: The names of lambda functions are now properly displayed
  in pydoc.

- Patch #1412872: zipfile now sets the creator system to 3 (Unix)
  unless the system is Win32.

- Patch #1349118: urllib now supports user:pass@ style proxy
  specifications, raises IOErrors when proxies for unsupported protocols
  are defined, and uses the https proxy on https redirections.

- Bug #902075: urllib2 now supports 'host:port' style proxy specifications.

- Bug #1407902: Add support for sftp:// URIs to urlparse.

- Bug #1371247: Update Windows locale identifiers in locale.py.

- Bug #1394565: SimpleHTTPServer now doesn't choke on query parameters
  any more.

- Bug #1403410: The warnings module now doesn't get confused
  when it can't find out the module name it generates a warning for.

- Patch #1177307: Added a new codec utf_8_sig for UTF-8 with a BOM signature.

- Patch #1157027: cookielib mishandles RFC 2109 cookies in Netscape mode

- Patch #1117398: cookielib.LWPCookieJar and .MozillaCookieJar now raise
  LoadError as documented, instead of IOError.  For compatibility,
  LoadError subclasses IOError.

- Added the hashlib module.  It provides secure hash functions for MD5 and
  SHA1, 224, 256, 384, and 512.  Note that recent developments make the
  historic MD5 and SHA1 unsuitable for cryptographic-strength applications.
  In <http://mail.python.org/pipermail/python-dev/2005-December/058850.html>
  Ronald L. Rivest offered this advice for Python:

      "The consensus of researchers in this area (at least as
      expressed at the NIST Hash Function Workshop 10/31/05),
      is that SHA-256 is a good choice for the time being, but
      that research should continue, and other alternatives may
      arise from this research.  The larger SHA's also seem OK."

- Added a subset of Fredrik Lundh's ElementTree package.  Available
  modules are xml.etree.ElementTree, xml.etree.ElementPath, and
  xml.etree.ElementInclude, from ElementTree 1.2.6.

- Patch #1162825: Support non-ASCII characters in IDLE window titles.

- Bug #1365984: urllib now opens "data:" URLs again.

- Patch #1314396: prevent deadlock for threading.Thread.join() when an exception
  is raised within the method itself on a previous call (e.g., passing in an
  illegal argument)

- Bug #1340337: change time.strptime() to always return ValueError when there
  is an error in the format string.

- Patch #754022: Greatly enhanced webbrowser.py (by Oleg Broytmann).

- Bug #729103: pydoc.py: Fix docother() method to accept additional
  "parent" argument.

- Patch #1300515: xdrlib.py: Fix pack_fstring() to really use null bytes
  for padding.

- Bug #1296004: httplib.py: Limit maximal amount of data read from the
  socket to avoid a MemoryError on Windows.

- Patch #1166948: locale.py: Prefer LC_ALL, LC_CTYPE and LANG over LANGUAGE
  to get the correct encoding.

- Patch #1166938: locale.py: Parse LANGUAGE as a colon separated list of
  languages.

- Patch #1268314: Cache lines in StreamReader.readlines for performance.

- Bug #1290505: Fix clearing the regex cache for time.strptime().

- Bug #1167128: Fix size of a symlink in a tarfile to be 0.

- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook
  functionality.

- Bug #1163178: Make IDNA return an empty string when the input is empty.

- Patch #848017: Make Cookie more RFC-compliant. Use CRLF as default output
  separator and do not output trailing semicolon.

- Patch #1062060: urllib.urlretrieve() now raises a new exception, named
  ContentTooShortException, when the actually downloaded size does not
  match the Content-Length header.

- Bug #1121494: distutils.dir_utils.mkpath now accepts Unicode strings.

- Bug #1178484: Return complete lines from codec stream readers
  even if there is an exception in later lines, resulting in
  correct line numbers for decoding errors in source code.

- Bug #1192315: Disallow negative arguments to clear() in pdb.

- Patch #827386: Support absolute source paths in msvccompiler.py.

- Patch #1105730: Apply the new implementation of commonprefix in posixpath
  to ntpath, macpath, os2emxpath and riscospath.

- Fix a problem in Tkinter introduced by SF patch #869468: delete bogus
  __hasattr__ and __delattr__ methods on class Tk that were breaking
  Tkdnd.

- Bug #1015140: disambiguated the term "article id" in nntplib docs and
  docstrings to either "article number" or "message id".

- Bug #1238170: threading.Thread.__init__ no longer has "kwargs={}" as a
  parameter, but uses the usual "kwargs=None".

- textwrap now processes text chunks at O(n) speed instead of O(n**2).
  Patch #1209527 (Contributed by Connelly).

- urllib2 has now an attribute 'httpresponses' mapping from HTTP status code
  to W3C name (404 -> 'Not Found'). RFE #1216944.

- Bug #1177468: Don't cache the /dev/urandom file descriptor for os.urandom,
  as this can cause problems with apps closing all file descriptors.

- Bug #839151: Fix an attempt to access sys.argv in the warnings module;
  it can be missing in embedded interpreters

- Bug #1155638: Fix a bug which affected HTTP 0.9 responses in httplib.

- Bug #1100201: Cross-site scripting was possible on BaseHTTPServer via
  error messages.

- Bug #1108948: Cookie.py produced invalid JavaScript code.

- The tokenize module now detects and reports indentation errors.
  Bug #1224621.

- The tokenize module has a new untokenize() function to support a full
  roundtrip from lexed tokens back to Python source code.  In addition,
  the generate_tokens() function now accepts a callable argument that
  terminates by raising StopIteration.

- Bug #1196315: fix weakref.WeakValueDictionary constructor.

- Bug #1213894: os.path.realpath didn't resolve symlinks that were the first
  component of the path.

- Patch #1120353: The xmlrpclib module provides better, more transparent,
  support for datetime.{datetime,date,time} objects.  With use_datetime set
  to True, applications shouldn't have to fiddle with the DateTime wrapper
  class at all.

- distutils.commands.upload was added to support uploading distribution
  files to PyPI.

- distutils.commands.register now encodes the data as UTF-8 before posting
  them to PyPI.

- decimal operator and comparison methods now return NotImplemented
  instead of raising a TypeError when interacting with other types.  This
  allows other classes to implement __radd__ style methods and have them
  work as expected.

- Bug #1163325:  Decimal infinities failed to hash.  Attempting to
  hash a NaN raised an InvalidOperation instead of a TypeError.

- Patch #918101: Add tarfile open mode r|* for auto-detection of the
  stream compression; add, for symmetry reasons, r:* as a synonym of r.

- Patch #1043890: Add extractall method to tarfile.

- Patch #1075887: Don't require MSVC in distutils if there is nothing
  to build.

- Patch #1103407: Properly deal with tarfile iterators when untarring
  symbolic links on Windows.

- Patch #645894: Use getrusage for computing the time consumption in
  profile.py if available.

- Patch #1046831: Use get_python_version where appropriate in sysconfig.py.

- Patch #1117454: Remove code to special-case cookies without values
  in LWPCookieJar.

- Patch #1117339: Add cookielib special name tests.

- Patch #1112812: Make bsddb/__init__.py more friendly for modulefinder.

- Patch #1110248: SYNC_FLUSH the zlib buffer for GZipFile.flush.

- Patch #1107973: Allow to iterate over the lines of a tarfile.ExFileObject.

- Patch #1104111: Alter setup.py --help and --help-commands.

- Patch #1121234: Properly cleanup _exit and tkerror commands.

- Patch #1049151: xdrlib now unpacks booleans as True or False.

- Fixed bug in a NameError bug in cookielib.  Patch #1116583.

- Applied a security fix to SimpleXMLRPCserver (PSF-2005-001).  This
  disables recursive traversal through instance attributes, which can
  be exploited in various ways.

- Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec
  flags on the HTTP listening socket.

- Bug #792570: SimpleXMLRPCServer had problems if the request grew too large.
  Fixed by reading the HTTP body in chunks instead of one big socket.read().

- Patches #893642, #1039083: add allow_none, encoding arguments to
  constructors of SimpleXMLRPCServer and CGIXMLRPCRequestHandler.

- Bug #1110478: Revert os.environ.update to do putenv again.

- Bug #1103844: fix distutils.install.dump_dirs() with negated options.

- os.{SEEK_SET, SEEK_CUR, SEEK_END} have been added for convenience.

- Enhancements to the csv module:

  + Dialects are now validated by the underlying C code, better
    reflecting its capabilities, and improving its compliance with
    PEP 305.
  + Dialect parameter parsing has been re-implemented to improve error
    reporting.
  + quotechar=None and quoting=QUOTE_NONE now work the way PEP 305
    dictates.
  + the parser now removes the escapechar prefix from escaped characters.
  + when quoting=QUOTE_NONNUMERIC, the writer now tests for numeric
    types, rather than any object that can be represented as a numeric.
  + when quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields
    to floats.
  + reader now allows \r characters to be quoted (previously it only allowed
    \n to be quoted).
  + writer doublequote handling improved.
  + Dialect classes passed to the module are no longer instantiated by
    the module before being parsed (the former validation scheme required
    this, but the mechanism was unreliable).
  + The dialect registry now contains instances of the internal
    C-coded dialect type, rather than references to python objects.
  + the internal c-coded dialect type is now immutable.
  + register_dialect now accepts the same keyword dialect specifications
    as the reader and writer, allowing the user to register dialects
    without first creating a dialect class.
  + a configurable limit to the size of parsed fields has been added -
    previously, an unmatched quote character could result in the entire
    file being read into the field buffer before an error was reported.
  + A new module method csv.field_size_limit() has been added that sets
    the parser field size limit (returning the former limit). The initial
    limit is 128kB.
  + A line_num attribute has been added to the reader object, which tracks
    the number of lines read from the source iterator. This is not
    the same as the number of records returned, as records can span
    multiple lines.
  + reader and writer objects were not being registered with the cyclic-GC.
    This has been fixed.

- _DummyThread objects in the threading module now delete self.__block that is
  inherited from _Thread since it uses up a lock allocated by 'thread'.  The
  lock primitives tend to be limited in number and thus should not be wasted on
  a _DummyThread object.  Fixes bug #1089632.

- The imghdr module now detects Exif files.

- StringIO.truncate() now correctly adjusts the size attribute.
  (Bug #951915).

- locale.py now uses an updated locale alias table (built using
  Tools/i18n/makelocalealias.py, a tool to parse the X11 locale
  alias file); the encoding lookup was enhanced to use Python's
  encoding alias table.

- moved deprecated modules to Lib/lib-old:  whrandom, tzparse, statcache.

- the pickle module no longer accepts the deprecated None option in the
  args tuple returned by __reduce__().

- optparse now optionally imports gettext.  This allows its use in setup.py.

- the pickle module no longer uses the deprecated bin parameter.

- the shelve module no longer uses the deprecated binary parameter.

- the pstats module no longer uses the deprecated ignore() method.

- the filecmp module no longer uses the deprecated use_statcache argument.

- unittest.TestCase.run() and unittest.TestSuite.run() can now be successfully
  extended or overridden by subclasses.  Formerly, the subclassed method would
  be ignored by the rest of the module.  (Bug #1078905).

- heapq.nsmallest() and heapq.nlargest() now support key= arguments with
  the same meaning as in list.sort().

- Bug #1076985: ``codecs.StreamReader.readline()`` now calls ``read()`` only
  once when a size argument is given. This prevents a buffer overflow in the
  tokenizer with very long source lines.

- Bug #1083110: ``zlib.decompress.flush()`` would segfault if called
  immediately after creating the object, without any intervening
  ``.decompress()`` calls.

- The reconvert.quote function can now emit triple-quoted strings.  The
  reconvert module now has some simple documentation.

- ``UserString.MutableString`` now supports negative indices in
  ``__setitem__`` and ``__delitem__``

- Bug #1149508: ``textwrap`` now handles hyphenated numbers (eg. "2004-03-05")
  correctly.

- Partial fixes for SF bugs #1163244 and #1175396: If a chunk read by
  ``codecs.StreamReader.readline()`` has a trailing "\r", read one more
  character even if the user has passed a size parameter to get a proper
  line ending. Remove the special handling of a "\r\n" that has been split
  between two lines.

- Bug #1251300: On UCS-4 builds the "unicode-internal" codec will now complain
  about illegal code points. The codec now supports PEP 293 style error
  handlers.

- Bug #1235646: ``codecs.StreamRecoder.next()`` now reencodes the data it reads
  from the input stream, so that the output is a byte string in the correct
  encoding instead of a unicode string.

- Bug #1202493: Fixing SRE parser to handle '{}' as perl does, rather than
  considering it exactly like a '*'.

- Bug #1245379: Add "unicode-1-1-utf-7" as an alias for "utf-7" to
  ``encodings.aliases``.

- ` uu.encode()`` and ``uu.decode()`` now support unicode filenames.

- Patch #1413711: Certain patterns of differences were making difflib
  touch the recursion limit.

- Bug #947906: An object oriented interface has been added to the calendar
  module. It's possible to generate HTML calendar now and the module can be
  called as a script (e.g. via ``python -mcalendar``). Localized month and
  weekday names can be ouput (even if an exotic encoding is used) using
  special classes that use unicode.

Build
-----

- Fix test_float, test_long, and test_struct failures on Tru64 with gcc
  by using -mieee gcc option.

- Patch #1432345: Make python compile on DragonFly.

- Build support for Win64-AMD64 was added.

- Patch #1428494: Prefer linking against ncursesw over ncurses library.

- Patch #881820: look for openpty and forkpty also in libbsd.

- The sources of zlib are now part of the Python distribution (zlib 1.2.3).
  The zlib module is now built in on Windows.

- Use -xcode=pic32 for CCSHARED on Solaris with SunPro.

- Bug #1189330: configure did not correctly determine the necessary
  value of LINKCC if python was built with GCC 4.0.

- Upgrade Windows build to zlib 1.2.3 which eliminates a potential security
  vulnerability in zlib 1.2.1 and 1.2.2.

- EXTRA_CFLAGS has been introduced as an environment variable to hold compiler
  flags that change binary compatibility.  Changes were also made to
  distutils.sysconfig to also use the environment variable when used during
  compilation of the interpreter and of C extensions through distutils.

- SF patch 1171735: Darwin 8's headers are anal about POSIX compliance,
  and linking has changed (prebinding is now deprecated, and libcc_dynamic
  no longer exists). This configure patch makes things right.

- Bug #1158607: Build with --disable-unicode again.

- spwdmodule.c is built only if either HAVE_GETSPNAM or HAVE_HAVE_GETSPENT is
  defined.  Discovered as a result of not being able to build on OS X.

- setup.py now uses the directories specified in LDFLAGS using the -L option
  and in CPPFLAGS using the -I option for adding library and include
  directories, respectively, for compiling extension modules against.  This has
  led to the core being compiled using the values in CPPFLAGS.  It also removes
  the need for the special-casing of both DarwinPorts and Fink for darwin since
  the proper directories can be specified in LDFLAGS (``-L/sw/lib`` for Fink,
  ``-L/opt/local/lib`` for DarwinPorts) and CPPFLAGS (``-I/sw/include`` for
  Fink, ``-I/opt/local/include`` for DarwinPorts).

- Test in configure.in that checks for tzset no longer dependent on tm->tm_zone
  to exist in the struct (not required by either ISO C nor the UNIX 2 spec).
  Tests for sanity in tzname when HAVE_TZNAME defined were also defined.
  Closes bug #1096244.  Thanks Gregory Bond.

C API
-----

- ``PyMem_{Del, DEL}`` and ``PyMem_{Free, FREE}`` no longer map to
  ``PyObject_{Free, FREE}``.  They map to the system ``free()`` now.  If memory
  is obtained via the ``PyObject_`` family, it must be released via the
  ``PyObject_`` family, and likewise for the ``PyMem_`` family.  This has
  always been officially true, but when Python's small-object allocator was
  introduced, an attempt was made to cater to a few extension modules
  discovered at the time that obtained memory via ``PyObject_New`` but
  released it via ``PyMem_DEL``.  It's years later, and if such code still
  exists it will fail now (probably with segfaults, but calling wrong
  low-level memory management functions can yield many symptoms).

- Added a C API for set and frozenset objects.

- Removed PyRange_New().

- Patch #1313939: PyUnicode_DecodeCharmap() accepts a unicode string as the
  mapping argument now. This string is used as a mapping table. Byte values
  greater than the length of the string and 0xFFFE are treated as undefined
  mappings.


Tests
-----

- In test_os, st_?time is now truncated before comparing it with ST_?TIME.

- Patch #1276356: New resource "urlfetch" is implemented.  This enables
  even impatient people to run tests that require remote files.


Documentation
-------------

- Bug #1402224: Add warning to dl docs about crashes.

- Bug #1396471: Document that Windows' ftell() can return invalid
  values for text files with UNIX-style line endings.

- Bug #1274828: Document os.path.splitunc().

- Bug #1190204: Clarify which directories are searched by site.py.

- Bug #1193849: Clarify os.path.expanduser() documentation.

- Bug #1243192: re.UNICODE and re.LOCALE affect \d, \D, \s and \S.

- Bug #755617: Document the effects of os.chown() on Windows.

- Patch #1180012: The documentation for modulefinder is now in the library reference.

- Patch #1213031: Document that os.chown() accepts argument values of -1.

- Bug #1190563: Document os.waitpid() return value with WNOHANG flag.

- Bug #1175022: Correct the example code for property().

- Document the IterableUserDict class in the UserDict module.
  Closes bug #1166582.

- Remove all latent references for "Macintosh" that referred to semantics for
  Mac OS 9 and change to reflect the state for OS X.
  Closes patch #1095802.  Thanks Jack Jansen.

Mac
---


New platforms
-------------

- FreeBSD 7 support is added.


Tools/Demos
-----------

- Created Misc/Vim/vim_syntax.py to auto-generate a python.vim file in that
  directory for syntax highlighting in Vim.  Vim directory was added and placed
  vimrc to it (was previous up a level).

- Added two new files to Tools/scripts: pysource.py, which recursively
  finds Python source files, and findnocoding.py, which finds Python
  source files that need an encoding declaration.
  Patch #784089, credits to Oleg Broytmann.

- Bug #1072853: pindent.py used an uninitialized variable.

- Patch #1177597: Correct Complex.__init__.

- Fixed a display glitch in Pynche, which could cause the right arrow to
  wiggle over by a pixel.


What's New in Python 2.4 final?
===============================

*Release date: 30-NOV-2004*

Core and builtins
-----------------

- Bug 875692: Improve signal handling, especially when using threads, by
  forcing an early re-execution of PyEval_EvalFrame() "periodic" code when
  things_to_do is not cleared by Py_MakePendingCalls().


What's New in Python 2.4 (release candidate 1)
==============================================

*Release date: 18-NOV-2004*

Core and builtins
-----------------

- Bug 1061968:  Fixes in 2.4a3 to address thread bug 1010677 reintroduced
  the years-old thread shutdown race bug 225673.  Numeric history lesson
  aside, all bugs in all three reports are fixed now.


Library
-------

- Bug 1052242: If exceptions are raised by an atexit handler function an
  attempt is made to execute the remaining handlers.  The last exception
  raised is re-raised.

- ``doctest``'s new support for adding ``pdb.set_trace()`` calls to
  doctests was broken in a dramatic but shallow way.  Fixed.

- Bug 1065388:  ``calendar``'s ``day_name``, ``day_abbr``, ``month_name``,
  and ``month_abbr`` attributes emulate sequences of locale-correct
  spellings of month and day names.  Because the locale can change at
  any time, the correct spelling is recomputed whenever one of these is
  indexed.  In the worst case, the index may be a slice object, so these
  recomputed every day or month name each time they were indexed.  This is
  much slower than necessary in the usual case, when the index is just an
  integer.  In that case, only the single spelling needed is recomputed
  now; and, when the index is a slice object, only the spellings needed
  by the slice are recomputed now.

- Patch 1061679: Added ``__all__`` to pickletools.py.

Build
-----

- Bug 1034277 / Patch 1035255: Remove compilation of core against CoreServices
  and CoreFoundation on OS X.  Involved removing PyMac_GetAppletScriptFile()
  which has no known users.  Thanks Bob Ippolito.

C API
-----

- The PyRange_New() function is deprecated.


What's New in Python 2.4 beta 2?
================================

*Release date: 03-NOV-2004*

License
-------

The Python Software Foundation changed the license under which Python
is released, to remove Python version numbers.  There were no other
changes to the license.  So, for example, wherever the license for
Python 2.3 said "Python 2.3", the new license says "Python".  The
intent is to make it possible to refer to the PSF license in a more
durable way.  For example, some people say they're confused by that
the Open Source Initiative's entry for the Python Software Foundation
License::

      http://www.opensource.org/licenses/PythonSoftFoundation.php

says "Python 2.1.1" all over it, wondering whether it applies only
to Python 2.1.1.

The official name of the new license is the Python Software Foundation
License Version 2.

Core and builtins
-----------------

- Bug #1055820 Cyclic garbage collection was not protecting against that
  calling a live weakref to a piece of cyclic trash could resurrect an
  insane mutation of the trash if any Python code ran during gc (via
  running a dead object's __del__ method, running another callback on a
  weakref to a dead object, or via any Python code run in any other thread
  that managed to obtain the GIL while a __del__ or callback was running
  in the thread doing gc).  The most likely symptom was "impossible"
  ``AttributeError`` exceptions, appearing seemingly at random, on weakly
  referenced objects.  The cure was to clear all weakrefs to unreachable
  objects before allowing any callbacks to run.

- Bug #1054139 _PyString_Resize() now invalidates its cached hash value.

Extension Modules
-----------------

- Bug #1048870:  the compiler now generates distinct code objects for
  functions with identical bodies.  This was producing confusing
  traceback messages which pointed to the function where the code
  object was first defined rather than the function being executed.

Library
-------

- Patch #1056967 changes the semantics of Template.safe_substitute() so that
  no ValueError is raised on an 'invalid' match group.  Now the delimiter is
  returned.

- Bug #1052503 pdb.runcall() was not passing along keyword arguments.

- Bug #902037: XML.sax.saxutils.prepare_input_source() now combines relative
  paths with a base path before checking os.path.isfile().

- The whichdb module can now be run from the command line.

- Bug #1045381: time.strptime() can now infer the date using %U or %W (week of
  the year) when the day of the week and year are also specified.

- Bug #1048816: fix bug in Ctrl-K at start of line in curses.textpad.Textbox

- Bug #1017553: fix bug in tarfile.filemode()

- Patch #737473: fix bug that old source code is shown in tracebacks even if
  the source code is updated and reloaded.

Build
-----

- Patch #1044395: --enable-shared is allowed in FreeBSD also.

What's New in Python 2.4 beta 1?
================================

*Release date: 15-OCT-2004*

Core and builtins
-----------------

- Patch #975056: Restartable signals were not correctly disabled on
  BSD systems. Consistently use PyOS_setsig() instead of signal().

- The internal portable implementation of thread-local storage (TLS), used
  by the ``PyGILState_Ensure()``/``PyGILState_Release()`` API, was not
  thread-correct.  This could lead to a variety of problems, up to and
  including segfaults.  See bug 1041645 for an example.

- Added a command line option, -m module, which searches sys.path for the
  module and then runs it.  (Contributed by Nick Coghlan.)

- The bytecode optimizer now folds tuples of constants into a single
  constant.

- SF bug #513866:  Float/long comparison anomaly.  Prior to 2.4b1, when
  an integer was compared to a float, the integer was coerced to a float.
  That could yield spurious overflow errors (if the integer was very
  large), and to anomalies such as
  ``long(1e200)+1 == 1e200 == long(1e200)-1``.  Coercion to float is no
  longer performed, and cases like ``long(1e200)-1 < 1e200``,
  ``long(1e200)+1 > 1e200`` and ``(1 << 20000) > 1e200`` are computed
  correctly now.

Extension modules
-----------------

- ``collections.deque`` objects didn't play quite right with garbage
  collection, which could lead to a segfault in a release build, or
  an assert failure in a debug build.  Also, added overflow checks,
  better detection of mutation during iteration, and shielded deque
  comparisons from unusual subclass overrides of the __iter__() method.

Library
-------

- Patch 1046644: distutils build_ext grew two new options - --swig for
  specifying the swig executable to use, and --swig-opts to specify
  options to pass to swig. --swig-opts="-c++" is the new way to spell
  --swig-cpp.

- Patch 983206: distutils now obeys environment variable LDSHARED, if
  it is set.

- Added Peter Astrand's subprocess.py module.  See PEP 324 for details.

- time.strptime() now properly escapes timezones and all other locale-specific
  strings for regex-specific symbols.  Was breaking under Japanese Windows when
  the timezone was specified as "Tokyo (standard time)".
  Closes bug #1039270.

- Updates for the email package:

  + email.Utils.formatdate() grew a 'usegmt' argument for HTTP support.
  + All deprecated APIs that in email 2.x issued warnings have been removed:
    _encoder argument to the MIMEText constructor, Message.add_payload(),
    Utils.dump_address_pair(), Utils.decode(), Utils.encode()
  + New deprecations: Generator.__call__(), Message.get_type(),
    Message.get_main_type(), Message.get_subtype(), the 'strict' argument to
    the Parser constructor.  These will be removed in email 3.1.
  + Support for Python earlier than 2.3 has been removed (see PEP 291).
  + All defect classes have been renamed to end in 'Defect'.
  + Some FeedParser fixes; also a MultipartInvariantViolationDefect will be
    added to messages that claim to be multipart but really aren't.
  + Updates to documentation.

- re's findall() and finditer() functions now take an optional flags argument
  just like the compile(), search(), and match() functions.  Also, documented
  the previously existing start and stop parameters for the findall() and
  finditer() methods of regular expression objects.

- rfc822 Messages now support iterating over the headers.

- The (undocumented) tarfile.Tarfile.membernames has been removed;
  applications should use the getmember function.

- httplib now offers symbolic constants for the HTTP status codes.

- SF bug #1028306:  Trying to compare a ``datetime.date`` to a
  ``datetime.datetime`` mistakenly compared only the year, month and day.
  Now it acts like a mixed-type comparison:  ``False`` for ``==``,
  ``True`` for ``!=``, and raises ``TypeError`` for other comparison
  operators.  Because datetime is a subclass of date, comparing only the
  base class (date) members can still be done, if that's desired, by
  forcing using of the approprate date method; e.g.,
  ``a_date.__eq__(a_datetime)`` is true if and only if the year, month
  and day members of ``a_date`` and ``a_datetime`` are equal.

- bdist_rpm now supports command line options --force-arch,
  {pre,post}-install,  {pre,post}-uninstall, and
  {prep,build,install,clean,verify}-script.

- SF patch #998993: The UTF-8 and the UTF-16 stateful decoders now support
  decoding incomplete input (when the input stream is temporarily exhausted).
  ``codecs.StreamReader`` now implements buffering, which enables proper
  readline support for the UTF-16 decoders. ``codecs.StreamReader.read()``
  has a new argument ``chars`` which specifies the number of characters to
  return. ``codecs.StreamReader.readline()`` and
  ``codecs.StreamReader.readlines()`` have a new argument ``keepends``.
  Trailing "\n"s will be stripped from the lines if ``keepends`` is false.

- The documentation for doctest is greatly expanded, and now covers all
  the new public features (of which there are many).

- ``doctest.master`` was put back in, and ``doctest.testmod()`` once again
  updates it.  This isn't good, because every ``testmod()`` call
  contributes to bloating the "hidden" state of ``doctest.master``, but
  some old code apparently relies on it.  For now, all we can do is
  encourage people to stitch doctests together via doctest's unittest
  integration features instead.

- httplib now handles ipv6 address/port pairs.

- SF bug #1017864: ConfigParser now correctly handles default keys,
  processing them with ``ConfigParser.optionxform`` when supplied,
  consistent with the handling of config file entries and runtime-set
  options.

- SF bug #997050: Document, test, & check for non-string values in
  ConfigParser.  Moved the new string-only restriction added in
  rev. 1.65 to the SafeConfigParser class, leaving existing
  ConfigParser & RawConfigParser behavior alone, and documented the
  conditions under which non-string values work.

Build
-----

- Building on darwin now includes /opt/local/include and /opt/local/lib for
  building extension modules.  This is so as to include software installed as
  a DarwinPorts port <http://darwinports.opendarwin.org/>

- pyport.h now defines a Py_IS_NAN macro.  It works as-is when the
  platform C computes true for ``x != x`` if and only if X is a NaN.
  Other platforms can override the default definition with a platform-
  specific spelling in that platform's pyconfig.h.  You can also override
  pyport.h's default Py_IS_INFINITY definition now.

C API
-----

- SF patch 1044089:  New function ``PyEval_ThreadsInitialized()`` returns
  non-zero if PyEval_InitThreads() has been called.

- The undocumented and unused extern int ``_PyThread_Started`` was removed.

- The C API calls ``PyInterpreterState_New()`` and ``PyThreadState_New()``
  are two of the very few advertised as being safe to call without holding
  the GIL.  However, this wasn't true in a debug build, as bug 1041645
  demonstrated.  In a debug build, Python redirects the ``PyMem`` family
  of calls to Python's small-object allocator, to get the benefit of
  its extra debugging capabilities.  But Python's small-object allocator
  isn't threadsafe, relying on the GIL to avoid the expense of doing its
  own locking.  ``PyInterpreterState_New()`` and ``PyThreadState_New()``
  call the platform ``malloc()`` directly now, regardless of build type.

- PyLong_AsUnsignedLong[Mask] now support int objects as well.

- SF patch #998993: ``PyUnicode_DecodeUTF8Stateful`` and
  ``PyUnicode_DecodeUTF16Stateful`` have been added, which implement stateful
  decoding.

Tests
-----

- test__locale ported to unittest

Mac
---

- ``plistlib`` now supports non-dict root objects.  There is also a new
  interface for reading and writing plist files: ``readPlist(pathOrFile)``
  and ``writePlist(rootObject, pathOrFile)``

Tools/Demos
-----------

- The text file comparison scripts ``ndiff.py`` and ``diff.py`` now
  read the input files in universal-newline mode.  This spares them
  from consuming a great deal of time to deduce the useless result that,
  e.g., a file with Windows line ends and a file with Linux line ends
  have no lines in common.


What's New in Python 2.4 alpha 3?
=================================

*Release date: 02-SEP-2004*

Core and builtins
-----------------

- SF patch #1007189: ``from ... import ...`` statements now allow the name
  list to be surrounded by parentheses.

- Some speedups for long arithmetic, thanks to Trevor Perrin.  Gradeschool
  multiplication was sped a little by optimizing the C code.  Gradeschool
  squaring was sped by about a factor of 2, by exploiting that about half
  the digit products are duplicates in a square.  Because exponentiation
  uses squaring often, this also speeds long power.  For example, the time
  to compute 17**1000000 dropped from about 14 seconds to 9 on my box due
  to this much.  The cutoff for Karatsuba multiplication was raised,
  since gradeschool multiplication got quicker, and the cutoff was
  aggressively small regardless.  The exponentiation algorithm was switched
  from right-to-left to left-to-right, which is more efficient for small
  bases.  In addition, if the exponent is large, the algorithm now does
  5 bits (instead of 1 bit) at a time.  That cut the time to compute
  17**1000000 on my box in half again, down to about 4.5 seconds.

- OverflowWarning is no longer generated.  PEP 237 scheduled this to
  occur in Python 2.3, but since OverflowWarning was disabled by default,
  nobody realized it was still being generated.  On the chance that user
  code is still using them, the Python builtin OverflowWarning, and
  corresponding C API PyExc_OverflowWarning, will exist until Python 2.5.

- Py_InitializeEx has been added.

- Fix the order of application of decorators.  The proper order is bottom-up;
  the first decorator listed is the last one called.

- SF patch #1005778.  Fix a seg fault if the list size changed while
  calling list.index().  This could happen if a rich comparison function
  modified the list.

- The ``func_name`` (a.k.a. ``__name__``) attribute of user-defined
  functions is now writable.

- code_new (a.k.a new.code()) now checks its arguments sufficiently
  carefully that passing them on to PyCode_New() won't trigger calls
  to Py_FatalError() or PyErr_BadInternalCall().  It is still the case
  that the returned code object might be entirely insane.

- Subclasses of string can no longer be interned.  The semantics of
  interning were not clear here -- a subclass could be mutable, for
  example -- and had bugs.  Explicitly interning a subclass of string
  via intern() will raise a TypeError.  Internal operations that attempt
  to intern a string subclass will have no effect.

- Bug 1003935:  xrange() could report bogus OverflowErrors.  Documented
  what xrange() intends, and repaired tests accordingly.

Extension modules
-----------------

- difflib now supports HTML side-by-side diff.

- os.urandom has been added for systems that support sources of random
  data.

- Patch 1012740:  truncate() on a writable cStringIO now resets the
  position to the end of the stream.  This is consistent with the original
  StringIO module and avoids inadvertently resurrecting data that was
  supposed to have been truncated away.

- Added socket.socketpair().

- Added CurrentByteIndex, CurrentColumnNumber, CurrentLineNumber
  members to xml.parsers.expat.XMLParser object.

- The mpz, rotor, and xreadlines modules, all deprecated in earlier
  versions of Python, have now been removed.

Library
-------

- Patch #934356: if a module defines __all__, believe that rather than using
  heuristics for filtering out imported names.

- Patch #941486: added os.path.lexists(), which returns True for broken
  symlinks, unlike os.path.exists().

- the random module now uses os.urandom() for seeding if it is available.
  Added a new generator based on os.urandom().

- difflib and diff.py can now generate HTML.

- bdist_rpm now includes version and release in the BuildRoot, and
  replaces - by ``_`` in version and release.

- distutils build/build_scripts now has an -e option to specify the
  path to the Python interpreter for installed scripts.

- PEP 292 classes Template and SafeTemplate are added to the string module.

- tarfile now generates GNU tar files by default.

- HTTPResponse has now a getheaders method.

- Patch #1006219: let inspect.getsource handle '@' decorators. Thanks Simon
  Percivall.

- logging.handlers.SMTPHandler.date_time has been removed;
  the class now uses email.Utils.formatdate to generate the time stamp.

- A new function tkFont.nametofont was added to return an existing
  font. The Font class constructor now has an additional exists argument
  which, if True, requests to return/configure an existing font, rather
  than creating a new one.

- Updated the decimal package's min() and max() methods to match the
  latest revision of the General Decimal Arithmetic Specification.
  Quiet NaNs are ignored and equal values are sorted based on sign
  and exponent.

- The decimal package's Context.copy() method now returns deep copies.

- Deprecated sys.exitfunc in favor of the atexit module.  The sys.exitfunc
  attribute will be kept around for backwards compatibility and atexit
  will just become the one preferred way to do it.

- patch #675551: Add get_history_item and replace_history_item functions
  to the readline module.

- bug #989672: pdb.doc and the help messages for the help_d and help_u methods
  of the pdb.Pdb class gives have been corrected. d(own) goes to a newer
  frame, u(p) to an older frame, not the other way around.

- bug #990669: os.path.realpath() will resolve symlinks before normalizing the
  path, as normalizing the path may alter the meaning of the path if it
  contains symlinks.

- bug #851123: shutil.copyfile will raise an exception when trying to copy a
  file onto a link to itself. Thanks Gregory Ball.

- bug #570300: Fix inspect to resolve file locations using os.path.realpath()
  so as to properly list all functions in a module when the module itself is
  reached through a symlink.  Thanks Johannes Gijsbers.

- doctest refactoring continued.  See the docs for details.  As part of
  this effort, some old and little- (never?) used features are now
  deprecated:  the Tester class, the module is_private() function, and the
  isprivate argument to testmod().  The Tester class supplied a feeble
  "by hand" way to combine multiple doctests, if you knew exactly what
  you were doing.  The newer doctest features for unittest integration
  already did a better job of that, are stronger now than ever, and the
  new DocTestRunner class is a saner foundation if you want to do it by
  hand.  The "private name" filtering gimmick was a mistake from the
  start, and testmod() changed long ago to ignore it by default.  If
  you want to filter out tests, the new DocTestFinder class can be used
  to return a list of all doctests, and you can filter that list by
  any computable criteria before passing it to a DocTestRunner instance.

- Bug #891637, patch #1005466: fix inspect.getargs() crash on def foo((bar)).

Tools/Demos
-----------

- IDLE's shortcut keys for windows are now case insensitive so that
  Control-V works the same as Control-v.

- pygettext.py: Generate POT-Creation-Date header in ISO format.

Build
-----

- Backward incompatibility:  longintrepr.h now triggers a compile-time
  error if SHIFT (the number of bits in a Python long "digit") isn't
  divisible by 5.  This new requirement allows simple code for the new
  5-bits-at-a-time long_pow() implementation.  If necessary, the
  restriction could be removed (by complicating long_pow(), or by
  falling back to the 1-bit-at-a-time algorithm), but there are no
  plans to do so.

- bug #991962: When building with --disable-toolbox-glue on Darwin no
  attempt to build Mac-specific modules occurs.

- The --with-tsc flag to configure to enable VM profiling with the
  processor's timestamp counter now works on PPC platforms.

- patch #1006629: Define _XOPEN_SOURCE to 500 on Solaris 8/9 to match
  GCC's definition and avoid redefinition warnings.

- Detect pthreads support (provided by gnu pth pthread emulation) on
  GNU/k*BSD systems.

- bug #1005737, #1007249: Fixed several build problems and warnings
  found on old/legacy C compilers of HP-UX, IRIX and Tru64.

C API
-----

..

Documentation
-------------

- patch #1005936, bug #1009373: fix index entries which contain
  an underscore when viewed with Acrobat.

- bug #990669: os.path.normpath may alter the meaning of a path if
  it contains symbolic links. This has been documented in a comment
  since 1992, but is now in the library reference as well.

New platforms
-------------

- FreeBSD 6 is now supported.

Tests
-----

..

Windows
-------

- Boosted the stack reservation for python.exe and pythonw.exe from
  the default 1MB to 2MB.  Stack frames under VC 7.1 for 2.4 are enough
  bigger than under VC 6.0 for 2.3.4 that deeply recursive progams
  within the default sys.getrecursionlimit() default value of 1000 were
  able to suffer undetected C stack overflows.  The standard test program
  test_compiler was one such program.  If a Python process on Windows
  "just vanishes" without a trace, and without an error message of any
  kind, but with an exit code of 128, undetected stack overflow may be
  the problem.

Mac
---

..


What's New in Python 2.4 alpha 2?
=================================

*Release date: 05-AUG-2004*

Core and builtins
-----------------

- Patch #980695:  Implements efficient string concatenation for statements
  of the form s=s+t and s+=t.  This will vary across implementations.
  Accordingly, the str.join() method is strongly preferred for performance
  sensitive code.

- PEP-0318, Function Decorators have been added to the language. These are
  implemented using the Java-style @decorator syntax, like so::

     @staticmethod
     def foo(bar):

  (The PEP needs to be updated to reflect the current state)

- When importing a module M raises an exception, Python no longer leaves M
  in sys.modules.  Before 2.4a2 it did, and a subsequent import of M would
  succeed, picking up a module object from sys.modules reflecting as much
  of the initialization of M as completed before the exception was raised.
  Subsequent imports got no indication that M was in a partially-
  initialized state, and the importers could get into arbitrarily bad
  trouble as a result (the M they got was in an unintended state,
  arbitrarily far removed from M's author's intent).  Now subsequent
  imports of M will continue raising exceptions (but if, for example, the
  source code for M is edited between import attempts, then perhaps later
  attempts will succeed, or raise a different exception).

  This can break existing code, but in such cases the code was probably
  working before by accident.  In the Python source, the only case of
  breakage discovered was in a test accidentally relying on a damaged
  module remaining in sys.modules.  Cases are also known where tests
  deliberately provoking import errors remove damaged modules from
  sys.modules themselves, and such tests will break now if they do an
  unconditional del sys.modules[M].

- u'%s' % obj will now try obj.__unicode__() first and fallback to
  obj.__str__() if no __unicode__ method can be found.

- Patch #550732: Add PyArg_VaParseTupleAndKeywords().  Analogous to
  PyArg_VaParse().  Both are now documented.  Thanks Greg Chapman.

- Allow string and unicode return types from .encode()/.decode()
  methods on string and unicode objects.  Added unicode.decode()
  which was missing for no apparent reason.

- An attempt to fix the mess that is Python's behaviour with
  signal handlers and threads, complicated by readline's behaviour.
  It's quite possible that there are still bugs here.

- Added C macros Py_CLEAR and Py_VISIT to ease the implementation of
  types that support garbage collection.

- Compiler now treats None as a constant.

- The type of values returned by __int__, __float__, __long__,
  __oct__, and __hex__ are now checked.  Returning an invalid type
  will cause a TypeError to be raised.  This matches the behavior of
  Jython.

- Implemented bind_textdomain_codeset() in locale module.

- Added a workaround for proper string operations in BSDs.  str.split
  and str.is* methods can now work correctly with UTF-8 locales.

- Bug #989185: unicode.iswide() and unicode.width() is dropped and
  the East Asian Width support is moved to unicodedata extension
  module.

- Patch #941229: The source code encoding in interactive mode
  now refers sys.stdin.encoding not just ISO-8859-1 anymore.  This
  allows for non-latin-1 users to write unicode strings directly.

Extension modules
-----------------

- cpickle now supports the same keyword arguments as pickle.

Library
-------

- Added new codecs and aliases for ISO_8859-11, ISO_8859-16 and
  TIS-620

- Thanks to Edward Loper, doctest has been massively refactored, and
  many new features were added.  Full docs will appear later.  For now
  the doctest module comments and new test cases give good coverage.
  The refactoring provides many hook points for customizing behavior
  (such as how to report errors, and how to compare expected to actual
  output).  New features include a <BLANKLINE> marker for expected
  output containing blank lines, options to produce unified or context
  diffs when actual output doesn't match expectations, an option to
  normalize whitespace before comparing, and an option to use an
  ellipsis to signify "don't care" regions of output.

- Tkinter now supports the wish -sync and -use options.

- The following methods in time support passing of None: ctime(), gmtime(),
  and localtime().  If None is provided, the current time is used (the
  same as when the argument is omitted).
  [SF bug 658254, patch 663482]

- nntplib does now allow to ignore a .netrc file.

- urllib2 now recognizes Basic authentication even if other authentication
  schemes are offered.

- Bug #1001053.  wave.open() now accepts unicode filenames.

- gzip.GzipFile has a new fileno() method, to retrieve the handle of the
  underlying file object (provided it has a fileno() method).  This is
  needed if you want to use os.fsync() on a GzipFile.

- imaplib has two new methods: deleteacl and myrights.

- nntplib has two new methods: description and descriptions. They
  use a more RFC-compliant way of getting a newsgroup description.

- Bug #993394.  Fix a possible red herring of KeyError in 'threading' being
  raised during interpreter shutdown from a registered function with atexit
  when dummy_threading is being used.

- Bug #857297/Patch #916874.  Fix an error when extracting a hard link
  from a tarfile.

- Patch #846659.  Fix an error in tarfile.py when using
  GNU longname/longlink creation.

- The obsolete FCNTL.py has been deleted.  The built-in fcntl module
  has been available (on platforms that support fcntl) since Python
  1.5a3, and all FCNTL.py did is export fcntl's names, after generating
  a deprecation warning telling you to use fcntl directly.

- Several new unicode codecs are added: big5hkscs, euc_jis_2004,
  iso2022_jp_2004, shift_jis_2004.

- Bug #788520.  Queue.{get, get_nowait, put, put_nowait} have new
  implementations, exploiting Conditions (which didn't exist at the time
  Queue was introduced).  A minor semantic change is that the Full and
  Empty exceptions raised by non-blocking calls now occur only if the
  queue truly was full or empty at the instant the queue was checked (of
  course the Queue may no longer be full or empty by the time a calling
  thread sees those exceptions, though).  Before, the exceptions could
  also be raised if it was "merely inconvenient" for the implementation
  to determine the true state of the Queue (because the Queue was locked
  by some other method in progress).

- Bugs #979794 and #980117: difflib.get_grouped_opcodes() now handles the
  case of comparing two empty lists.  This affected both context_diff() and
  unified_diff(),

- Bug #980938: smtplib now prints debug output to sys.stderr.

- Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by
  returning the last point in the path that was not part of any loop.  Thanks
  AM Kuchling.

- Bug #980327: ntpath not handles compressing erroneous slashes between the
  drive letter and the rest of the path.  Also clearly handles UNC addresses now
  as well.  Thanks Paul Moore.

- bug #679953: zipfile.py should now work for files over 2 GB.  The packed data
  for file sizes (compressed and uncompressed) was being stored as signed
  instead of unsigned.

- decimal.py now only uses signals in the IBM spec.  The other conditions are
  no longer part of the public API.

- codecs module now has two new generic APIs: encode() and decode()
  which don't restrict the return types (unlike the unicode and
  string methods of the same name).

- Non-blocking SSL sockets work again; they were broken in Python 2.3.
  SF patch 945642.

- doctest unittest integration improvements:

  o Improved the unitest test output for doctest-based unit tests

  o Can now pass setUp and tearDown functions when creating
    DocTestSuites.

- The threading module has a new class, local, for creating objects
  that provide thread-local data.

- Bug #990307: when keep_empty_values is True, cgi.parse_qsl()
  no longer returns spurious empty fields.

- Implemented bind_textdomain_codeset() in gettext module.

- Introduced in gettext module the l*gettext() family of functions,
  which return translation strings encoded in the preferred encoding,
  as informed by locale module's getpreferredencoding().

- optparse module (and tests) upgraded to Optik 1.5a1.  Changes:

  - Add expansion of default values in help text: the string
    "%default" in an option's help string is expanded to str() of
    that option's default value, or "none" if no default value.

  - Bug #955889: option default values that happen to be strings are
    now processed in the same way as values from the command line; this
    allows generation of nicer help when using custom types.  Can
    be disabled with parser.set_process_default_values(False).

  - Bug #960515: don't crash when generating help for callback
    options that specify 'type', but not 'dest' or 'metavar'.

  - Feature #815264: change the default help format for short options
    that take an argument from e.g. "-oARG" to "-o ARG"; add
    set_short_opt_delimiter() and set_long_opt_delimiter() methods to
    HelpFormatter to allow (slight) customization of the formatting.

  - Patch #736940: internationalize Optik: all built-in user-
    targeted literal strings are passed through gettext.gettext().  (If
    you want translations (.po files), they're not included with Python
    -- you'll find them in the Optik source distribution from
    http://optik.sourceforge.net/ .)

  - Bug #878453: respect $COLUMNS environment variable for
    wrapping help output.

  - Feature #988122: expand "%prog" in the 'description' passed
    to OptionParser, just like in the 'usage' and 'version' strings.
    (This is *not* done in the 'description' passed to OptionGroup.)

C API
-----

- PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx():  if an
  error occurs while loading the module, these now delete the module's
  entry from sys.modules.  All ways of loading modules eventually call
  one of these, so this is an error-case change in semantics for all
  ways of loading modules.  In rare cases, a module loader may wish
  to keep a module object in sys.modules despite that the module's
  code cannot be executed.  In such cases, the module loader must
  arrange to reinsert the name and module object in sys.modules.
  PyImport_ReloadModule() has been changed to reinsert the original
  module object into sys.modules if the module reload fails, so that
  its visible semantics have not changed.

- A large pile of datetime field-extraction macros is now documented,
  thanks to Anthony Tuininga (patch #986010).

Documentation
-------------

- Improved the tutorial on creating types in C.

  - point out the importance of reassigning data members before
    assigning their values

  - correct my misconception about return values from visitprocs. Sigh.

  - mention the labor saving Py_VISIT and Py_CLEAR macros.

- Major rewrite of the math module docs, to address common confusions.

Tests
-----

- The test data files for the decimal test suite are now installed on
  platforms that use the Makefile.

- SF patch 995225:  The test file testtar.tar accidentally contained
  CVS keywords (like $Id$), which could cause spurious failures in
  test_tarfile.py depending on how the test file was checked out.


What's New in Python 2.4 alpha 1?
=================================

*Release date: 08-JUL-2004*

Core and builtins
-----------------

- weakref.ref is now the type object also known as
  weakref.ReferenceType; it can be subclassed like any other new-style
  class.  There's less per-entry overhead in WeakValueDictionary
  objects now (one object instead of three).

- Bug #951851: Python crashed when reading import table of certain
  Windows DLLs.

- Bug #215126.  The locals argument to eval(), execfile(), and exec now
  accept any mapping type.

- marshal now shares interned strings. This change introduces
  a new .pyc magic.

- Bug #966623. classes created with type() in an exec(, {}) don't
  have a __module__, but code in typeobject assumed it would always
  be there.

- Python no longer relies on the LC_NUMERIC locale setting to be
  the "C" locale; as a result, it no longer tries to prevent changing
  the LC_NUMERIC category.

- Bug #952807:  Unpickling pickled instances of subclasses of
  datetime.date, datetime.datetime and datetime.time could yield insane
  objects.  Thanks to Jiwon Seo for a fix.

- Bug #845802: Python crashes when __init__.py is a directory.

- Unicode objects received two new methods: iswide() and width().
  These query East Asian width information, as specified in Unicode
  TR11.

- Improved the tuple hashing algorithm to give fewer collisions in
  common cases.  Fixes bug  #942952.

- Implemented generator expressions (PEP 289).  Coded by Jiwon Seo.

- Enabled the profiling of C extension functions (and builtins) - check
  new documentation and modified profile and bdb modules for more details

- Set file.name to the object passed to open (instead of a new string)

- Moved tracebackobject into traceback.h and renamed to PyTracebackObject

- Optimized the byte coding for multiple assignments like "a,b=b,a" and
  "a,b,c=1,2,3".  Improves their speed by 25% to 30%.

- Limit the nested depth of a tuple for the second argument to isinstance()
  and issubclass() to the recursion limit of the interpreter.
  Fixes bug  #858016 .

- Optimized dict iterators, creating separate types for each
  and having them reveal their length.  Also optimized the
  methods:  keys(), values(), and items().

- Implemented a newcode opcode, LIST_APPEND, that simplifies
  the generated bytecode for list comprehensions and further
  improves their performance (about 35%).

- Implemented rich comparisons for floats, which seems to make
  comparisons involving NaNs somewhat less surprising when the
  underlying C compiler actually implements C99 semantics.

- Optimized list.extend() to save memory and no longer create
  intermediate sequences.  Also, extend() now pre-allocates the
  needed memory whenever the length of the iterable is known in
  advance -- this halves the time to extend the list.

- Optimized list resize operations to make fewer calls to the system
  realloc().  Significantly speeds up list appends, list pops,
  list comprehensions, and the list constructor (when the input iterable
  length is not known).

- Changed the internal list over-allocation scheme.  For larger lists,
  overallocation ranged between 3% and 25%.  Now, it is a constant 12%.
  For smaller lists (n<8), overallocation was upto eight elements.  Now,
  the overallocation is no more than three elements -- this improves space
  utilization for applications that have large numbers of small lists.

- Most list bodies now get re-used rather than freed.  Speeds up list
  instantiation and deletion by saving calls to malloc() and free().

- The dict.update() method now accepts all the same argument forms
  as the dict() constructor.  This now includes item lists and/or
  keyword arguments.

- Support for arbitrary objects supporting the read-only buffer
  interface as the co_code field of code objects (something that was
  only possible to create from C code) has been removed.

- Made omitted callback and None equivalent for weakref.ref() and
  weakref.proxy(); the None case wasn't handled correctly in all
  cases.

- Fixed problem where PyWeakref_NewRef() and PyWeakref_NewProxy()
  assumed that initial existing entries in an object's weakref list
  would not be removed while allocating a new weakref object.  Since
  GC could be invoked at that time, however, that assumption was
  invalid.  In a truly obscure case of GC being triggered during
  creation for a new weakref object for an referent which already
  has a weakref without a callback which is only referenced from
  cyclic trash, a memory error can occur.  This consistently created a
  segfault in a debug build, but provided less predictable behavior in
  a release build.

- input() built-in function now respects compiler flags such as
  __future__ statements.  SF patch 876178.

- Removed PendingDeprecationWarning from apply().  apply() remains
  deprecated, but the nuisance warning will not be issued.

- At Python shutdown time (Py_Finalize()), 2.3 called cyclic garbage
  collection twice, both before and after tearing down modules.  The
  call after tearing down modules has been disabled, because too much
  of Python has been torn down then for __del__ methods and weakref
  callbacks to execute sanely.  The most common symptom was a sequence
  of uninformative messages on stderr when Python shut down, produced
  by threads trying to raise exceptions, but unable to report the nature
  of their problems because too much of the sys module had already been
  destroyed.

- Removed FutureWarnings related to hex/oct literals and conversions
  and left shifts.  (Thanks to Kalle Svensson for SF patch 849227.)
  This addresses most of the remaining semantic changes promised by
  PEP 237, except for repr() of a long, which still shows the trailing
  'L'.  The PEP appears to promise warnings for operations that
  changed semantics compared to Python 2.3, but this is not
  implemented; we've suffered through enough warnings related to
  hex/oct literals and I think it's best to be silent now.

- For str and unicode objects, the ljust(), center(), and rjust()
  methods now accept an optional argument specifying a fill
  character other than a space.

- When method objects have an attribute that can be satisfied either
  by the function object or by the method object, the function
  object's attribute usually wins.  Christian Tismer pointed out that
  that this is really a mistake, because this only happens for special
  methods (like __reduce__) where the method object's version is
  really more appropriate than the function's attribute.  So from now
  on, all method attributes will have precedence over function
  attributes with the same name.

- Critical bugfix, for SF bug 839548:  if a weakref with a callback,
  its callback, and its weakly referenced object, all became part of
  cyclic garbage during a single run of garbage collection, the order
  in which they were torn down was unpredictable.  It was possible for
  the callback to see partially-torn-down objects, leading to immediate
  segfaults, or, if the callback resurrected garbage objects, to
  resurrect insane objects that caused segfaults (or other surprises)
  later.  In one sense this wasn't surprising, because Python's cyclic gc
  had no knowledge of Python's weakref objects.  It does now.  When
  weakrefs with callbacks become part of cyclic garbage now, those
  weakrefs are cleared first.  The callbacks don't trigger then,
  preventing the problems.  If you need callbacks to trigger, then just
  as when cyclic gc is not involved, you need to write your code so
  that weakref objects outlive the objects they weakly reference.

- Critical bugfix, for SF bug 840829:  if cyclic garbage collection
  happened to occur during a weakref callback for a new-style class
  instance, subtle memory corruption was the result (in a release build;
  in a debug build, a segfault occurred reliably very soon after).
  This has been repaired.

- Compiler flags set in PYTHONSTARTUP are now active in __main__.

- Added two built-in types, set() and frozenset().

- Added a reversed() built-in function that returns a reverse iterator
  over a sequence.

- Added a sorted() built-in function that returns a new sorted list
  from any iterable.

- CObjects are now mutable (on the C level) through PyCObject_SetVoidPtr.

- list.sort() now supports three keyword arguments:  cmp, key, and reverse.
  The key argument can be a function of one argument that extracts a
  comparison key from the original record:  mylist.sort(key=str.lower).
  The reverse argument is a boolean value and if True will change the
  sort order as if the comparison arguments were reversed.  In addition,
  the documentation has been amended to provide a guarantee that all sorts
  starting with Py2.3 are guaranteed to be stable (the relative order of
  records with equal keys is unchanged).

- Added test whether wchar_t is signed or not. A signed wchar_t is not
  usable as internal unicode type base for Py_UNICODE since the
  unicode implementation assumes an unsigned type.

- Fixed a bug in the cache of length-one Unicode strings that could
  lead to a seg fault.  The specific problem occurred when an earlier,
  non-fatal error left an uninitialized Unicode object in the
  freelist.

- The % formatting operator now supports '%F' which is equivalent to
  '%f'.  This has always been documented but never implemented.

- complex(obj) could leak a little memory if obj wasn't a string or
  number.

- zip() with no arguments now returns an empty list instead of raising
  a TypeError exception.

- obj.__contains__() now returns True/False instead of 1/0.  SF patch
  820195.

- Python no longer tries to be smart about recursive comparisons.
  When comparing containers with cyclic references to themselves it
  will now just hit the recursion limit.  See SF patch 825639.

- str and unicode built-in types now have an rsplit() method that is
  same as split() except that it scans the string from the end
  working towards the beginning.  See SF feature request 801847.

- Fixed a bug in object.__reduce_ex__ when using protocol 2.  Failure
  to clear the error when attempts to get the __getstate__ attribute
  fail caused intermittent errors and odd behavior.

- buffer objects based on other objects no longer cache a pointer to
  the data and the data length.  Instead, the appropriate tp_as_buffer
  method is called as necessary.

- fixed: if a file is opened with an explicit buffer size >= 1, repeated
  close() calls would attempt to free() the buffer already free()ed on
  the first call.


Extension modules
-----------------

- Added socket.getservbyport(), and make the second argument in
  getservbyname() and getservbyport() optional.

- time module code that deals with input POSIX timestamps will now raise
  ValueError if more than a second is lost in precision when the
  timestamp is cast to the platform C time_t type.  There's no chance
  that the platform will do anything sensible with the result in such
  cases.  This includes ctime(), localtime() and gmtime().  Assorted
  fromtimestamp() and utcfromtimestamp() methods in the datetime module
  were also protected.  Closes bugs #919012 and 975996.

- fcntl.ioctl now warns if the mutate flag is not specified.

- nt now properly allows to refer to UNC roots, e.g. in nt.stat().

- the weakref module now supports additional objects:  array.array,
  sre.pattern_objects, file objects, and sockets.

- operator.isMappingType() and operator.isSequenceType() now give
  fewer false positives.

- socket.sslerror is now a subclass of socket.error .  Also added
  socket.error to the socket module's C API.

- Bug #920575: A problem where the _locale module segfaults on
  nl_langinfo(ERA) caused by GNU libc's illegal NULL return is fixed.

- array objects now support the copy module.  Also, their resizing
  scheme has been updated to match that used for list objects.  This improves
  the performance (speed and memory usage) of append() operations.
  Also, array.array() and array.extend() now accept any iterable argument
  for repeated appends without needing to create another temporary array.

- cStringIO.writelines() now accepts any iterable argument and writes
  the lines one at a time rather than joining them and writing once.
  Made a parallel change to StringIO.writelines().  Saves memory and
  makes suitable for use with generator expressions.

- time.strftime() now checks that the values in its time tuple argument
  are within the proper boundaries to prevent possible crashes from the
  platform's C library implementation of strftime().  Can possibly
  break code that uses values outside the range that didn't cause
  problems previously (such as sitting day of year to 0).  Fixes bug
  #897625.

- The socket module now supports Bluetooth sockets, if the
  system has <bluetooth/bluetooth.h>

- Added a collections module containing a new datatype, deque(),
  offering high-performance, thread-safe, memory friendly appends
  and pops on either side of the deque.

- Several modules now take advantage of collections.deque() for
  improved performance:  Queue, mutex, shlex, threading, and pydoc.

- The operator module has two new functions, attrgetter() and
  itemgetter() which are useful for creating fast data extractor
  functions for map(), list.sort(), itertools.groupby(), and
  other functions that expect a function argument.

- socket.SHUT_{RD,WR,RDWR} was added.

- os.getsid was added.

- The pwd module incorrectly advertised its struct type as
  struct_pwent; this has been renamed to struct_passwd.  (The old name
  is still supported for backwards compatibility.)

- The xml.parsers.expat module now provides Expat 1.95.7.

- socket.IPPROTO_IPV6 was added.

- readline.clear_history was added.

- select.select() now accepts sequences for its first three arguments.

- cStringIO now supports the f.closed attribute.

- The signal module now exposes SIGRTMIN and SIGRTMAX (if available).

- curses module now supports use_default_colors().  [patch #739124]

- Bug #811028: ncurses.h breakage on FreeBSD/MacOS X

- Bug #814613: INET_ADDRSTRLEN fix needed for all compilers on SGI

- Implemented non-recursive SRE matching scheme (#757624).

- Implemented (?(id/name)yes|no) support in SRE (#572936).

- random.seed() with no arguments or None uses time.time() as a default
  seed.  Modified to match Py2.2 behavior and use fractional seconds so
  that successive runs are more likely to produce different sequences.

- random.Random has a new method, getrandbits(k), which returns an int
  with k random bits.  This method is now an optional part of the API
  for user defined generators.  Any generator that defines genrandbits()
  can now use randrange() for ranges with a length >= 2**53.  Formerly,
  randrange would return only even numbers for ranges that large (see
  SF bug #812202).  Generators that do not define genrandbits() now
  issue a warning when randrange() is called with a range that large.

- itertools has a new function, groupby() for aggregating iterables
  into groups sharing the same key (as determined by a key function).
  It offers some of functionality of SQL's groupby keyword and of
  the Unix uniq filter.

- itertools now has a new tee() function which produces two independent
  iterators from a single iterable.

- itertools.izip() with no arguments now returns an empty iterator instead
  of raising a TypeError exception.

- Fixed #853061: allow BZ2Compressor.compress() to receive an empty string
  as parameter.

Library
-------

- Added a new module: cProfile, a C profiler with the same interface as the
  profile module.  cProfile avoids some of the drawbacks of the hotshot
  profiler and provides a bit more information than the other two profilers.
  Based on "lsprof" (patch #1212837).

- Bug #1266283: The new function "lexists" is now in os.path.__all__.

- Bug #981530: Fix UnboundLocalError in shutil.rmtree().  This affects
  the documented behavior: the function passed to the onerror()
  handler can now also be os.listdir.

- Bug #754449: threading.Thread objects no longer mask exceptions raised during
  interpreter shutdown with another exception from attempting to handle the
  original exception.

- Added decimal.py per PEP 327.

- Bug #981299: rsync is now a recognized protocol in urlparse that uses a
  "netloc" portion of a URL.

- Bug #919012: shutil.move() will not try to move a directory into itself.
  Thanks Johannes Gijsbers.

- Bug #934282: pydoc.stripid() is now case-insensitive.  Thanks Robin Becker.

- Bug #823209:  cmath.log() now takes an optional base argument so that its
  API matches math.log().

- Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions
  that generate a -debuginfo.rpm

- os.path.devnull has been added for all supported platforms.

- Fixed #877165: distutils now picks the right C++ compiler command
  on cygwin and mingw32.

- urllib.urlopen().readline() now handles HTTP/0.9 correctly.

- refactored site.py into functions.  Also wrote regression tests for the
  module.

- The distutils install command now supports the --home option and
  installation scheme for all platforms.

- asyncore.loop now has a repeat count parameter that defaults to
  looping forever.

- The distutils sdist command now ignores all .svn directories, in
  addition to CVS and RCS directories.  .svn directories hold
  administrative files for the Subversion source control system.

- Added a new module: cookielib.  Automatic cookie handling for HTTP
  clients.  Also, support for cookielib has been added to urllib2, so
  urllib2.urlopen() can transparently handle cookies.

- stringprep.py now uses built-in set() instead of sets.Set().

- Bug #876278: Unbounded recursion in modulefinder

- Bug #780300: Swap public and system ID in LexicalHandler.startDTD.
  Applications relying on the wrong order need to be corrected.

- Bug #926075: Fixed a bug that returns a wrong pattern object
  for a string or unicode object in sre.compile() when a different
  type pattern with the same value exists.

- Added countcallers arg to trace.Trace class (--trackcalls command line arg
  when run from the command prompt).

- Fixed a caching bug in platform.platform() where the argument of 'terse' was
  not taken into consideration when caching value.

- Added two new command-line arguments for profile (output file and
  default sort).

- Added global runctx function to profile module

- Add hlist missing entryconfigure and entrycget methods.

- The ptcp154 codec was added for Kazakh character set support.

- Support non-anonymous ftp URLs in urllib2.

- The encodings package will now apply codec name aliases
  first before starting to try the import of the codec module.
  This simplifies overriding built-in codecs with external
  packages, e.g. the included CJK codecs with the JapaneseCodecs
  package, by adjusting the aliases dictionary in encodings.aliases
  accordingly.

- base64 now supports RFC 3548 Base16, Base32, and Base64 encoding and
  decoding standards.

- urllib2 now supports processors.  A processor is a handler that
  implements an xxx_request or xxx_response method.  These methods are
  called for all requests.

- distutils compilers now compile source files in the same order as
  they are passed to the compiler.

- pprint.pprint() and pprint.pformat() now have additional parameters
  indent, width and depth.

- Patch #750542: pprint now will pretty print subclasses of list, tuple
  and dict too, as long as they don't overwrite __repr__().

- Bug #848614: distutils' msvccompiler fails to find the MSVC6
  compiler because of incomplete registry entries.

- httplib.HTTP.putrequest now offers to omit the implicit Accept-Encoding.

- Patch #841977: modulefinder didn't find extension modules in packages

- imaplib.IMAP4.thread was added.

- Plugged a minor hole in tempfile.mktemp() due to the use of
  os.path.exists(), switched to using os.lstat() directly if possible.

- bisect.py and heapq.py now have underlying C implementations
  for better performance.

- heapq.py has two new functions, nsmallest() and nlargest().

- traceback.format_exc has been added (similar to print_exc but it returns
  a string).

- xmlrpclib.MultiCall has been added.

- poplib.POP3_SSL has been added.

- tmpfile.mkstemp now returns an absolute path even if dir is relative.

- urlparse is RFC 2396 compliant.

- The fieldnames argument to the csv module's DictReader constructor is now
  optional.  If omitted, the first row of the file will be used as the
  list of fieldnames.

- encodings.bz2_codec was added for access to bz2 compression
  using "a long string".encode('bz2')

- Various improvements to unittest.py, realigned with PyUnit CVS.

- dircache now passes exceptions to the caller, instead of returning
  empty lists.

- The bsddb module and dbhash module now support the iterator and
  mapping protocols which make them more substitutable for dictionaries
  and shelves.

- The csv module's DictReader and DictWriter classes now accept keyword
  arguments.  This was an omission in the initial implementation.

- The email package handles some RFC 2231 parameters with missing
  CHARSET fields better.  It also includes a patch to parameter
  parsing when semicolons appear inside quotes.

- sets.py now runs under Py2.2.  In addition, the argument restrictions
  for most set methods (but not the operators) have been relaxed to
  allow any iterable.

- _strptime.py now has a behind-the-scenes caching mechanism for the most
  recent TimeRE instance used along with the last five unique directive
  patterns.  The overall module was also made more thread-safe.

- random.cunifvariate() and random.stdgamma() were deprecated in Py2.3
  and removed in Py2.4.

- Bug #823328: urllib2.py's HTTP Digest Auth support works again.

- Patch #873597: CJK codecs are imported into rank of default codecs.

Tools/Demos
-----------

- A hotshotmain script was added to the Tools/scripts directory that
  makes it easy to run a script under control of the hotshot profiler.

- The db2pickle and pickle2db scripts can now dump/load gdbm files.

- The file order on the command line of the pickle2db script was reversed.
  It is now [ picklefile ] dbfile.  This provides better symmetry with
  db2pickle.  The file arguments to both scripts are now source followed by
  destination in situations where both files are given.

- The pydoc script will display a link to the module documentation for
  modules determined to be part of the core distribution.  The documentation
  base directory defaults to http://www.python.org/doc/current/lib/ but can
  be changed by setting the PYTHONDOCS environment variable.

- texcheck.py now detects double word errors.

- md5sum.py mistakenly opened input files in text mode by default, a
  silent and dangerous change from previous releases.  It once again
  opens input files in binary mode by default.  The -t and -b flags
  remain for compatibility with the 2.3 release, but -b is the default
  now.

- py-electric-colon now works when pending-delete/delete-selection mode is
  in effect

- py-help-at-point is no longer bound to the F1 key - it's still bound to
  C-c C-h

- Pynche was fixed to not crash when there is no ~/.pynche file and no
  -d option was given.

Build
-----

- Bug #978645: Modules/getpath.c now builds properly in --disable-framework
  build under OS X.

- Profiling using gprof is now available if Python is configured with
  --enable-profiling.

- Profiling the VM using the Pentium TSC is now possible if Python
  is configured --with-tsc.

- In order to find libraries, setup.py now also looks in /lib64, for use
  on AMD64.

- Bug #934635: Fixed a bug where the configure script couldn't detect
  getaddrinfo() properly if the KAME stack had SCTP support.

- Support for missing ANSI C header files (limits.h, stddef.h, etc) was
  removed.

- Systems requiring the D4, D6 or D7 variants of pthreads are no longer
  supported (see PEP 11).

- Universal newline support can no longer be disabled (see PEP 11).

- Support for DGUX, SunOS 4, IRIX 4 and Minix was removed (see PEP 11).

- Support for systems requiring --with-dl-dld or --with-sgi-dl was removed
  (see PEP 11).

- Tests for sizeof(char) were removed since ANSI C mandates that
  sizeof(char) must be 1.

C API
-----

- Thanks to Anthony Tuininga, the datetime module now supplies a C API
  containing type-check macros and constructors.  See new docs in the
  Python/C API Reference Manual for details.

- Private function _PyTime_DoubleToTimet added, to convert a Python
  timestamp (C double) to platform time_t with some out-of-bounds
  checking.  Declared in new header file timefuncs.h.  It would be
  good to expose some other internal timemodule.c functions there.

- New public functions PyEval_EvaluateFrame and PyGen_New to expose
  generator objects.

- New public functions Py_IncRef() and Py_DecRef(), exposing the
  functionality of the Py_XINCREF() and Py_XDECREF macros. Useful for
  runtime dynamic embedding of Python.  See patch #938302, by Bob
  Ippolito.

- Added a new macro, PySequence_Fast_ITEMS, which retrieves a fast sequence's
  underlying array of PyObject pointers.  Useful for high speed looping.

- Created a new method flag, METH_COEXIST, which causes a method to be loaded
  even if already defined by a slot wrapper.  This allows a __contains__
  method, for example, to co-exist with a defined sq_contains slot.  This
  is helpful because the PyCFunction can take advantage of optimized calls
  whenever METH_O or METH_NOARGS flags are defined.

- Added a new function, PyDict_Contains(d, k) which is like
  PySequence_Contains() but is specific to dictionaries and executes
  about 10% faster.

- Added three new macros: Py_RETURN_NONE, Py_RETURN_TRUE, and Py_RETURN_FALSE.
  Each return the singleton they mention after Py_INCREF()ing them.

- Added a new function, PyTuple_Pack(n, ...) for constructing tuples from a
  variable length argument list of Python objects without having to invoke
  the more complex machinery of Py_BuildValue().  PyTuple_Pack(3, a, b, c)
  is equivalent to Py_BuildValue("(OOO)", a, b, c).

Windows
-------

- The _winreg module could segfault when reading very large registry
  values, due to unchecked alloca() calls (SF bug 851056).  The fix is
  uses either PyMem_Malloc(n) or PyString_FromStringAndSize(NULL, n),
  as appropriate, followed by a size check.

- file.truncate() could misbehave if the file was open for update
  (modes r+, rb+, w+, wb+), and the most recent file operation before
  the truncate() call was an input operation.  SF bug 801631.


What's New in Python 2.3 final?
===============================

*Release date: 29-Jul-2003*

IDLE
----

- Bug 778400:  IDLE hangs when selecting "Edit with IDLE" from explorer.
  This was unique to Windows, and was fixed by adding an -n switch to
  the command the Windows installer creates to execute "Edit with IDLE"
  context-menu actions.

- IDLE displays a new message upon startup:  some "personal firewall"
  kinds of programs (for example, ZoneAlarm) open a dialog of their
  own when any program opens a socket.  IDLE does use sockets, talking
  on the computer's internal loopback interface.  This connection is not
  visible on any external interface and no data is sent to or received
  from the Internet.  So, if you get such a dialog when opening IDLE,
  asking whether to let pythonw.exe talk to address 127.0.0.1, say yes,
  and rest assured no communication external to your machine is taking
  place.  If you don't allow it, IDLE won't be able to start.


What's New in Python 2.3 release candidate 2?
=============================================

*Release date: 24-Jul-2003*

Core and builtins
-----------------

- It is now possible to import from zipfiles containing additional
  data bytes before the zip compatible archive.  Zipfiles containing a
  comment at the end are still unsupported.

Extension modules
-----------------

- A longstanding bug in the parser module's initialization could cause
  fatal internal refcount confusion when the module got initialized more
  than once.  This has been fixed.

- Fixed memory leak in pyexpat; using the parser's ParseFile() method
  with open files that aren't instances of the standard file type
  caused an instance of the bound .read() method to be leaked on every
  call.

- Fixed some leaks in the locale module.

Library
-------

- Lib/encodings/rot_13.py when used as a script, now more properly
  uses the first Python interpreter on your path.

- Removed caching of TimeRE (and thus LocaleTime) in _strptime.py to
  fix a locale related bug in the test suite.  Although another patch
  was needed to actually fix the problem, the cache code was not
  restored.

IDLE
----

- Calltips patches.

Build
-----

- For MacOSX, added -mno-fused-madd to BASECFLAGS to fix test_coercion
  on Panther (OSX 10.3).

C API
-----

Windows
-------

- The tempfile module could do insane imports on Windows if PYTHONCASEOK
  was set, making temp file creation impossible.  Repaired.

- Add a patch to workaround pthread_sigmask() bugs in Cygwin.

Mac
---

- Various fixes to pimp.

- Scripts runs with pythonw no longer had full window manager access.

- Don't force boot-disk-only install, for reasons unknown it causes
  more problems than it solves.


What's New in Python 2.3 release candidate 1?
=============================================

*Release date: 18-Jul-2003*

Core and builtins
-----------------

- The new function sys.getcheckinterval() returns the last value set
  by sys.setcheckinterval().

- Several bugs in the symbol table phase of the compiler have been
  fixed.  Errors could be lost and compilation could fail without
  reporting an error.  SF patch 763201.

- The interpreter is now more robust about importing the warnings
  module.  In an executable generated by freeze or similar programs,
  earlier versions of 2.3 would fail if the warnings module could
  not be found on the file system.  Fixes SF bug 771097.

- A warning about assignments to module attributes that shadow
  builtins, present in earlier releases of 2.3, has been removed.

- It is not possible to create subclasses of built-in types like str
  and tuple that define an itemsize.  Earlier releases of Python 2.3
  allowed this by mistake, leading to crashes and other problems.

- The thread_id is now initialized to 0 in a non-thread build.  SF bug
  770247.

- SF bug 762891: "del p[key]" on proxy object no longer raises SystemError.

Extension modules
-----------------

- weakref.proxy() can now handle "del obj[i]" for proxy objects
  defining __delitem__.  Formerly, it generated a SystemError.

- SSL no longer crashes the interpreter when the remote side disconnects.

- On Unix the mmap module can again be used to map device files.

- time.strptime now exclusively uses the Python implementation
  contained within the _strptime module.

- The print slot of weakref proxy objects was removed, because it was
  not consistent with the object's repr slot.

- The mmap module only checks file size for regular files, not
  character or block devices.  SF patch 708374.

- The cPickle Pickler garbage collection support was fixed to traverse
  the find_class attribute, if present.

- There are several fixes for the bsddb3 wrapper module.

  bsddb3 no longer crashes if an environment is closed before a cursor
  (SF bug 763298).

  The DB and DBEnv set_get_returns_none function was extended to take
  a level instead of a boolean flag.  The new level 2 means that in
  addition, cursor.set()/.get() methods return None instead of raising
  an exception.

  A typo was fixed in DBCursor.join_item(), preventing a crash.

Library
-------

- distutils now supports MSVC 7.1

- doctest now examines all docstrings by default.  Previously, it would
  skip over functions with private names (as indicated by the underscore
  naming convention).  The old default created too much of a risk that
  user tests were being skipped inadvertently.  Note, this change could
  break code in the unlikely case that someone had intentionally put
  failing tests in the docstrings of private functions.  The breakage
  is easily fixable by specifying the old behavior when calling testmod()
  or Tester().

- There were several fixes to the way dumbdbms are closed.  It's vital
  that a dumbdbm database be closed properly, else the on-disk data
  and directory files can be left in mutually inconsistent states.
  dumbdbm.py's _Database.__del__() method attempted to close the
  database properly, but a shutdown race in _Database._commit() could
  prevent this from working, so that a program trusting __del__() to
  get the on-disk files in synch could be badly surprised.  The race
  has been repaired.  A sync() method was also added so that shelve
  can guarantee data is written to disk.

  The close() method can now be called more than once without complaint.

- The classes in threading.py are now new-style classes.  That they
  weren't before was an oversight.

- The urllib2 digest authentication handlers now define the correct
  auth_header.  The earlier versions would fail at runtime.

- SF bug 763023: fix uncaught ZeroDivisionError in difflib ratio methods
  when there are no lines.

- SF bug 763637: fix exception in Tkinter with after_cancel
  which could occur with Tk 8.4

- SF bug 770601: CGIHTTPServer.py now passes the entire environment
  to child processes.

- SF bug 765238: add filter to fnmatch's __all__.

- SF bug 748201: make time.strptime() error messages more helpful.

- SF patch 764470: Do not dump the args attribute of a Fault object in
  xmlrpclib.

- SF patch 549151: urllib and urllib2 now redirect POSTs on 301
  responses.

- SF patch 766650: The whichdb module was fixed to recognize dbm files
  generated by gdbm on OS/2 EMX.

- SF bugs 763047 and 763052: fixes bug of timezone value being left as
  -1 when ``time.tzname[0] == time.tzname[1] and not time.daylight``
  is true when it should only when time.daylight is true.

- SF bug 764548: re now allows subclasses of str and unicode to be
  used as patterns.

- SF bug 763637: In Tkinter, change after_cancel() to handle tuples
  of varying sizes.  Tk 8.4 returns a different number of values
  than Tk 8.3.

- SF bug 763023: difflib.ratio() did not catch zero division.

- The Queue module now has an __all__ attribute.

Tools/Demos
-----------

- See Lib/idlelib/NEWS.txt for IDLE news.

- SF bug 753592: webchecker/wsgui now handles user supplied directories.

- The trace.py script has been removed.  It is now in the standard library.

Build
-----

- Python now compiles with -fno-strict-aliasing if possible (SF bug 766696).

- The socket module compiles on IRIX 6.5.10.

- An irix64 system is treated the same way as an irix6 system (SF
  patch 764560).

- Several definitions were missing on FreeBSD 5.x unless the
  __BSD_VISIBLE symbol was defined.  configure now defines it as
  needed.

C API
-----

- Unicode objects now support mbcs as a built-in encoding, so the C
  API can use it without deferring to the encodings package.

Windows
-------

- The Windows implementation of PyThread_start_new_thread() never
  checked error returns from Windows functions correctly.  As a result,
  it could claim to start a new thread even when the Microsoft
  _beginthread() function failed (due to "too many threads" -- this is
  on the order of thousands when it happens).  In these cases, the
  Python exception ::

      thread.error: can't start new thread

  is raised now.

- SF bug 766669: Prevent a GPF on interpreter exit when sockets are in
  use.  The interpreter now calls WSACleanup() from Py_Finalize()
  instead of from DLL teardown.

Mac
---

- Bundlebuilder now inherits default values in the right way.  It was
  previously possible for app bundles to get a type of "BNDL" instead
  of "APPL."  Other improvements include, a --build-id option to
  specify the CFBundleIdentifier and using the --python option to set
  the executable in the bundle.

- Fixed two bugs in MacOSX framework handling.

- pythonw did not allow user interaction in 2.3rc1, this has been fixed.

- Python is now compiled with -mno-fused-madd, making all tests pass
  on Panther.

What's New in Python 2.3 beta 2?
================================

*Release date: 29-Jun-2003*

Core and builtins
-----------------

- A program can now set the environment variable PYTHONINSPECT to some
  string value in Python, and cause the interpreter to enter the
  interactive prompt at program exit, as if Python had been invoked
  with the -i option.

- list.index() now accepts optional start and stop arguments.  Similar
  changes were made to UserList.index(). SF feature request 754014.

- SF patch 751998 fixes an unwanted side effect of the previous fix
  for SF bug 742860 (the next item).

- SF bug 742860: "WeakKeyDictionary __delitem__ uses iterkeys".  This
  wasn't threadsafe, was very inefficient (expected time O(len(dict))
  instead of O(1)), and could raise a spurious RuntimeError if another
  thread mutated the dict during __delitem__, or if a comparison function
  mutated it.  It also neglected to raise KeyError when the key wasn't
  present; didn't raise TypeError when the key wasn't of a weakly
  referencable type; and broke various more-or-less obscure dict
  invariants by using a sequence of equality comparisons over the whole
  set of dict keys instead of computing the key's hash code to narrow
  the search to those keys with the same hash code.  All of these are
  considered to be bugs.  A new implementation of __delitem__ repairs all
  that, but note that fixing these bugs may change visible behavior in
  code relying (whether intentionally or accidentally) on old behavior.

- SF bug 734869: Fixed a compiler bug that caused a fatal error when
  compiling a list comprehension that contained another list comprehension
  embedded in a lambda expression.

- SF bug 705231:  builtin pow() no longer lets the platform C pow()
  raise -1.0 to integer powers, because (at least) glibc gets it wrong
  in some cases.  The result should be -1.0 if the power is odd and 1.0
  if the power is even, and any float with a sufficiently large exponent
  is (mathematically) an exact even integer.

- SF bug 759227: A new-style class that implements __nonzero__() must
  return a bool or int (but not an int subclass) from that method.  This
  matches the restriction on classic classes.

- The encoding attribute has been added for file objects, and set to
  the terminal encoding on Unix and Windows.

- The softspace attribute of file objects became read-only by oversight.
  It's writable again.

- Reverted a 2.3 beta 1 change to iterators for subclasses of list and
  tuple.  By default, the iterators now access data elements directly
  instead of going through __getitem__.  If __getitem__ access is
  preferred, then __iter__ can be overridden.

- SF bug 735247: The staticmethod and super types participate in
  garbage collection. Before this change, it was possible for leaks to
  occur in functions with non-global free variables that used these types.

Extension modules
-----------------

- the socket module has a new exception, socket.timeout, to allow
  timeouts to be handled separately from other socket errors.

- SF bug 751276: cPickle has fixed to propagate exceptions raised in
  user code.  In earlier versions, cPickle caught and ignored any
  exception when it performed operations that it expected to raise
  specific exceptions like AttributeError.

- cPickle Pickler and Unpickler objects now participate in garbage
  collection.

- mimetools.choose_boundary() could return duplicate strings at times,
  especially likely on Windows.  The strings returned are now guaranteed
  unique within a single program run.

- thread.interrupt_main() raises KeyboardInterrupt in the main thread.
  dummy_thread has also been modified to try to simulate the behavior.

- array.array.insert() now treats negative indices as being relative
  to the end of the array, just like list.insert() does. (SF bug #739313)

- The datetime module classes datetime, time, and timedelta are now
  properly subclassable.

- _tkinter.{get|set}busywaitinterval was added.

- itertools.islice() now accepts stop=None as documented.
  Fixes SF bug #730685.

- the bsddb185 module is built in one restricted instance -
  /usr/include/db.h exists and defines HASHVERSION to be 2.  This is true
  for many BSD-derived systems.


Library
-------

- Some happy doctest extensions from Jim Fulton have been added to
  doctest.py.  These are already being used in Zope3.  The two
  primary ones:

  doctest.debug(module, name) extracts the doctests from the named object
  in the given module, puts them in a temp file, and starts pdb running
  on that file.  This is great when a doctest fails.

  doctest.DocTestSuite(module=None) returns a synthesized unittest
  TestSuite instance, to be run by the unittest framework, which
  runs all the doctests in the module.  This allows writing tests in
  doctest style (which can be clearer and shorter than writing tests
  in unittest style), without losing unittest's powerful testing
  framework features (which doctest lacks).

- For compatibility with doctests created before 2.3, if an expected
  output block consists solely of "1" and the actual output block
  consists solely of "True", it's accepted as a match; similarly
  for "0" and "False".  This is quite un-doctest-like, but is practical.
  The behavior can be disabled by passing the new doctest module
  constant DONT_ACCEPT_TRUE_FOR_1 to the new optionflags optional
  argument.

- ZipFile.testzip() now only traps BadZipfile exceptions.  Previously,
  a bare except caught to much and reported all errors as a problem
  in the archive.

- The logging module now has a new function, makeLogRecord() making
  LogHandler easier to interact with DatagramHandler and SocketHandler.

- The cgitb module has been extended to support plain text display (SF patch
  569574).

- A brand new version of IDLE (from the IDLEfork project at
  SourceForge) is now included as Lib/idlelib.  The old Tools/idle is
  no more.

- Added a new module: trace (documentation missing).  This module used
  to be distributed in Tools/scripts.  It uses sys.settrace() to trace
  code execution -- either function calls or individual lines.  It can
  generate tracing output during execution or a post-mortem report of
  code coverage.

- The threading module has new functions settrace() and setprofile()
  that cooperate with the functions of the same name in the sys
  module.  A function registered with the threading module will
  be used for all threads it creates.  The new trace module uses this
  to provide tracing for code running in threads.

- copy.py: applied SF patch 707900, fixing bug 702858, by Steven
  Taschuk.  Copying a new-style class that had a reference to itself
  didn't work.  (The same thing worked fine for old-style classes.)
  Builtin functions are now treated as atomic, fixing bug #746304.

- difflib.py has two new functions:  context_diff() and unified_diff().

- More fixes to urllib (SF 549151): (a) When redirecting, always use
  GET.  This is common practice and more-or-less sanctioned by the
  HTTP standard. (b) Add a handler for 307 redirection, which becomes
  an error for POST, but a regular redirect for GET and HEAD

- Added optional 'onerror' argument to os.walk(), to control error
  handling.

- inspect.is{method|data}descriptor was added, to allow pydoc display
  __doc__ of data descriptors.

- Fixed socket speed loss caused by use of the _socketobject wrapper class
  in socket.py.

- timeit.py now checks the current directory for imports.

- urllib2.py now knows how to order proxy classes, so the user doesn't
  have to insert it in front of other classes, nor do dirty tricks like
  inserting a "dummy" HTTPHandler after a ProxyHandler when building an
  opener with proxy support.

- Iterators have been added for dbm keys.

- random.Random objects can now be pickled.

Tools/Demos
-----------

- pydoc now offers help on keywords and topics.

- Tools/idle is gone; long live Lib/idlelib.

- diff.py prints file diffs in context, unified, or ndiff formats,
  providing a command line interface to difflib.py.

- texcheck.py is a new script for making a rough validation of Python LaTeX
  files.

Build
-----

- Setting DESTDIR during 'make install' now allows specifying a
  different root directory.

C API
-----

- PyType_Ready():  If a type declares that it participates in gc
  (Py_TPFLAGS_HAVE_GC), and its base class does not, and its base class's
  tp_free slot is the default _PyObject_Del, and type does not define
  a tp_free slot itself, _PyObject_GC_Del is assigned to type->tp_free.
  Previously _PyObject_Del was inherited, which could at best lead to a
  segfault.  In addition, if even after this magic the type's tp_free
  slot is _PyObject_Del or NULL, and the type is a base type
  (Py_TPFLAGS_BASETYPE), TypeError is raised:  since the type is a base
  type, its dealloc function must call type->tp_free, and since the type
  is gc'able, tp_free must not be NULL or _PyObject_Del.

- PyThreadState_SetAsyncExc(): A new API (deliberately accessible only
  from C) to interrupt a thread by sending it an exception.  It is
  intentional that you have to write your own C extension to call it
  from Python.


New platforms
-------------

None this time.

Tests
-----

- test_imp rewritten so that it doesn't raise RuntimeError if run as a
  side effect of being imported ("import test.autotest").

Windows
-------

- The Windows installer ships with Tcl/Tk 8.4.3 (upgraded from 8.4.1).

- The installer always suggested that Python be installed on the C:
  drive, due to a hardcoded "C:" generated by the Wise installation
  wizard.  People with machines where C: is not the system drive
  usually want Python installed on whichever drive is their system drive
  instead.  We removed the hardcoded "C:", and two testers on machines
  where C: is not the system drive report that the installer now
  suggests their system drive.  Note that you can always select the
  directory you want in the "Select Destination Directory" dialog --
  that's what it's for.

Mac
---

- There's a new module called "autoGIL", which offers a mechanism to
  automatically release the Global Interpreter Lock when an event loop
  goes to sleep, allowing other threads to run. It's currently only
  supported on OSX, in the Mach-O version.
- The OSA modules now allow direct access to properties of the
  toplevel application class (in AppleScript terminology).
- The Package Manager can now update itself.

SourceForge Bugs and Patches Applied
------------------------------------

430160, 471893, 501716, 542562, 549151, 569574, 595837, 596434,
598163, 604210, 604716, 610332, 612627, 614770, 620190, 621891,
622042, 639139, 640236, 644345, 649742, 649742, 658233, 660022,
661318, 661676, 662807, 662923, 666219, 672855, 678325, 682347,
683486, 684981, 685773, 686254, 692776, 692959, 693094, 696777,
697989, 700827, 703666, 708495, 708604, 708901, 710733, 711902,
713722, 715782, 718286, 719359, 719367, 723136, 723831, 723962,
724588, 724767, 724767, 725942, 726150, 726446, 726869, 727051,
727719, 727719, 727805, 728277, 728563, 728656, 729096, 729103,
729293, 729297, 729300, 729317, 729395, 729622, 729817, 730170,
730296, 730594, 730685, 730826, 730963, 731209, 731403, 731504,
731514, 731626, 731635, 731643, 731644, 731644, 731689, 732124,
732143, 732234, 732284, 732284, 732479, 732761, 732783, 732951,
733667, 733781, 734118, 734231, 734869, 735051, 735293, 735527,
735613, 735694, 736962, 736962, 737970, 738066, 739313, 740055,
740234, 740301, 741806, 742126, 742741, 742860, 742860, 742911,
744041, 744104, 744238, 744687, 744877, 745055, 745478, 745525,
745620, 746012, 746304, 746366, 746801, 746953, 747348, 747667,
747954, 748846, 748849, 748973, 748975, 749191, 749210, 749759,
749831, 749911, 750008, 750092, 750542, 750595, 751038, 751107,
751276, 751451, 751916, 751941, 751956, 751998, 752671, 753451,
753602, 753617, 753845, 753925, 754014, 754340, 754447, 755031,
755087, 755147, 755245, 755683, 755987, 756032, 756996, 757058,
757229, 757818, 757821, 757822, 758112, 758910, 759227, 759889,
760257, 760703, 760792, 761104, 761337, 761519, 761830, 762455


What's New in Python 2.3 beta 1?
================================

*Release date: 25-Apr-2003*

Core and builtins
-----------------

- New format codes B, H, I, k and K have been implemented for
  PyArg_ParseTuple and PyBuild_Value.

- New built-in function sum(seq, start=0) returns the sum of all the
  items in iterable object seq, plus start (items are normally numbers,
  and cannot be strings).

- bool() called without arguments now returns False rather than
  raising an exception.  This is consistent with calling the
  constructors for the other built-in types -- called without argument
  they all return the false value of that type.  (SF patch #724135)

- In support of PEP 269 (making the pgen parser generator accessible
  from Python), some changes to the pgen code structure were made; a
  few files that used to be linked only with pgen are now linked with
  Python itself.

- The repr() of a weakref object now shows the __name__ attribute of
  the referenced object, if it has one.

- super() no longer ignores data descriptors, except __class__.  See
  the thread started at
  http://mail.python.org/pipermail/python-dev/2003-April/034338.html

- list.insert(i, x) now interprets negative i as it would be
  interpreted by slicing, so negative values count from the end of the
  list.  This was the only place where such an interpretation was not
  placed on a list index.

- range() now works even if the arguments are longs with magnitude
  larger than sys.maxint, as long as the total length of the sequence
  fits.  E.g., range(2**100, 2**101, 2**100) is the following list:
  [1267650600228229401496703205376L].  (SF patch #707427.)

- Some horridly obscure problems were fixed involving interaction
  between garbage collection and old-style classes with "ambitious"
  getattr hooks.  If an old-style instance didn't have a __del__ method,
  but did have a __getattr__ hook, and the instance became reachable
  only from an unreachable cycle, and the hook resurrected or deleted
  unreachable objects when asked to resolve "__del__", anything up to
  a segfault could happen.  That's been repaired.

- dict.pop now takes an optional argument specifying a default
  value to return if the key is not in the dict.  If a default is not
  given and the key is not found, a KeyError will still be raised.
  Parallel changes were made to UserDict.UserDict and UserDict.DictMixin.
  [SF patch #693753] (contributed by Michael Stone.)

- sys.getfilesystemencoding() was added to expose
  Py_FileSystemDefaultEncoding.

- New function sys.exc_clear() clears the current exception.  This is
  rarely needed, but can sometimes be useful to release objects
  referenced by the traceback held in sys.exc_info()[2].  (SF patch
  #693195.)

- On 64-bit systems, a dictionary could contain duplicate long/int keys
  if the key value was larger than 2**32.  See SF bug #689659.

- Fixed SF bug #663074. The codec system was using global static
  variables to store internal data. As a result, any attempts to use the
  unicode system with multiple active interpreters, or successive
  interpreter executions, would fail.

- "%c" % u"a" now returns a unicode string instead of raising a
  TypeError. u"%c" % 0xffffffff now raises a OverflowError instead
  of a ValueError to be consistent with "%c" % 256. See SF patch #710127.

Extension modules
-----------------

- The socket module now provides the functions inet_pton and inet_ntop
  for converting between string and packed representation of IP
  addresses.  There is also a new module variable, has_ipv6, which is
  True iff the current Python has IPv6 support.  See SF patch #658327.

- Tkinter wrappers around Tcl variables now pass objects directly
  to Tcl, instead of first converting them to strings.

- The .*? pattern in the re module is now special-cased to avoid the
  recursion limit.  (SF patch #720991 -- many thanks to Gary Herron
  and Greg Chapman.)

- New function sys.call_tracing() allows pdb to debug code
  recursively.

- New function gc.get_referents(obj) returns a list of objects
  directly referenced by obj.  In effect, it exposes what the object's
  tp_traverse slot does, and can be helpful when debugging memory
  leaks.

- The iconv module has been removed from this release.

- The platform-independent routines for packing floats in IEEE formats
  (struct.pack's <f, >f, <d, and >d codes; pickle and cPickle's protocol 1
  pickling of floats) ignored that rounding can cause a carry to
  propagate.  The worst consequence was that, in rare cases, <f and >f
  could produce strings that, when unpacked again, were a factor of 2
  away from the original float.  This has been fixed.  See SF bug
  #705836.

- New function time.tzset() provides access to the C library tzset()
  function, if supported.  (SF patch #675422.)

- Using createfilehandler, deletefilehandler, createtimerhandler functions
  on Tkinter.tkinter (_tkinter module) no longer crashes the interpreter.
  See SF bug #692416.

- Modified the fcntl.ioctl() function to allow modification of a passed
  mutable buffer (for details see the reference documentation).

- Made user requested changes to the itertools module.
  Subsumed the times() function into repeat().
  Added chain() and cycle().

- The rotor module is now deprecated; the encryption algorithm it uses
  is not believed to be secure, and including crypto code with Python
  has implications for exporting and importing it in various countries.

- The socket module now always uses the _socketobject wrapper class, even on
  platforms which have dup(2).  The makefile() method is built directly
  on top of the socket without duplicating the file descriptor, allowing
  timeouts to work properly.

Library
-------

- New generator function os.walk() is an easy-to-use alternative to
  os.path.walk().  See os module docs for details.  os.path.walk()
  isn't deprecated at this time, but may become deprecated in a
  future release.

- Added new module "platform" which provides a wide range of tools
  for querying platform dependent features.

- netrc now allows ASCII punctuation characters in passwords.

- shelve now supports the optional writeback argument, and exposes
  pickle protocol versions.

- Several methods of nntplib.NNTP have grown an optional file argument
  which specifies a file where to divert the command's output
  (already supported by the body() method).  (SF patch #720468)

- The self-documenting XML server library DocXMLRPCServer was added.

- Support for internationalized domain names has been added through
  the 'idna' and 'punycode' encodings, the 'stringprep' module, the
  'mkstringprep' tool, and enhancements to the socket and httplib
  modules.

- htmlentitydefs has two new dictionaries: name2codepoint maps
  HTML entity names to Unicode codepoints (as integers).
  codepoint2name is the reverse mapping. See SF patch #722017.

- pdb has a new command, "debug", which lets you step through
  arbitrary code from the debugger's (pdb) prompt.

- unittest.failUnlessEqual and its equivalent unittest.assertEqual now
  return 'not a == b' rather than 'a != b'.  This gives the desired
  result for classes that define __eq__ without defining __ne__.

- sgmllib now supports SGML marked sections, in particular the
  MS Office extensions.

- The urllib module now offers support for the iterator protocol.
  SF patch 698520 contributed by Brett Cannon.

- New module timeit provides a simple framework for timing the
  execution speed of expressions and statements.

- sets.Set objects now support mixed-type __eq__ and __ne__, instead
  of raising TypeError.  If x is a Set object and y is a non-Set object,
  x == y is False, and x != y is True.  This is akin to the change made
  for mixed-type comparisons of datetime objects in 2.3a2; more info
  about the rationale is in the NEWS entry for that.  See also SF bug
  report <http://www.python.org/sf/693121>.

- On Unix platforms, if os.listdir() is called with a Unicode argument,
  it now returns Unicode strings.  (This behavior was added earlier
  to the Windows NT/2k/XP version of os.listdir().)

- Distutils: both 'py_modules' and 'packages' keywords can now be specified
  in core.setup().  Previously you could supply one or the other, but
  not both of them.  (SF patch #695090 from Bernhard Herzog)

- New csv package makes it easy to read/write CSV files.

- Module shlex has been extended to allow posix-like shell parsings,
  including a split() function for easy spliting of quoted strings and
  commands. An iterator interface was also implemented.

Tools/Demos
-----------

- New script combinerefs.py helps analyze new PYTHONDUMPREFS output.
  See the module docstring for details.

Build
-----

- Fix problem building on OSF1 because the compiler only accepted
  preprocessor directives that start in column 1.  (SF bug #691793.)

C API
-----

- Added PyGC_Collect(), equivalent to calling gc.collect().

- PyThreadState_GetDict() was changed not to raise an exception or
  issue a fatal error when no current thread state is available.  This
  makes it possible to print dictionaries when no thread is active.

- LONG_LONG was renamed to PY_LONG_LONG.  Extensions that use this and
  need compatibility with previous versions can use this:

    #ifndef  PY_LONG_LONG
    #define  PY_LONG_LONG  LONG_LONG
    #endif

- Added PyObject_SelfIter() to fill the tp_iter slot for the
  typical case where the method returns its self argument.

- The extended type structure used for heap types (new-style
  classes defined by Python code using a class statement) is now
  exported from object.h as PyHeapTypeObject.  (SF patch #696193.)

New platforms
-------------

None this time.

Tests
-----

- test_timeout now requires -u network to be passed to regrtest to run.
  See SF bug #692988.

Windows
-------

- os.fsync() now exists on Windows, and calls the Microsoft _commit()
  function.

- New function winsound.MessageBeep() wraps the Win32 API
  MessageBeep().

Mac
---

- os.listdir() now returns Unicode strings on MacOS X when called with
  a Unicode argument. See the general news item under "Library".

- A new method MacOS.WMAvailable() returns true if it is safe to access
  the window manager, false otherwise.

- EasyDialogs dialogs are now movable-modal, and if the application is
  currently in the background they will ask to be moved to the foreground
  before displaying.

- OSA Scripting support has improved a lot, and gensuitemodule.py can now
  be used by mere mortals. The documentation is now also more or less
  complete.

- The IDE (in a framework build) now includes introductory documentation
  in Apple Help Viewer format.


What's New in Python 2.3 alpha 2?
=================================

*Release date: 19-Feb-2003*

Core and builtins
-----------------

- Negative positions returned from PEP 293 error callbacks are now
  treated as being relative to the end of the input string. Positions
  that are out of bounds raise an IndexError.

- sys.path[0] (the directory from which the script is loaded) is now
  turned into an absolute pathname, unless it is the empty string.
  (SF patch #664376.)

- Finally fixed the bug in compile() and exec where a string ending
  with an indented code block but no newline would raise SyntaxError.
  This would have been a four-line change in parsetok.c...  Except
  codeop.py depends on this behavior, so a compilation flag had to be
  invented that causes the tokenizer to revert to the old behavior;
  this required extra changes to 2 .h files, 2 .c files, and 2 .py
  files.  (Fixes SF bug #501622.)

- If a new-style class defines neither __new__ nor __init__, its
  constructor would ignore all arguments.  This is changed now: the
  constructor refuses arguments in this case.  This might break code
  that worked under Python 2.2.  The simplest fix is to add a no-op
  __init__: ``def __init__(self, *args, **kw): pass``.

- Through a bytecode optimizer bug (and I bet you didn't even know
  Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants
  with a leading minus sign would come out with the wrong sign.
  ("Unsigned" hex/oct constants are those with a face value in the
  range sys.maxint+1 through sys.maxint*2+1, inclusive; these have
  always been interpreted as negative numbers through sign folding.)
  E.g. 0xffffffff is -1, and -(0xffffffff) is 1, but -0xffffffff would
  come out as -4294967295.  This was the case in Python 2.2 through
  2.2.2 and 2.3a1, and in Python 2.4 it will once again have that
  value, but according to PEP 237 it really needs to be 1 now.  This
  will be backported to Python 2.2.3 a well.  (SF #660455)

- int(s, base) sometimes sign-folds hex and oct constants; it only
  does this when base is 0 and s.strip() starts with a '0'.  When the
  sign is actually folded, as in int("0xffffffff", 0) on a 32-bit
  machine, which returns -1, a FutureWarning is now issued; in Python
  2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and
  int("0xffffffff", 16) right now.  (PEP 347)

- super(X, x): x may now be a proxy for an X instance, i.e.
  issubclass(x.__class__, X) but not issubclass(type(x), X).

- isinstance(x, X): if X is a new-style class, this is now equivalent
  to issubclass(type(x), X) or issubclass(x.__class__, X).  Previously
  only type(x) was tested.  (For classic classes this was already the
  case.)

- compile(), eval() and the exec statement now fully support source code
  passed as unicode strings.

- int subclasses can be initialized with longs if the value fits in an int.
  See SF bug #683467.

- long(string, base) takes time linear in len(string) when base is a power
  of 2 now.  It used to take time quadratic in len(string).

- filter returns now Unicode results for Unicode arguments.

- raw_input can now return Unicode objects.

- List objects' sort() method now accepts None as the comparison function.
  Passing None is semantically identical to calling sort() with no
  arguments.

- Fixed crash when printing a subclass of str and __str__ returned self.
  See SF bug #667147.

- Fixed an invalid RuntimeWarning and an undetected error when trying
  to convert a long integer into a float which couldn't fit.
  See SF bug #676155.

- Function objects now have a __module__ attribute that is bound to
  the name of the module in which the function was defined.  This
  applies for C functions and methods as well as functions and methods
  defined in Python.  This attribute is used by pickle.whichmodule(),
  which changes the behavior of whichmodule slightly.  In Python 2.2
  whichmodule() returns "__main__" for functions that are not defined
  at the top-level of a module (examples: methods, nested functions).
  Now whichmodule() will return the proper module name.

Extension modules
-----------------

- operator.isNumberType() now checks that the object has a nb_int or
  nb_float slot, rather than simply checking whether it has a non-NULL
  tp_as_number pointer.

- The imp module now has ways to acquire and release the "import
  lock": imp.acquire_lock() and imp.release_lock().  Note: this is a
  reentrant lock, so releasing the lock only truly releases it when
  this is the last release_lock() call.  You can check with
  imp.lock_held().  (SF bug #580952 and patch #683257.)

- Change to cPickle to match pickle.py (see below and PEP 307).

- Fix some bugs in the parser module.  SF bug #678518.

- Thanks to Scott David Daniels, a subtle bug in how the zlib
  extension implemented flush() was fixed.  Scott also rewrote the
  zlib test suite using the unittest module.  (SF bug #640230 and
  patch #678531.)

- Added an itertools module containing high speed, memory efficient
  looping constructs inspired by tools from Haskell and SML.

- The SSL module now handles sockets with a timeout set correctly (SF
  patch #675750, fixing SF bug #675552).

- os/posixmodule has grown the sysexits.h constants (EX_OK and friends).

- Fixed broken threadstate swap in readline that could cause fatal
  errors when a readline hook was being invoked while a background
  thread was active.  (SF bugs #660476 and #513033.)

- fcntl now exposes the strops.h I_* constants.

- Fix a crash on Solaris that occurred when calling close() on
  an mmap'ed file which was already closed.  (SF patch #665913)

- Fixed several serious bugs in the zipimport implementation.

- datetime changes:

  The date class is now properly subclassable.  (SF bug #720908)

  The datetime and datetimetz classes have been collapsed into a single
  datetime class, and likewise the time and timetz classes into a single
  time class.  Previously, a datetimetz object with tzinfo=None acted
  exactly like a datetime object, and similarly for timetz.  This wasn't
  enough of a difference to justify distinct classes, and life is simpler
  now.

  today() and now() now round system timestamps to the closest
  microsecond <http://www.python.org/sf/661086>.  This repairs an
  irritation most likely seen on Windows systems.

  In dt.astimezone(tz), if tz.utcoffset(dt) returns a duration,
  ValueError is raised if tz.dst(dt) returns None (2.3a1 treated it
  as 0 instead, but a tzinfo subclass wishing to participate in
  time zone conversion has to take a stand on whether it supports
  DST; if you don't care about DST, then code dst() to return 0 minutes,
  meaning that DST is never in effect).

  The tzinfo methods utcoffset() and dst() must return a timedelta object
  (or None) now.  In 2.3a1 they could also return an int or long, but that
  was an unhelpfully redundant leftover from an earlier version wherein
  they couldn't return a timedelta.  TOOWTDI.

  The example tzinfo class for local time had a bug.  It was replaced
  by a later example coded by Guido.

  datetime.astimezone(tz) no longer raises an exception when the
  input datetime has no UTC equivalent in tz.  For typical "hybrid" time
  zones (a single tzinfo subclass modeling both standard and daylight
  time), this case can arise one hour per year, at the hour daylight time
  ends.  See new docs for details.  In short, the new behavior mimics
  the local wall clock's behavior of repeating an hour in local time.

  dt.astimezone() can no longer be used to convert between naive and aware
  datetime objects.  If you merely want to attach, or remove, a tzinfo
  object, without any conversion of date and time members, use
  dt.replace(tzinfo=whatever) instead, where "whatever" is None or a
  tzinfo subclass instance.

  A new method tzinfo.fromutc(dt) can be overridden in tzinfo subclasses
  to give complete control over how a UTC time is to be converted to
  a local time.  The default astimezone() implementation calls fromutc()
  as its last step, so a tzinfo subclass can affect that too by overriding
  fromutc().  It's expected that the default fromutc() implementation will
  be suitable as-is for "almost all" time zone subclasses, but the
  creativity of political time zone fiddling appears unbounded -- fromutc()
  allows the highly motivated to emulate any scheme expressible in Python.

  datetime.now():  The optional tzinfo argument was undocumented (that's
  repaired), and its name was changed to tz ("tzinfo" is overloaded enough
  already).  With a tz argument, now(tz) used to return the local date
  and time, and attach tz to it, without any conversion of date and time
  members.  This was less than useful.  Now now(tz) returns the current
  date and time as local time in tz's time zone, akin to ::

      tz.fromutc(datetime.utcnow().replace(tzinfo=utc))

  where "utc" is an instance of a tzinfo subclass modeling UTC.  Without
  a tz argument, now() continues to return the current local date and time,
  as a naive datetime object.

  datetime.fromtimestamp():  Like datetime.now() above, this had less than
  useful behavior when the optional tinzo argument was specified.  See
  also SF bug report <http://www.python.org/sf/660872>.

  date and datetime comparison:  In order to prevent comparison from
  falling back to the default compare-object-addresses strategy, these
  raised TypeError whenever they didn't understand the other object type.
  They still do, except when the other object has a "timetuple" attribute,
  in which case they return NotImplemented now.  This gives other
  datetime objects (e.g., mxDateTime) a chance to intercept the
  comparison.

  date, time, datetime and timedelta comparison:  When the exception
  for mixed-type comparisons in the last paragraph doesn't apply, if
  the comparison is == then False is returned, and if the comparison is
  != then True is returned.  Because dict lookup and the "in" operator
  only invoke __eq__, this allows, for example, ::

      if some_datetime in some_sequence:

  and ::

      some_dict[some_timedelta] = whatever

  to work as expected, without raising TypeError just because the
  sequence is heterogeneous, or the dict has mixed-type keys.  [This
  seems like a good idea to implement for all mixed-type comparisons
  that don't want to allow falling back to address comparison.]

  The constructors building a datetime from a timestamp could raise
  ValueError if the platform C localtime()/gmtime() inserted "leap
  seconds".  Leap seconds are ignored now.  On such platforms, it's
  possible to have timestamps that differ by a second, yet where
  datetimes constructed from them are equal.

  The pickle format of date, time and datetime objects has changed
  completely.  The undocumented pickler and unpickler functions no
  longer exist.  The undocumented __setstate__() and __getstate__()
  methods no longer exist either.

Library
-------

- The logging module was updated slightly; the WARN level was renamed
  to WARNING, and the matching function/method warn() to warning().

- The pickle and cPickle modules were updated with a new pickling
  protocol (documented by pickletools.py, see below) and several
  extensions to the pickle customization API (__reduce__, __setstate__
  etc.).  The copy module now uses more of the pickle customization
  API to copy objects that don't implement __copy__ or __deepcopy__.
  See PEP 307 for details.

- The distutils "register" command now uses http://www.python.org/pypi
  as the default repository.  (See PEP 301.)

- the platform dependent path related variables sep, altsep,
  pathsep, curdir, pardir and defpath are now defined in the platform
  dependent path modules (e.g. ntpath.py) rather than os.py, so these
  variables are now available via os.path.  They continue to be
  available from the os module.
  (see <http://www.python.org/sf/680789>).

- array.array was added to the types repr.py knows about (see
  <http://www.python.org/sf/680789>).

- The new pickletools.py contains lots of documentation about pickle
  internals, and supplies some helpers for working with pickles, such as
  a symbolic pickle disassembler.

- xmlrpclib.py now supports the built-in boolean type.

- py_compile has a new 'doraise' flag and a new PyCompileError
  exception.

- SimpleXMLRPCServer now supports CGI through the CGIXMLRPCRequestHandler
  class.

- The sets module now raises TypeError in __cmp__, to clarify that
  sets are not intended to be three-way-compared; the comparison
  operators are overloaded as subset/superset tests.

- Bastion.py and rexec.py are disabled.  These modules are not safe in
  Python 2.2. or 2.3.

- realpath is now exported when doing ``from poxixpath import *``.
  It is also exported for ntpath, macpath, and os2emxpath.
  See SF bug #659228.

- New module tarfile from Lars Gustäbel provides a comprehensive interface
  to tar archive files with transparent gzip and bzip2 compression.
  See SF patch #651082.

- urlparse can now parse imap:// URLs.  See SF feature request #618024.

- Tkinter.Canvas.scan_dragto() provides an optional parameter to support
  the gain value which is passed to Tk.  SF bug# 602259.

- Fix logging.handlers.SysLogHandler protocol when using UNIX domain sockets.
  See SF patch #642974.

- The dospath module was deleted.  Use the ntpath module when manipulating
  DOS paths from other platforms.

Tools/Demos
-----------

- Two new scripts (db2pickle.py and pickle2db.py) were added to the
  Tools/scripts directory to facilitate conversion from the old bsddb module
  to the new one.  While the user-visible API of the new module is
  compatible with the old one, it's likely that the version of the
  underlying database library has changed.  To convert from the old library,
  run the db2pickle.py script using the old version of Python to convert it
  to a pickle file.  After upgrading Python, run the pickle2db.py script
  using the new version of Python to reconstitute your database.  For
  example:

    % python2.2 db2pickle.py -h some.db > some.pickle
    % python2.3 pickle2db.py -h some.db.new < some.pickle

  Run the scripts without any args to get a usage message.


Build
-----

- The audio driver tests (test_ossaudiodev.py and
  test_linuxaudiodev.py) are no longer run by default.  This is
  because they don't always work, depending on your hardware and
  software.  To run these tests, you must use an invocation like ::

    ./python Lib/test/regrtest.py -u audio test_ossaudiodev

- On systems which build using the configure script, compiler flags which
  used to be lumped together using the OPT flag have been split into two
  groups, OPT and BASECFLAGS.  OPT is meant to carry just optimization- and
  debug-related flags like "-g" and "-O3".  BASECFLAGS is meant to carry
  compiler flags that are required to get a clean compile.  On some
  platforms (many Linux flavors in particular) BASECFLAGS will be empty by
  default.  On others, such as Mac OS X and SCO, it will contain required
  flags.  This change allows people building Python to override OPT without
  fear of clobbering compiler flags which are required to get a clean build.

- On Darwin/Mac OS X platforms, /sw/lib and /sw/include are added to the
  relevant search lists in setup.py.  This allows users building Python to
  take advantage of the many packages available from the fink project
  <http://fink.sf.net/>.

- A new Makefile target, scriptsinstall, installs a number of useful scripts
  from the Tools/scripts directory.

C API
-----

- PyEval_GetFrame() is now declared to return a ``PyFrameObject *``
  instead of a plain ``PyObject *``.  (SF patch #686601.)

- PyNumber_Check() now checks that the object has a nb_int or nb_float
  slot, rather than simply checking whether it has a non-NULL
  tp_as_number pointer.

- A C type that inherits from a base type that defines tp_as_buffer
  will now inherit the tp_as_buffer pointer if it doesn't define one.
  (SF #681367)

- The PyArg_Parse functions now issue a DeprecationWarning if a float
  argument is provided when an integer is specified (this affects the 'b',
  'B', 'h', 'H', 'i', and 'l' codes).  Future versions of Python will
  raise a TypeError.

Tests
-----

- Several tests weren't being run from regrtest.py (test_timeout.py,
  test_tarfile.py, test_netrc.py, test_multifile.py,
  test_importhooks.py and test_imp.py).  Now they are.  (Note to
  developers: please read Lib/test/README when creating a new test, to
  make sure to do it right!  All tests need to use either unittest or
  pydoc.)

- Added test_posix.py, a test suite for the posix module.

- Added test_hexoct.py, a test suite for hex/oct constant folding.

Windows
-------

- The timeout code for socket connect() didn't work right; this has
  now been fixed.  test_timeout.py should pass (at least most of the
  time).

- distutils' msvccompiler class now passes the preprocessor options to
  the resource compiler.  See SF patch #669198.

- The bsddb module now ships with Sleepycat's 4.1.25.NC, the latest
  release without strong cryptography.

- sys.path[0], if it contains a directory name, is now always an
  absolute pathname. (SF patch #664376.)

- The new logging package is now installed by the Windows installer.  It
  wasn't in 2.3a1 due to oversight.

Mac
---

- There are new dialogs EasyDialogs.AskFileForOpen, AskFileForSave
  and AskFolder. The old macfs.StandardGetFile and friends are deprecated.

- Most of the standard library now uses pathnames or FSRefs in preference
  of FSSpecs, and use the underlying Carbon.File and Carbon.Folder modules
  in stead of macfs. macfs will probably be deprecated in the future.

- Type Carbon.File.FSCatalogInfo and supporting methods have been implemented.
  This also makes macfs.FSSpec.SetDates() work again.

- There is a new module pimp, the package install manager for Python, and
  accompanying applet PackageManager. These allow you to easily download
  and install pretested extension packages either in source or binary
  form. Only in MacPython-OSX.

- Applets are now built with bundlebuilder in MacPython-OSX, which should make
  them more robust and also provides a path towards BuildApplication. The
  downside of this change is that applets can no longer be run from the
  Terminal window, this will hopefully be fixed in the 2.3b1.


What's New in Python 2.3 alpha 1?
=================================

*Release date: 31-Dec-2002*

Type/class unification and new-style classes
--------------------------------------------

- One can now assign to __bases__ and __name__ of new-style classes.

- dict() now accepts keyword arguments so that dict(one=1, two=2)
  is the equivalent of {"one": 1, "two": 2}.  Accordingly,
  the existing (but undocumented) 'items' keyword argument has
  been eliminated.  This means that dict(items=someMapping) now has
  a different meaning than before.

- int() now returns a long object if the argument is outside the
  integer range, so int("4" * 1000), int(1e200) and int(1L<<1000) will
  all return long objects instead of raising an OverflowError.

- Assignment to __class__ is disallowed if either the old or the new
  class is a statically allocated type object (such as defined by an
  extension module).  This prevents anomalies like 2.__class__ = bool.

- New-style object creation and deallocation have been sped up
  significantly; they are now faster than classic instance creation
  and deallocation.

- The __slots__ variable can now mention "private" names, and the
  right thing will happen (e.g. __slots__ = ["__foo"]).

- The built-ins slice() and buffer() are now callable types.  The
  types classobj (formerly class), code, function, instance, and
  instancemethod (formerly instance-method), which have no built-in
  names but are accessible through the types module, are now also
  callable.  The type dict-proxy is renamed to dictproxy.

- Cycles going through the __class__ link of a new-style instance are
  now detected by the garbage collector.

- Classes using __slots__ are now properly garbage collected.
  [SF bug 519621]

- Tightened the __slots__ rules: a slot name must be a valid Python
  identifier.

- The constructor for the module type now requires a name argument and
  takes an optional docstring argument.  Previously, this constructor
  ignored its arguments.  As a consequence, deriving a class from a
  module (not from the module type) is now illegal; previously this
  created an unnamed module, just like invoking the module type did.
  [SF bug 563060]

- A new type object, 'basestring', is added.  This is a common base type
  for 'str' and 'unicode', and can be used instead of
  types.StringTypes, e.g. to test whether something is "a string":
  isinstance(x, basestring) is True for Unicode and 8-bit strings.  This
  is an abstract base class and cannot be instantiated directly.

- Changed new-style class instantiation so that when C's __new__
  method returns something that's not a C instance, its __init__ is
  not called.  [SF bug #537450]

- Fixed super() to work correctly with class methods.  [SF bug #535444]

- If you try to pickle an instance of a class that has __slots__ but
  doesn't define or override __getstate__, a TypeError is now raised.
  This is done by adding a bozo __getstate__ to the class that always
  raises TypeError.  (Before, this would appear to be pickled, but the
  state of the slots would be lost.)

Core and builtins
-----------------

- Import from zipfiles is now supported.  The name of a zipfile placed
  on sys.path causes the import statement to look for importable Python
  modules (with .py, pyc and .pyo extensions) and packages inside the
  zipfile.  The zipfile import follows the specification (though not
  the sample implementation) of PEP 273.  The semantics of __path__ are
  compatible with those that have been implemented in Jython since
  Jython 2.1.

- PEP 302 has been accepted.  Although it was initially developed to
  support zipimport, it offers a new, general import hook mechanism.
  Several new variables have been added to the sys module:
  sys.meta_path, sys.path_hooks, and sys.path_importer_cache; these
  make extending the import statement much more convenient than
  overriding the __import__ built-in function.  For a description of
  these, see PEP 302.

- A frame object's f_lineno attribute can now be written to from a
  trace function to change which line will execute next.  A command to
  exploit this from pdb has been added.  [SF patch #643835]

- The _codecs support module for codecs.py was turned into a built-in
  module to assure that at least the built-in codecs are available
  to the Python parser for source code decoding according to PEP 263.

- issubclass now supports a tuple as the second argument, just like
  isinstance does. ``issubclass(X, (A, B))`` is equivalent to
  ``issubclass(X, A) or issubclass(X, B)``.

- Thanks to Armin Rigo, the last known way to provoke a system crash
  by cleverly arranging for a comparison function to mutate a list
  during a list.sort() operation has been fixed.  The effect of
  attempting to mutate a list, or even to inspect its contents or
  length, while a sort is in progress, is not defined by the language.
  The C implementation of Python 2.3 attempts to detect mutations,
  and raise ValueError if one occurs, but there's no guarantee that
  all mutations will be caught, or that any will be caught across
  releases or implementations.

- Unicode file name processing for Windows (PEP 277) is implemented.
  All platforms now have an os.path.supports_unicode_filenames attribute,
  which is set to True on Windows NT/2000/XP, and False elsewhere.

- Codec error handling callbacks (PEP 293) are implemented.
  Error handling in unicode.encode or str.decode can now be customized.

- A subtle change to the semantics of the built-in function intern():
  interned strings are no longer immortal.  You must keep a reference
  to the return value intern() around to get the benefit.

- Use of 'None' as a variable, argument or attribute name now
  issues a SyntaxWarning.  In the future, None may become a keyword.

- SET_LINENO is gone.  co_lnotab is now consulted to determine when to
  call the trace function.  C code that accessed f_lineno should call
  PyCode_Addr2Line instead (f_lineno is still there, but only kept up
  to date when there is a trace function set).

- There's a new warning category, FutureWarning.  This is used to warn
  about a number of situations where the value or sign of an integer
  result will change in Python 2.4 as a result of PEP 237 (integer
  unification).  The warnings implement stage B0 mentioned in that
  PEP.  The warnings are about the following situations:

    - Octal and hex literals without 'L' prefix in the inclusive range
      [0x80000000..0xffffffff]; these are currently negative ints, but
      in Python 2.4 they will be positive longs with the same bit
      pattern.

    - Left shifts on integer values that cause the outcome to lose
      bits or have a different sign than the left operand.  To be
      precise: x<<n where this currently doesn't yield the same value
      as long(x)<<n; in Python 2.4, the outcome will be long(x)<<n.

    - Conversions from ints to string that show negative values as
      unsigned ints in the inclusive range [0x80000000..0xffffffff];
      this affects the functions hex() and oct(), and the string
      formatting codes %u, %o, %x, and %X.  In Python 2.4, these will
      show signed values (e.g. hex(-1) currently returns "0xffffffff";
      in Python 2.4 it will return "-0x1").

- The bits manipulated under the cover by sys.setcheckinterval() have
  been changed.  Both the check interval and the ticker used to be
  per-thread values.  They are now just a pair of global variables.
  In addition, the default check interval was boosted from 10 to 100
  bytecode instructions.  This may have some effect on systems that
  relied on the old default value.  In particular, in multi-threaded
  applications which try to be highly responsive, response time will
  increase by some (perhaps imperceptible) amount.

- When multiplying very large integers, a version of the so-called
  Karatsuba algorithm is now used.  This is most effective if the
  inputs have roughly the same size.  If they both have about N digits,
  Karatsuba multiplication has O(N**1.58) runtime (the exponent is
  log_base_2(3)) instead of the previous O(N**2).  Measured results may
  be better or worse than that, depending on platform quirks.  Besides
  the O() improvement in raw instruction count, the Karatsuba algorithm
  appears to have much better cache behavior on extremely large integers
  (starting in the ballpark of a million bits).  Note that this is a
  simple implementation, and there's no intent here to compete with,
  e.g., GMP.  It gives a very nice speedup when it applies, but a package
  devoted to fast large-integer arithmetic should run circles around it.

- u'%c' will now raise a ValueError in case the argument is an
  integer outside the valid range of Unicode code point ordinals.

- The tempfile module has been overhauled for enhanced security.  The
  mktemp() function is now deprecated; new, safe replacements are
  mkstemp() (for files) and mkdtemp() (for directories), and the
  higher-level functions NamedTemporaryFile() and TemporaryFile().
  Use of some global variables in this module is also deprecated; the
  new functions have keyword arguments to provide the same
  functionality.  All Lib, Tools and Demo modules that used the unsafe
  interfaces have been updated to use the safe replacements.  Thanks
  to Zack Weinberg!

- When x is an object whose class implements __mul__ and __rmul__,
  1.0*x would correctly invoke __rmul__, but 1*x would erroneously
  invoke __mul__.  This was due to the sequence-repeat code in the int
  type.  This has been fixed now.

- Previously, "str1 in str2" required str1 to be a string of length 1.
  This restriction has been relaxed to allow str1 to be a string of
  any length.  Thus "'el' in 'hello world'" returns True now.

- File objects are now their own iterators.  For a file f, iter(f) now
  returns f (unless f is closed), and f.next() is similar to
  f.readline() when EOF is not reached; however, f.next() uses a
  readahead buffer that messes up the file position, so mixing
  f.next() and f.readline() (or other methods) doesn't work right.
  Calling f.seek() drops the readahead buffer, but other operations
  don't.  It so happens that this gives a nice additional speed boost
  to "for line in file:"; the xreadlines method and corresponding
  module are now obsolete.  Thanks to Oren Tirosh!

- Encoding declarations (PEP 263, phase 1) have been implemented.  A
  comment of the form "# -*- coding: <encodingname> -*-" in the first
  or second line of a Python source file indicates the encoding.

- list.sort() has a new implementation.  While cross-platform results
  may vary, and in data-dependent ways, this is much faster on many
  kinds of partially ordered lists than the previous implementation,
  and reported to be just as fast on randomly ordered lists on
  several major platforms.  This sort is also stable (if A==B and A
  precedes B in the list at the start, A precedes B after the sort too),
  although the language definition does not guarantee stability.  A
  potential drawback is that list.sort() may require temp space of
  len(list)*2 bytes (``*4`` on a 64-bit machine).  It's therefore possible
  for list.sort() to raise MemoryError now, even if a comparison function
  does not.  See <http://www.python.org/sf/587076> for full details.

- All standard iterators now ensure that, once StopIteration has been
  raised, all future calls to next() on the same iterator will also
  raise StopIteration.  There used to be various counterexamples to
  this behavior, which could caused confusion or subtle program
  breakage, without any benefits.  (Note that this is still an
  iterator's responsibility; the iterator framework does not enforce
  this.)

- Ctrl+C handling on Windows has been made more consistent with
  other platforms.  KeyboardInterrupt can now reliably be caught,
  and Ctrl+C at an interactive prompt no longer terminates the
  process under NT/2k/XP (it never did under Win9x).  Ctrl+C will
  interrupt time.sleep() in the main thread, and any child processes
  created via the popen family (on win2k; we can't make win9x work
  reliably) are also interrupted (as generally happens on for Linux/Unix.)
  [SF bugs 231273, 439992 and 581232]

- sys.getwindowsversion() has been added on Windows.  This
  returns a tuple with information about the version of Windows
  currently running.

- Slices and repetitions of buffer objects now consistently return
  a string.  Formerly, strings would be returned most of the time,
  but a buffer object would be returned when the repetition count
  was one or when the slice range was all inclusive.

- Unicode objects in sys.path are no longer ignored but treated
  as directory names.

- Fixed string.startswith and string.endswith built-in methods
  so they accept negative indices.  [SF bug 493951]

- Fixed a bug with a continue inside a try block and a yield in the
  finally clause.  [SF bug 567538]

- Most built-in sequences now support "extended slices", i.e. slices
  with a third "stride" parameter.  For example, "hello world"[::-1]
  gives "dlrow olleh".

- A new warning PendingDeprecationWarning was added to provide
  direction on features which are in the process of being deprecated.
  The warning will not be printed by default.  To see the pending
  deprecations, use -Walways::PendingDeprecationWarning::
  as a command line option or warnings.filterwarnings() in code.

- Deprecated features of xrange objects have been removed as
  promised.  The start, stop, and step attributes and the tolist()
  method no longer exist.  xrange repetition and slicing have been
  removed.

- New built-in function enumerate(x), from PEP 279.  Example:
  enumerate("abc") is an iterator returning (0,"a"), (1,"b"), (2,"c").
  The argument can be an arbitrary iterable object.

- The assert statement no longer tests __debug__ at runtime.  This means
  that assert statements cannot be disabled by assigning a false value
  to __debug__.

- A method zfill() was added to str and unicode, that fills a numeric
  string to the left with zeros.  For example,
  "+123".zfill(6) -> "+00123".

- Complex numbers supported divmod() and the // and % operators, but
  these make no sense.  Since this was documented, they're being
  deprecated now.

- String and unicode methods lstrip(), rstrip() and strip() now take
  an optional argument that specifies the characters to strip.  For
  example, "Foo!!!?!?!?".rstrip("?!") -> "Foo".

- There's a new dictionary constructor (a class method of the dict
  class), dict.fromkeys(iterable, value=None).  It constructs a
  dictionary with keys taken from the iterable and all values set to a
  single value.  It can be used for building sets and for removing
  duplicates from sequences.

- Added a new dict method pop(key).  This removes and returns the
  value corresponding to key.  [SF patch #539949]

- A new built-in type, bool, has been added, as well as built-in
  names for its two values, True and False.  Comparisons and sundry
  other operations that return a truth value have been changed to
  return a bool instead.  Read PEP 285 for an explanation of why this
  is backward compatible.

- Fixed two bugs reported as SF #535905: under certain conditions,
  deallocating a deeply nested structure could cause a segfault in the
  garbage collector, due to interaction with the "trashcan" code;
  access to the current frame during destruction of a local variable
  could access a pointer to freed memory.

- The optional object allocator ("pymalloc") has been enabled by
  default.  The recommended practice for memory allocation and
  deallocation has been streamlined.  A header file is included,
  Misc/pymemcompat.h, which can be bundled with 3rd party extensions
  and lets them use the same API with Python versions from 1.5.2
  onwards.

- PyErr_Display will provide file and line information for all exceptions
  that have an attribute print_file_and_line, not just SyntaxErrors.

- The UTF-8 codec will now encode and decode Unicode surrogates
  correctly and without raising exceptions for unpaired ones.

- Universal newlines (PEP 278) is implemented.  Briefly, using 'U'
  instead of 'r' when opening a text file for reading changes the line
  ending convention so that any of '\r', '\r\n', and '\n' is
  recognized (even mixed in one file); all three are converted to
  '\n', the standard Python line end character.

- file.xreadlines() now raises a ValueError if the file is closed:
  Previously, an xreadlines object was returned which would raise
  a ValueError when the xreadlines.next() method was called.

- sys.exit() inadvertently allowed more than one argument.
  An exception will now be raised if more than one argument is used.

- Changed evaluation order of dictionary literals to conform to the
  general left to right evaluation order rule. Now {f1(): f2()} will
  evaluate f1 first.

- Fixed bug #521782: when a file was in non-blocking mode, file.read()
  could silently lose data or wrongly throw an unknown error.

- The sq_repeat, sq_inplace_repeat, sq_concat and sq_inplace_concat
  slots are now always tried after trying the corresponding nb_* slots.
  This fixes a number of minor bugs (see bug #624807).

- Fix problem with dynamic loading on 64-bit AIX (see bug #639945).

Extension modules
-----------------

- Added three operators to the operator module:
    operator.pow(a,b) which is equivalent to:  a**b.
    operator.is_(a,b) which is equivalent to:  a is b.
    operator.is_not(a,b) which is equivalent to:  a is not b.

- posix.openpty now works on all systems that have /dev/ptmx.

- A module zipimport exists to support importing code from zip
  archives.

- The new datetime module supplies classes for manipulating dates and
  times.  The basic design came from the Zope "fishbowl process", and
  favors practical commercial applications over calendar esoterica.  See

      http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage

- _tkinter now returns Tcl objects, instead of strings. Objects which
  have Python equivalents are converted to Python objects, other objects
  are wrapped. This can be configured through the wantobjects method,
  or Tkinter.wantobjects.

- The PyBSDDB wrapper around the Sleepycat Berkeley DB library has
  been added as the package bsddb.  The traditional bsddb module is
  still available in source code, but not built automatically anymore,
  and is now named bsddb185.  This supports Berkeley DB versions from
  3.0 to 4.1.  For help converting your databases from the old module (which
  probably used an obsolete version of Berkeley DB) to the new module, see
  the db2pickle.py and pickle2db.py scripts described in the Tools/Demos
  section above.

- unicodedata was updated to Unicode 3.2. It supports normalization
  and names for Hangul syllables and CJK unified ideographs.

- resource.getrlimit() now returns longs instead of ints.

- readline now dynamically adjusts its input/output stream if
  sys.stdin/stdout changes.

- The _tkinter module (and hence Tkinter) has dropped support for
  Tcl/Tk 8.0 and 8.1.  Only Tcl/Tk versions 8.2, 8.3 and 8.4 are
  supported.

- cPickle.BadPickleGet is now a class.

- The time stamps in os.stat_result are floating point numbers
  after stat_float_times has been called.

- If the size passed to mmap.mmap() is larger than the length of the
  file on non-Windows platforms, a ValueError is raised. [SF bug 585792]

- The xreadlines module is slated for obsolescence.

- The strptime function in the time module is now always available (a
  Python implementation is used when the C library doesn't define it).

- The 'new' module is no longer an extension, but a Python module that
  only exists for backwards compatibility.  Its contents are no longer
  functions but callable type objects.

- The bsddb.*open functions can now take 'None' as a filename.
  This will create a temporary in-memory bsddb that won't be
  written to disk.

- posix.getloadavg, posix.lchown, posix.killpg, posix.mknod, and
  posix.getpgid have been added where available.

- The locale module now exposes the C library's gettext interface. It
  also has a new function getpreferredencoding.

- A security hole ("double free") was found in zlib-1.1.3, a popular
  third party compression library used by some Python modules.  The
  hole was quickly plugged in zlib-1.1.4, and the Windows build of
  Python now ships with zlib-1.1.4.

- pwd, grp, and resource return enhanced tuples now, with symbolic
  field names.

- array.array is now a type object. A new format character
  'u' indicates Py_UNICODE arrays. For those, .tounicode and
  .fromunicode methods are available. Arrays now support __iadd__
  and __imul__.

- dl now builds on every system that has dlfcn.h.  Failure in case
  of sizeof(int)!=sizeof(long)!=sizeof(void*) is delayed until dl.open
  is called.

- The sys module acquired a new attribute, api_version, which evaluates
  to the value of the PYTHON_API_VERSION macro with which the
  interpreter was compiled.

- Fixed bug #470582: sre module would return a tuple (None, 'a', 'ab')
  when applying the regular expression '^((a)c)?(ab)$' on 'ab'. It now
  returns (None, None, 'ab'), as expected. Also fixed handling of
  lastindex/lastgroup match attributes in similar cases. For example,
  when running the expression r'(a)(b)?b' over 'ab', lastindex must be
  1, not 2.

- Fixed bug #581080: sre scanner was not checking the buffer limit
  before increasing the current pointer. This was creating an infinite
  loop in the search function, once the pointer exceeded the buffer
  limit.

- The os.fdopen function now enforces a file mode starting with the
  letter 'r', 'w' or 'a', otherwise a ValueError is raised. This fixes
  bug #623464.

- The linuxaudiodev module is now deprecated; it is being replaced by
  ossaudiodev.  The interface has been extended to cover a lot more of
  OSS (see www.opensound.com), including most DSP ioctls and the
  OSS mixer API.  Documentation forthcoming in 2.3a2.

Library
-------

- imaplib.py now supports SSL (Tino Lange and Piers Lauder).

- Freeze's modulefinder.py has been moved to the standard library;
  slightly improved so it will issue less false missing submodule
  reports (see sf path #643711 for details).  Documentation will follow
  with Python 2.3a2.

- os.path exposes getctime.

- unittest.py now has two additional methods called assertAlmostEqual()
  and failIfAlmostEqual().  They implement an approximate comparison
  by rounding the difference between the two arguments and comparing
  the result to zero.  Approximate comparison is essential for
  unit tests of floating point results.

- calendar.py now depends on the new datetime module rather than
  the time module.  As a result, the range of allowable dates
  has been increased.

- pdb has a new 'j(ump)' command to select the next line to be
  executed.

- The distutils created windows installers now can run a
  postinstallation script.

- doctest.testmod can now be called without argument, which means to
  test the current module.

- When canceling a server that implemented threading with a keyboard
  interrupt, the server would shut down but not terminate (waiting on
  client threads). A new member variable, daemon_threads, was added to
  the ThreadingMixIn class in SocketServer.py to make it explicit that
  this behavior needs to be controlled.

- A new module, optparse, provides a fancy alternative to getopt for
  command line parsing.  It is a slightly modified version of Greg
  Ward's Optik package.

- UserDict.py now defines a 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 shelve module).

- shelve.py now subclasses from UserDict.DictMixin.  Now shelve supports
  all dictionary methods.  This eases the transition to persistent
  storage for scripts originally written with dictionaries in mind.

- shelve.open and the various classes in shelve.py now accept an optional
  binary flag, which defaults to False.  If True, the values stored in the
  shelf are binary pickles.

- A new package, logging, implements the logging API defined by PEP
  282.  The code is written by Vinay Sajip.

- StreamReader, StreamReaderWriter and StreamRecoder in the codecs
  modules are iterators now.

- gzip.py now handles files exceeding 2GB.  Files over 4GB also work
  now (provided the OS supports it, and Python is configured with large
  file support), but in that case the underlying gzip file format can
  record only the least-significant 32 bits of the file size, so that
  some tools working with gzipped files may report an incorrect file
  size.

- xml.sax.saxutils.unescape has been added, to replace entity references
  with their entity value.

- Queue.Queue.{put,get} now support an optional timeout argument.

- Various features of Tk 8.4 are exposed in Tkinter.py. The multiple
  option of tkFileDialog is exposed as function askopenfile{,name}s.

- Various configure methods of Tkinter have been stream-lined, so that
  tag_configure, image_configure, window_configure now return a
  dictionary when invoked with no argument.

- Importing the readline module now no longer has the side effect of
  calling setlocale(LC_CTYPE, "").  The initial "C" locale, or
  whatever locale is explicitly set by the user, is preserved.  If you
  want repr() of 8-bit strings in your preferred encoding to preserve
  all printable characters of that encoding, you have to add the
  following code to your $PYTHONSTARTUP file or to your application's
  main():

    import locale
    locale.setlocale(locale.LC_CTYPE, "")

- shutil.move was added. shutil.copytree now reports errors as an
  exception at the end, instead of printing error messages.

- Encoding name normalization was generalized to not only
  replace hyphens with underscores, but also all other non-alphanumeric
  characters (with the exception of the dot which is used for Python
  package names during lookup). The aliases.py mapping was updated
  to the new standard.

- mimetypes has two new functions: guess_all_extensions() which
  returns a list of all known extensions for a mime type, and
  add_type() which adds one mapping between a mime type and
  an extension to the database.

- New module: sets, defines the class Set that implements a mutable
  set type using the keys of a dict to represent the set.  There's
  also a class ImmutableSet which is useful when you need sets of sets
  or when you need to use sets as dict keys, and a class BaseSet which
  is the base class of the two.

- Added random.sample(population,k) for random sampling without replacement.
  Returns a k length list of unique elements chosen from the population.

- random.randrange(-sys.maxint-1, sys.maxint) no longer raises
  OverflowError.  That is, it now accepts any combination of 'start'
  and 'stop' arguments so long as each is in the range of Python's
  bounded integers.

- Thanks to Raymond Hettinger, random.random() now uses a new core
  generator.  The Mersenne Twister algorithm is implemented in C,
  threadsafe, faster than the previous generator, has an astronomically
  large period (2**19937-1), creates random floats to full 53-bit
  precision, and may be the most widely tested random number generator
  in existence.

  The random.jumpahead(n) method has different semantics for the new
  generator.  Instead of jumping n steps ahead, it uses n and the
  existing state to create a new state.  This means that jumpahead()
  continues to support multi-threaded code needing generators of
  non-overlapping sequences.  However, it will break code which relies
  on jumpahead moving a specific number of steps forward.

  The attributes random.whseed and random.__whseed have no meaning for
  the new generator.  Code using these attributes should switch to a
  new class, random.WichmannHill which is provided for backward
  compatibility and to make an alternate generator available.

- New "algorithms" module: heapq, implements a heap queue.  Thanks to
  Kevin O'Connor for the code and François Pinard for an entertaining
  write-up explaining the theory and practical uses of heaps.

- New encoding for the Palm OS character set: palmos.

- binascii.crc32() and the zipfile module had problems on some 64-bit
  platforms.  These have been fixed.  On a platform with 8-byte C longs,
  crc32() now returns a signed-extended 4-byte result, so that its value
  as a Python int is equal to the value computed a 32-bit platform.

- xml.dom.minidom.toxml and toprettyxml now take an optional encoding
  argument.

- Some fixes in the copy module: when an object is copied through its
  __reduce__ method, there was no check for a __setstate__ method on
  the result [SF patch 565085]; deepcopy should treat instances of
  custom metaclasses the same way it treats instances of type 'type'
  [SF patch 560794].

- Sockets now support timeout mode.  After s.settimeout(T), where T is
  a float expressing seconds, subsequent operations raise an exception
  if they cannot be completed within T seconds.  To disable timeout
  mode, use s.settimeout(None).  There's also a module function,
  socket.setdefaulttimeout(T), which sets the default for all sockets
  created henceforth.

- getopt.gnu_getopt was added.  This supports GNU-style option
  processing, where options can be mixed with non-option arguments.

- Stop using strings for exceptions.  String objects used for
  exceptions are now classes deriving from Exception.  The objects
  changed were: Tkinter.TclError, bdb.BdbQuit, macpath.norm_error,
  tabnanny.NannyNag, and xdrlib.Error.

- Constants BOM_UTF8, BOM_UTF16, BOM_UTF16_LE, BOM_UTF16_BE,
  BOM_UTF32, BOM_UTF32_LE and BOM_UTF32_BE that represent the Byte
  Order Mark in UTF-8, UTF-16 and UTF-32 encodings for little and
  big endian systems were added to the codecs module. The old names
  BOM32_* and BOM64_* were off by a factor of 2.

- Added conversion functions math.degrees() and math.radians().

- math.log() now takes an optional argument:  math.log(x[, base]).

- ftplib.retrlines() now tests for callback is None rather than testing
  for False.  Was causing an error when given a callback object which
  was callable but also returned len() as zero.  The change may
  create new breakage if the caller relied on the undocumented behavior
  and called with callback set to [] or some other False value not
  identical to None.

- random.gauss() uses a piece of hidden state used by nothing else,
  and the .seed() and .whseed() methods failed to reset it.  In other
  words, setting the seed didn't completely determine the sequence of
  results produced by random.gauss().  It does now.  Programs repeatedly
  mixing calls to a seed method with calls to gauss() may see different
  results now.

- The pickle.Pickler class grew a clear_memo() method to mimic that
  provided by cPickle.Pickler.

- difflib's SequenceMatcher class now does a dynamic analysis of
  which elements are so frequent as to constitute noise.  For
  comparing files as sequences of lines, this generally works better
  than the IS_LINE_JUNK function, and function ndiff's linejunk
  argument defaults to None now as a result.  A happy benefit is
  that SequenceMatcher may run much faster now when applied
  to large files with many duplicate lines (for example, C program
  text with lots of repeated "}" and "return NULL;" lines).

- New Text.dump() method in Tkinter module.

- New distutils commands for building packagers were added to
  support pkgtool on Solaris and swinstall on HP-UX.

- distutils now has a new abstract binary packager base class
  command/bdist_packager, which simplifies writing packagers.
  This will hopefully provide the missing bits to encourage
  people to submit more packagers, e.g. for Debian, FreeBSD
  and other systems.

- The UTF-16, -LE and -BE stream readers now raise a
  NotImplementedError for all calls to .readline(). Previously, they
  used to just produce garbage or fail with an encoding error --
  UTF-16 is a 2-byte encoding and the C lib's line reading APIs don't
  work well with these.

- compileall now supports quiet operation.

- The BaseHTTPServer now implements optional HTTP/1.1 persistent
  connections.

- socket module: the SSL support was broken out of the main
  _socket module C helper and placed into a new _ssl helper
  which now gets imported by socket.py if available and working.

- encodings package: added aliases for all supported IANA character
  sets

- ftplib: to safeguard the user's privacy, anonymous login will use
  "anonymous@" as default password, rather than the real user and host
  name.

- webbrowser: tightened up the command passed to os.system() so that
  arbitrary shell code can't be executed because a bogus URL was
  passed in.

- gettext.translation has an optional fallback argument, and
  gettext.find an optional all argument. Translations will now fallback
  on a per-message basis. The module supports plural forms, by means
  of gettext.[d]ngettext and Translation.[u]ngettext.

- distutils bdist commands now offer a --skip-build option.

- warnings.warn now accepts a Warning instance as first argument.

- The xml.sax.expatreader.ExpatParser class will no longer create
  circular references by using itself as the locator that gets passed
  to the content handler implementation.  [SF bug #535474]

- The email.Parser.Parser class now properly parses strings regardless
  of their line endings, which can be any of \r, \n, or \r\n (CR, LF,
  or CRLF).  Also, the Header class's constructor default arguments
  has changed slightly so that an explicit maxlinelen value is always
  honored, and so unicode conversion error handling can be specified.

- distutils' build_ext command now links C++ extensions with the C++
  compiler available in the Makefile or CXX environment variable, if
  running under \*nix.

- New module bz2: provides a comprehensive interface for the bz2 compression
  library.  It implements a complete file interface, one-shot (de)compression
  functions, and types for sequential (de)compression.

- New pdb command 'pp' which is like 'p' except that it pretty-prints
  the value of its expression argument.

- Now bdist_rpm distutils command understands a verify_script option in
  the config file, including the contents of the referred filename in
  the "%verifyscript" section of the rpm spec file.

- Fixed bug #495695: webbrowser module would run graphic browsers in a
  unix environment even if DISPLAY was not set. Also, support for
  skipstone browser was included.

- Fixed bug #636769: rexec would run unallowed code if subclasses of
  strings were used as parameters for certain functions.

Tools/Demos
-----------

- pygettext.py now supports globbing on Windows, and accepts module
  names in addition to accepting file names.

- The SGI demos (Demo/sgi) have been removed.  Nobody thought they
  were interesting any more.  (The SGI library modules and extensions
  are still there; it is believed that at least some of these are
  still used and useful.)

- IDLE supports the new encoding declarations (PEP 263); it can also
  deal with legacy 8-bit files if they use the locale's encoding. It
  allows non-ASCII strings in the interactive shell and executes them
  in the locale's encoding.

- freeze.py now produces binaries which can import shared modules,
  unlike before when this failed due to missing symbol exports in
  the generated binary.

Build
-----

- On Unix, IDLE is now installed automatically.

- The fpectl module is not built by default; it's dangerous or useless
  except in the hands of experts.

- The public Python C API will generally be declared using PyAPI_FUNC
  and PyAPI_DATA macros, while Python extension module init functions
  will be declared with PyMODINIT_FUNC.  DL_EXPORT/DL_IMPORT macros
  are deprecated.

- A bug was fixed that could cause COUNT_ALLOCS builds to segfault, or
  get into infinite loops, when a new-style class got garbage-collected.
  Unfortunately, to avoid this, the way COUNT_ALLOCS works requires
  that new-style classes be immortal in COUNT_ALLOCS builds.  Note that
  COUNT_ALLOCS is not enabled by default, in either release or debug
  builds, and that new-style classes are immortal only in COUNT_ALLOCS
  builds.

- Compiling out the cyclic garbage collector is no longer an option.
  The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges
  that it's always defined (for the benefit of any extension modules
  that may be conditionalizing on it).  A bonus is that any extension
  type participating in cyclic gc can choose to participate in the
  Py_TRASHCAN mechanism now too; in the absence of cyclic gc, this used
  to require editing the core to teach the trashcan mechanism about the
  new type.

- According to Annex F of the current C standard,

    The Standard C macro HUGE_VAL and its float and long double analogs,
    HUGE_VALF and HUGE_VALL, expand to expressions whose values are
    positive infinities.

  Python only uses the double HUGE_VAL, and only to #define its own symbol
  Py_HUGE_VAL.  Some platforms have incorrect definitions for HUGE_VAL.
  pyport.h used to try to worm around that, but the workarounds triggered
  other bugs on other platforms, so we gave up.  If your platform defines
  HUGE_VAL incorrectly, you'll need to #define Py_HUGE_VAL to something
  that works on your platform.  The only instance of this I'm sure about
  is on an unknown subset of Cray systems, described here:

  http://www.cray.com/swpubs/manuals/SN-2194_2.0/html-SN-2194_2.0/x3138.htm

  Presumably 2.3a1 breaks such systems.  If anyone uses such a system, help!

- The configure option --without-doc-strings can be used to remove the
  doc strings from the built-in functions and modules; this reduces the
  size of the executable.

- The universal newlines option (PEP 278) is on by default.  On Unix
  it can be disabled by passing --without-universal-newlines to the
  configure script.  On other platforms, remove
  WITH_UNIVERSAL_NEWLINES from pyconfig.h.

- On Unix, a shared libpython2.3.so can be created with --enable-shared.

- All uses of the CACHE_HASH, INTERN_STRINGS, and DONT_SHARE_SHORT_STRINGS
  preprocessor symbols were eliminated.  The internal decisions they
  controlled stopped being experimental long ago.

- The tools used to build the documentation now work under Cygwin as
  well as Unix.

- The bsddb and dbm module builds have been changed to try and avoid version
  skew problems and disable linkage with Berkeley DB 1.85 unless the
  installer knows what s/he's doing.  See the section on building these
  modules in the README file for details.

C API
-----

- PyNumber_Check() now returns true for string and unicode objects.
  This is a result of these types having a partially defined
  tp_as_number slot.  (This is not a feature, but an indication that
  PyNumber_Check() is not very useful to determine numeric behavior.
  It may be deprecated.)

- The string object's layout has changed: the pointer member
  ob_sinterned has been replaced by an int member ob_sstate.  On some
  platforms (e.g. most 64-bit systems) this may change the offset of
  the ob_sval member, so as a precaution the API_VERSION has been
  incremented.  The apparently unused feature of "indirect interned
  strings", supported by the ob_sinterned member, is gone.  Interned
  strings are now usually mortal; there is a new API,
  PyString_InternImmortal() that creates immortal interned strings.
  (The ob_sstate member can only take three values; however, while
  making it a char saves a few bytes per string object on average, in
  it also slowed things down a bit because ob_sval was no longer
  aligned.)

- The Py_InitModule*() functions now accept NULL for the 'methods'
  argument.  Modules without global functions are becoming more common
  now that factories can be types rather than functions.

- New C API PyUnicode_FromOrdinal() which exposes unichr() at C
  level.

- New functions PyErr_SetExcFromWindowsErr() and
  PyErr_SetExcFromWindowsErrWithFilename(). Similar to
  PyErr_SetFromWindowsErrWithFilename() and
  PyErr_SetFromWindowsErr(), but they allow to specify
  the exception type to raise. Available on Windows.

- Py_FatalError() is now declared as taking a const char* argument.  It
  was previously declared without const.  This should not affect working
  code.

- Added new macro PySequence_ITEM(o, i) that directly calls
  sq_item without rechecking that o is a sequence and without
  adjusting for negative indices.

- PyRange_New() now raises ValueError if the fourth argument is not 1.
  This is part of the removal of deprecated features of the xrange
  object.

- PyNumber_Coerce() and PyNumber_CoerceEx() now also invoke the type's
  coercion if both arguments have the same type but this type has the
  CHECKTYPES flag set.  This is to better support proxies.

- The type of tp_free has been changed from "``void (*)(PyObject *)``" to
  "``void (*)(void *)``".

- PyObject_Del, PyObject_GC_Del are now functions instead of macros.

- A type can now inherit its metatype from its base type.  Previously,
  when PyType_Ready() was called, if ob_type was found to be NULL, it
  was always set to &PyType_Type; now it is set to base->ob_type,
  where base is tp_base, defaulting to &PyObject_Type.

- PyType_Ready() accidentally did not inherit tp_is_gc; now it does.

- The PyCore_* family of APIs have been removed.

- The "u#" parser marker will now pass through Unicode objects as-is
  without going through the buffer API.

- The enumerators of cmp_op have been renamed to use the prefix ``PyCmp_``.

- An old #define of ANY as void has been removed from pyport.h.  This
  hasn't been used since Python's pre-ANSI days, and the #define has
  been marked as obsolete since then.  SF bug 495548 says it created
  conflicts with other packages, so keeping it around wasn't harmless.

- Because Python's magic number scheme broke on January 1st, we decided
  to stop Python development.  Thanks for all the fish!

- Some of us don't like fish, so we changed Python's magic number
  scheme to a new one. See Python/import.c for details.

New platforms
-------------

- OpenVMS is now supported.

- AtheOS is now supported.

- the EMX runtime environment on OS/2 is now supported.

- GNU/Hurd is now supported.

Tests
-----

- The regrtest.py script's -u option now provides a way to say "allow
  all resources except this one."  For example, to allow everything
  except bsddb, give the option '-uall,-bsddb'.

Windows
-------

- The Windows distribution now ships with version 4.0.14 of the
  Sleepycat Berkeley database library.  This should be a huge
  improvement over the previous Berkeley DB 1.85, which had many
  bugs.
  XXX What are the licensing issues here?
  XXX If a user has a database created with a previous version of
  XXX     Python, what must they do to convert it?
  XXX I'm still not sure how to link this thing (see PCbuild/readme.txt).
  XXX The version # is likely to change before 2.3a1.

- The Windows distribution now ships with a Secure Sockets Library (SLL)
   module (_ssl.pyd)

- The Windows distribution now ships with Tcl/Tk version 8.4.1 (it
  previously shipped with Tcl/Tk 8.3.2).

- When Python is built under a Microsoft compiler, sys.version now
  includes the compiler version number (_MSC_VER).  For example, under
  MSVC 6, sys.version contains the substring "MSC v.1200 ".  1200 is
  the value of _MSC_VER under MSVC 6.

- Sometimes the uninstall executable (UNWISE.EXE) vanishes.  One cause
  of that has been fixed in the installer (disabled Wise's "delete in-
  use files" uninstall option).

- Fixed a bug in urllib's proxy handling in Windows.  [SF bug #503031]

- The installer now installs Start menu shortcuts under (the local
  equivalent of) "All Users" when doing an Admin install.

- file.truncate([newsize]) now works on Windows for all newsize values.
  It used to fail if newsize didn't fit in 32 bits, reflecting a
  limitation of MS _chsize (which is no longer used).

- os.waitpid() is now implemented for Windows, and can be used to block
  until a specified process exits.  This is similar to, but not exactly
  the same as, os.waitpid() on POSIX systems.  If you're waiting for
  a specific process whose pid was obtained from one of the spawn()
  functions, the same Python os.waitpid() code works across platforms.
  See the docs for details.  The docs were changed to clarify that
  spawn functions return, and waitpid requires, a process handle on
  Windows (not the same thing as a Windows process id).

- New tempfile.TemporaryFile implementation for Windows:  this doesn't
  need a TemporaryFileWrapper wrapper anymore, and should be immune
  to a nasty problem:  before 2.3, if you got a temp file on Windows, it
  got wrapped in an object whose close() method first closed the
  underlying file, then deleted the file.  This usually worked fine.
  However, the spawn family of functions on Windows create (at a low C
  level) the same set of open files in the spawned process Q as were
  open in the spawning process P.  If a temp file f was among them, then
  doing f.close() in P first closed P's C-level file handle on f, but Q's
  C-level file handle on f remained open, so the attempt in P to delete f
  blew up with a "Permission denied" error (Windows doesn't allow
  deleting open files).  This was surprising, subtle, and difficult to
  work around.

- The os module now exports all the symbolic constants usable with the
  low-level os.open() on Windows:  the new constants in 2.3 are
  O_NOINHERIT, O_SHORT_LIVED, O_TEMPORARY, O_RANDOM and O_SEQUENTIAL.
  The others were also available in 2.2:  O_APPEND, O_BINARY, O_CREAT,
  O_EXCL, O_RDONLY, O_RDWR, O_TEXT, O_TRUNC and O_WRONLY.  Contrary
  to Microsoft docs, O_SHORT_LIVED does not seem to imply O_TEMPORARY
  (so specify both if you want both; note that neither is useful unless
  specified with O_CREAT too).

Mac
----

- Mac/Relnotes is gone, the release notes are now here.

- Python (the OSX-only, unix-based version, not the OS9-compatible CFM
  version) now fully supports unicode strings as arguments to various file
  system calls, eg. open(), file(), os.stat() and os.listdir().

- The current naming convention for Python on the Macintosh is that MacPython
  refers to the unix-based OSX-only version, and MacPython-OS9 refers to the
  CFM-based version that runs on both OS9 and OSX.

- All MacPython-OS9 functionality is now available in an OSX unix build,
  including the Carbon modules, the IDE, OSA support, etc. A lot of this
  will only work correctly in a framework build, though, because you cannot
  talk to the window manager unless your application is run from a .app
  bundle. There is a command line tool "pythonw" that runs your script
  with an interpreter living in such a .app bundle, this interpreter should
  be used to run any Python script using the window manager (including
  Tkinter or wxPython scripts).

- Most of Mac/Lib has moved to Lib/plat-mac, which is again used both in
  MacPython-OSX and MacPython-OS9. The only modules remaining in Mac/Lib
  are specifically for MacPython-OS9 (CFM support, preference resources, etc).

- A new utility PythonLauncher will start a Python interpreter when a .py or
  .pyw script is double-clicked in the Finder. By default .py scripts are
  run with a normal Python interpreter in a Terminal window and .pyw
  files are run with a window-aware pythonw interpreter without a Terminal
  window, but all this can be customized.

- MacPython-OS9 is now Carbon-only, so it runs on Mac OS 9 or Mac OS X and
  possibly on Mac OS 8.6 with the right CarbonLib installed, but not on earlier
  releases.

- Many tools such as BuildApplet.py and gensuitemodule.py now support a command
  line interface too.

- All the Carbon classes are now PEP253 compliant, meaning that you can
  subclass them from Python. Most of the attributes have gone, you should
  now use the accessor function call API, which is also what Apple's
  documentation uses. Some attributes such as grafport.visRgn are still
  available for convenience.

- New Carbon modules File (implementing the APIs in Files.h and Aliases.h)
  and Folder (APIs from Folders.h). The old macfs built-in module is
  gone, and replaced by a Python wrapper around the new modules.

- Pathname handling should now be fully consistent: MacPython-OSX always uses
  unix pathnames and MacPython-OS9 always uses colon-separated Mac pathnames
  (also when running on Mac OS X).

- New Carbon modules Help and AH give access to the Carbon Help Manager.
  There are hooks in the IDE to allow accessing the Python documentation
  (and Apple's Carbon and Cocoa documentation) through the Help Viewer.
  See Mac/OSX/README for converting the Python documentation to a
  Help Viewer compatible form and installing it.

- OSA support has been redesigned and the generated Python classes now
  mirror the inheritance defined by the underlying OSA classes.

- MacPython no longer maps both \r and \n to \n on input for any text file.
  This feature has been replaced by universal newline support (PEP278).

- The default encoding for Python sourcefiles in MacPython-OS9 is no longer
  mac-roman (or whatever your local Mac encoding was) but "ascii", like on
  other platforms. If you really need sourcefiles with Mac characters in them
  you can change this in site.py.


What's New in Python 2.2 final?
===============================

*Release date: 21-Dec-2001*

Type/class unification and new-style classes
--------------------------------------------

- pickle.py, cPickle: allow pickling instances of new-style classes
  with a custom metaclass.

Core and builtins
-----------------

- weakref proxy object: when comparing, unwrap both arguments if both
  are proxies.

Extension modules
-----------------

- binascii.b2a_base64(): fix a potential buffer overrun when encoding
  very short strings.

- cPickle: the obscure "fast" mode was suspected of causing stack
  overflows on the Mac.  Hopefully fixed this by setting the recursion
  limit much smaller.  If the limit is too low (it only affects
  performance), you can change it by defining PY_CPICKLE_FAST_LIMIT
  when compiling cPickle.c (or in pyconfig.h).

Library
-------

- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at
  close or delete time).

- rfc822.py: fixed a bug where the address '<>' was converted to None
  instead of an empty string (also fixes the email.Utils module).

- xmlrpclib.py: version 1.0.0; uses precision for doubles.

- test suite: the pickle and cPickle tests were not executing any code
  when run from the standard regression test.

Tools/Demos
-----------

Build
-----

C API
-----

New platforms
-------------

Tests
-----

Windows
-------

- distutils package: fixed broken Windows installers (bdist_wininst).

- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper
  instances are deleted at process exit time.

- socket.py: prevent mysterious warnings when socket instances are
  deleted at process exit time.

- posixmodule.c: fix a Windows crash with stat() of a filename ending
  in backslash.

Mac
----

- The Carbon toolbox modules have been upgraded to Universal Headers
  3.4, and experimental CoreGraphics and CarbonEvents modules have
  been added.  All only for framework-enabled MacOSX.


What's New in Python 2.2c1?
===========================

*Release date: 14-Dec-2001*

Type/class unification and new-style classes
--------------------------------------------

- Guido's tutorial introduction to the new type/class features has
  been extensively updated.  See

      http://www.python.org/2.2/descrintro.html

  That remains the primary documentation in this area.

- Fixed a leak: instance variables declared with __slots__ were never
  deleted!

- The "delete attribute" method of descriptor objects is called
  __delete__, not __del__.  In previous releases, it was mistakenly
  called __del__, which created an unfortunate overloading condition
  with finalizers.  (The "get attribute" and "set attribute" methods
  are still called __get__ and __set__, respectively.)

- Some subtle issues with the super built-in were fixed:

  (a) When super itself is subclassed, its __get__ method would still
      return an instance of the base class (i.e., of super).

  (b) super(C, C()).__class__ would return C rather than super.  This
      is confusing.  To fix this, I decided to change the semantics of
      super so that it only applies to code attributes, not to data
      attributes.  After all, overriding data attributes is not
      supported anyway.

  (c) The __get__ method didn't check whether the argument was an
      instance of the type used in creation of the super instance.

- Previously, hash() of an instance of a subclass of a mutable type
  (list or dictionary) would return some value, rather than raising
  TypeError.  This has been fixed.  Also, directly calling
  dict.__hash__ and list.__hash__ now raises the same TypeError
  (previously, these were the same as object.__hash__).

- New-style objects now support deleting their __dict__.  This is for
  all intents and purposes equivalent to assigning a brand new empty
  dictionary, but saves space if the object is not used further.

Core and builtins
-----------------

- -Qnew now works as documented in PEP 238:  when -Qnew is passed on
  the command line, all occurrences of "/" use true division instead
  of classic division.  See the PEP for details.  Note that "all"
  means all instances in library and 3rd-party modules, as well as in
  your own code.  As the PEP says, -Qnew is intended for use only in
  educational environments with control over the libraries in use.
  Note that test_coercion.py in the standard Python test suite fails
  under -Qnew; this is expected, and won't be repaired until true
  division becomes the default (in the meantime, test_coercion is
  testing the current rules).

- complex() now only allows the first argument to be a string
  argument, and raises TypeError if either the second arg is a string
  or if the second arg is specified when the first is a string.

Extension modules
-----------------

- gc.get_referents was renamed to gc.get_referrers.

Library
-------

- Functions in the os.spawn() family now release the global interpreter
  lock around calling the platform spawn.  They should always have done
  this, but did not before 2.2c1.  Multithreaded programs calling
  an os.spawn function with P_WAIT will no longer block all Python threads
  until the spawned program completes.  It's possible that some programs
  relies on blocking, although more likely by accident than by design.

- webbrowser defaults to netscape.exe on OS/2 now.

- Tix.ResizeHandle exposes detach_widget, hide, and show.

- The charset alias windows_1252 has been added.

- types.StringTypes is a tuple containing the defined string types;
  usually this will be (str, unicode), but if Python was compiled
  without Unicode support it will be just (str,).

- The pulldom and minidom modules were synchronized to PyXML.

Tools/Demos
-----------

- A new script called Tools/scripts/google.py was added, which fires
  off a search on Google.

Build
-----

- Note that release builds of Python should arrange to define the
  preprocessor symbol NDEBUG on the command line (or equivalent).
  In the 2.2 pre-release series we tried to define this by magic in
  Python.h instead, but it proved to cause problems for extension
  authors.  The Unix, Windows and Mac builds now all define NDEBUG in
  release builds via cmdline (or equivalent) instead.  Ports to
  other platforms should do likewise.

- It is no longer necessary to use --with-suffix when building on a
  case-insensitive file system (such as Mac OS X HFS+). In the build
  directory an extension is used, but not in the installed python.

C API
-----

- New function PyDict_MergeFromSeq2() exposes the built-in dict
  constructor's logic for updating a dictionary from an iterable object
  producing key-value pairs.

- PyArg_ParseTupleAndKeywords() requires that the number of entries in
  the keyword list equal the number of argument specifiers.  This
  wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even
  dump core in some bad cases.  This has been repaired.  As a result,
  PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that
  previously went unchallenged.

New platforms
-------------

Tests
-----

Windows
-------

Mac
----

- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin",
  without any trailing digits.

- Changed logic for finding python home in Mac OS X framework Pythons.
  Now sys.executable points to the executable again, in stead of to
  the shared library. The latter is used only for locating the python
  home.


What's New in Python 2.2b2?
===========================

*Release date: 16-Nov-2001*

Type/class unification and new-style classes
--------------------------------------------

- Multiple inheritance mixing new-style and classic classes in the
  list of base classes is now allowed, so this works now:

      class Classic: pass
      class Mixed(Classic, object): pass

  The MRO (method resolution order) for each base class is respected
  according to its kind, but the MRO for the derived class is computed
  using new-style MRO rules if any base class is a new-style class.
  This needs to be documented.

- The new built-in dictionary() constructor, and dictionary type, have
  been renamed to dict.  This reflects a decade of common usage.

- dict() now accepts an iterable object producing 2-sequences.  For
  example, dict(d.items()) == d for any dictionary d.  The argument,
  and the elements of the argument, can be any iterable objects.

- New-style classes can now have a __del__ method, which is called
  when the instance is deleted (just like for classic classes).

- Assignment to object.__dict__ is now possible, for objects that are
  instances of new-style classes that have a __dict__ (unless the base
  class forbids it).

- Methods of built-in types now properly check for keyword arguments
  (formerly these were silently ignored).  The only built-in methods
  that take keyword arguments are __call__, __init__ and __new__.

- The socket function has been converted to a type; see below.

Core and builtins
-----------------

- Assignment to __debug__ raises SyntaxError at compile-time.  This
  was promised when 2.1c1 was released as "What's New in Python 2.1c1"
  (see below) says.

- Clarified the error messages for unsupported operands to an operator
  (like 1 + '').

Extension modules
-----------------

- mmap has a new keyword argument, "access", allowing a uniform way for
  both Windows and Unix users to create read-only, write-through and
  copy-on-write memory mappings.  This was previously possible only on
  Unix.  A new keyword argument was required to support this in a
  uniform way because the mmap() signatures had diverged across
  platforms.  Thanks to Jay T Miller for repairing this!

- By default, the gc.garbage list now contains only those instances in
  unreachable cycles that have __del__ methods; in 2.1 it contained all
  instances in unreachable cycles.  "Instances" here has been generalized
  to include instances of both new-style and old-style classes.

- The socket module defines a new method for socket objects,
  sendall().  This is like send() but may make multiple calls to
  send() until all data has been sent.  Also, the socket function has
  been converted to a subclassable type, like list and tuple (etc.)
  before it; socket and SocketType are now the same thing.

- Various bugfixes to the curses module.  There is now a test suite
  for the curses module (you have to run it manually).

- binascii.b2a_base64 no longer places an arbitrary restriction of 57
  bytes on its input.

Library
-------

- tkFileDialog exposes a Directory class and askdirectory
  convenience function.

- Symbolic group names in regular expressions must be unique.  For
  example, the regexp r'(?P<abc>)(?P<abc>)' is not allowed, because a
  single name can't mean both "group 1" and "group 2" simultaneously.
  Python 2.2 detects this error at regexp compilation time;
  previously, the error went undetected, and results were
  unpredictable.  Also in sre, the pattern.split(), pattern.sub(), and
  pattern.subn() methods have been rewritten in C.  Also, an
  experimental function/method finditer() has been added, which works
  like findall() but returns an iterator.

- Tix exposes more commands through the classes DirSelectBox,
  DirSelectDialog, ListNoteBook, Meter, CheckList, and the
  methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog,
  tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions.

- Traceback objects are now scanned by cyclic garbage collection, so
  cycles created by casual use of sys.exc_info() no longer cause
  permanent memory leaks (provided garbage collection is enabled).

- mimetypes.py has optional support for non-standard, but commonly
  found types.  guess_type() and guess_extension() now accept an
  optional 'strict' flag, defaulting to true, which controls whether
  recognize non-standard types or not.  A few non-standard types we
  know about have been added.  Also, when run as a script, there are
  new -l and -e options.

- statcache is now deprecated.

- email.Utils.formatdate() now produces the preferred RFC 2822 style
  dates with numeric timezones (it used to produce obsolete dates
  hard coded to "GMT" timezone).  An optional 'localtime' flag is
  added to produce dates in the local timezone, with daylight savings
  time properly taken into account.

- In pickle and cPickle, instead of masking errors in load() by
  transforming them into SystemError, we let the original exception
  propagate out.  Also, implement support for __safe_for_unpickling__
  in pickle, as it already was supported in cPickle.

Tools/Demos
-----------

Build
-----

- The dbm module is built using libdb1 if available.  The bsddb module
  is built with libdb3 if available.

- Misc/Makefile.pre.in has been removed by BDFL pronouncement.

C API
-----

- New function PySequence_Fast_GET_SIZE() returns the size of a non-
  NULL result from PySequence_Fast(), more quickly than calling
  PySequence_Size().

- New argument unpacking function PyArg_UnpackTuple() added.

- New functions PyObject_CallFunctionObjArgs() and
  PyObject_CallMethodObjArgs() have been added to make it more
  convenient and efficient to call functions and methods from C.

- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's
  possible that this will propagate errors it didn't before.

- New function PyObject_CheckReadBuffer(), which returns true if its
  argument supports the single-segment readable buffer interface.

New platforms
-------------

- We've finally confirmed that this release builds on HP-UX 11.00,
  *with* threads, and passes the test suite.

- Thanks to a series of patches from Michael Muller, Python may build
  again under OS/2 Visual Age C++.

- Updated RISCOS port by Dietmar Schwertberger.

Tests
-----

- Added a test script for the curses module.  It isn't run automatically;
  regrtest.py must be run with '-u curses' to enable it.

Windows
-------

Mac
----

- PythonScript has been moved to unsupported and is slated to be
  removed completely in the next release.

- It should now be possible to build applets that work on both OS9 and
  OSX.

- The core is now linked with CoreServices not Carbon; as a side
  result, default 8bit encoding on OSX is now ASCII.

- Python should now build on OSX 10.1.1


What's New in Python 2.2b1?
===========================

*Release date: 19-Oct-2001*

Type/class unification and new-style classes
--------------------------------------------

- New-style classes are now always dynamic (except for built-in and
  extension types).  There is no longer a performance penalty, and I
  no longer see another reason to keep this baggage around.  One relic
  remains: the __dict__ of a new-style class is a read-only proxy; you
  must set the class's attribute to modify it.  As a consequence, the
  __defined__ attribute of new-style types no longer exists, for lack
  of need: there is once again only one __dict__ (although in the
  future a __cache__ may be resurrected with a similar function, if I
  can prove that it actually speeds things up).

- C.__doc__ now works as expected for new-style classes (in 2.2a4 it
  always returned None, even when there was a class docstring).

- doctest now finds and runs docstrings attached to new-style classes,
  class methods, static methods, and properties.

Core and builtins
-----------------

- A very subtle syntactical pitfall in list comprehensions was fixed.
  For example: [a+b for a in 'abc', for b in 'def'].  The comma in
  this example is a mistake.  Previously, this would silently let 'a'
  iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce',
  'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be',
  'bf', 'cd', 'ce', 'cf'].  Now, this is flagged as a syntax error.
  Note that [a for a in <singleton>] is a convoluted way to say
  [<singleton>] anyway, so it's not like any expressiveness is lost.

- getattr(obj, name, default) now only catches AttributeError, as
  documented, rather than returning the default value for all
  exceptions (which could mask bugs in a __getattr__ hook, for
  example).

- Weak reference objects are now part of the core and offer a C API.
  A bug which could allow a core dump when binary operations involved
  proxy reference has been fixed.  weakref.ReferenceError is now a
  built-in exception.

- unicode(obj) now behaves more like str(obj), accepting arbitrary
  objects, and calling a __unicode__ method if it exists.
  unicode(obj, encoding) and unicode(obj, encoding, errors) still
  require an 8-bit string or character buffer argument.

- isinstance() now allows any object as the first argument and a
  class, a type or something with a __bases__ tuple attribute for the
  second argument.  The second argument may also be a tuple of a
  class, type, or something with __bases__, in which case isinstance()
  will return true if the first argument is an instance of any of the
  things contained in the second argument tuple.  E.g.

  isinstance(x, (A, B))

  returns true if x is an instance of A or B.

Extension modules
-----------------

- thread.start_new_thread() now returns the thread ID (previously None).

- binascii has now two quopri support functions, a2b_qp and b2a_qp.

- readline now supports setting the startup_hook and the
  pre_event_hook, and adds the add_history() function.

- os and posix supports chroot(), setgroups() and unsetenv() where
  available.  The stat(), fstat(), statvfs() and fstatvfs() functions
  now return "pseudo-sequences" -- the various fields can now be
  accessed as attributes (e.g. os.stat("/").st_mtime) but for
  backwards compatibility they also behave as a fixed-length sequence.
  Some platform-specific fields (e.g. st_rdev) are only accessible as
  attributes.

- time: localtime(), gmtime() and strptime() now return a
  pseudo-sequence similar to the os.stat() return value, with
  attributes like tm_year etc.

- Decompression objects in the zlib module now accept an optional
  second parameter to decompress() that specifies the maximum amount
  of memory to use for the uncompressed data.

- optional SSL support in the socket module now exports OpenSSL
  functions RAND_add(), RAND_egd(), and RAND_status().  These calls
  are useful on platforms like Solaris where OpenSSL does not
  automatically seed its PRNG.  Also, the keyfile and certfile
  arguments to socket.ssl() are now optional.

- posixmodule (and by extension, the os module on POSIX platforms) now
  exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW.

Library
-------

- doctest now excludes functions and classes not defined by the module
  being tested, thanks to Tim Hochberg.

- HotShot, a new profiler implemented using a C-based callback, has
  been added.  This substantially reduces the overhead of profiling,
  but it is still quite preliminary.  Support modules and
  documentation will be added in upcoming releases (before 2.2 final).

- profile now produces correct output in situations where an exception
  raised in Python is cleared by C code (e.g. hasattr()).  This used
  to cause wrong output, including spurious claims of recursive
  functions and attribution of time spent to the wrong function.

  The code and documentation for the derived OldProfile and HotProfile
  profiling classes was removed.  The code hasn't worked for years (if
  you tried to use them, they raised exceptions).  OldProfile
  intended to reproduce the behavior of the profiler Python used more
  than 7 years ago, and isn't interesting anymore.  HotProfile intended
  to provide a faster profiler (but producing less information), and
  that's a worthy goal we intend to meet via a different approach (but
  without losing information).

- Profile.calibrate() has a new implementation that should deliver
  a much better system-specific calibration constant.  The constant can
  now be specified in an instance constructor, or as a Profile class or
  instance variable, instead of by editing profile.py's source code.
  Calibration must still be done manually (see the docs for the profile
  module).

  Note that Profile.calibrate() must be overridden by subclasses.
  Improving the accuracy required exploiting detailed knowledge of
  profiler internals; the earlier method abstracted away the details
  and measured a simplified model instead, but consequently computed
  a constant too small by a factor of 2 on some modern machines.

- quopri's encode and decode methods take an optional header parameter,
  which indicates whether output is intended for the header 'Q'
  encoding.

- The SocketServer.ThreadingMixIn class now closes the request after
  finish_request() returns.  (Not when it errors out though.)

- The nntplib module's NNTP.body() method has grown a 'file' argument
  to allow saving the message body to a file.

- The email package has added a class email.Parser.HeaderParser which
  only parses headers and does not recurse into the message's body.
  Also, the module/class MIMEAudio has been added for representing
  audio data (contributed by Anthony Baxter).

- ftplib should be able to handle files > 2GB.

- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO,
  ON, and OFF.

- xml.dom.minidom NodeList objects now support the length attribute
  and item() method as required by the DOM specifications.

Tools/Demos
-----------

- Demo/dns was removed.  It no longer serves any purpose; a package
  derived from it is now maintained by Anthony Baxter, see
  http://PyDNS.SourceForge.net.

- The freeze tool has been made more robust, and two new options have
  been added: -X and -E.

Build
-----

- configure will use CXX in LINKCC if CXX is used to build main() and
  the system requires to link a C++ main using the C++ compiler.

C API
-----

- The documentation for the tp_compare slot is updated to require that
  the return value must be -1, 0, 1; an arbitrary number <0 or >0 is
  not correct.  This is not yet enforced but will be enforced in
  Python 2.3; even later, we may use -2 to indicate errors and +2 for
  "NotImplemented".  Right now, -1 should be used for an error return.

- PyLong_AsLongLong() now accepts int (as well as long) arguments.
  Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well
  as long) arguments.

- PyThread_start_new_thread() now returns a long int giving the thread
  ID, if one can be calculated; it returns -1 for error, 0 if no
  thread ID is calculated (this is an incompatible change, but only
  the thread module used this API).  This code has only really been
  tested on Linux and Windows; other platforms please beware (and
  report any bugs or strange behavior).

- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as
  input.

New platforms
-------------

Tests
-----

Windows
-------

- Installer:  If you install IDLE, and don't disable file-extension
  registration, a new "Edit with IDLE" context (right-click) menu entry
  is created for .py and .pyw files.

- The signal module now supports SIGBREAK on Windows, thanks to Steven
  Scott.  Note that SIGBREAK is unique to Windows.  The default SIGBREAK
  action remains to call Win32 ExitProcess().  This can be changed via
  signal.signal().  For example::

      # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C
      # (SIGINT) behavior.
      import signal
      signal.signal(signal.SIGBREAK, signal.default_int_handler)

      try:
          while 1:
              pass
      except KeyboardInterrupt:
          # We get here on Ctrl+C or Ctrl+Break now; if we had not changed
          # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the
          # program without the possibility for any Python-level cleanup).
          print "Clean exit"


What's New in Python 2.2a4?
===========================

*Release date: 28-Sep-2001*

Type/class unification and new-style classes
--------------------------------------------

- pydoc and inspect are now aware of new-style classes;
  e.g. help(list) at the interactive prompt now shows proper
  documentation for all operations on list objects.

- Applications using Jim Fulton's ExtensionClass module can now safely
  be used with Python 2.2.  In particular, Zope 2.4.1 now works with
  Python 2.2 (as well as with Python 2.1.1).  The Demo/metaclass
  examples also work again.  It is hoped that Gtk and Boost also work
  with 2.2a4 and beyond.  (If you can confirm this, please write
  webmaster@python.org; if there are still problems, please open a bug
  report on SourceForge.)

- property() now takes 4 keyword arguments:  fget, fset, fdel and doc.
  These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__'
  in the constructed property object.  fget, fset and fdel weren't
  discoverable from Python in 2.2a3.  __doc__ is new, and allows to
  associate a docstring with a property.

- Comparison overloading is now more completely implemented.  For
  example, a str subclass instance can properly be compared to a str
  instance, and it can properly overload comparison.  Ditto for most
  other built-in object types.

- The repr() of new-style classes has changed; instead of <type
  'M.Foo'> a new-style class is now rendered as <class 'M.Foo'>,
  *except* for built-in types, which are still rendered as <type
  'Foo'> (to avoid upsetting existing code that might parse or
  otherwise rely on repr() of certain type objects).

- The repr() of new-style objects is now always <Foo object at XXX>;
  previously, it was sometimes <Foo instance at XXX>.

- For new-style classes, what was previously called __getattr__ is now
  called __getattribute__.  This method, if defined, is called for
  *every* attribute access.  A new __getattr__ hook more similar to the
  one in classic classes is defined which is called only if regular
  attribute access raises AttributeError; to catch *all* attribute
  access, you can use __getattribute__ (for new-style classes).  If
  both are defined, __getattribute__ is called first, and if it raises
  AttributeError, __getattr__ is called.

- The __class__ attribute of new-style objects can be assigned to.
  The new class must have the same C-level object layout as the old
  class.

- The built-in file type can be subclassed now.  In the usual pattern,
  "file" is the name of the built-in type, and file() is a new built-in
  constructor, with the same signature as the built-in open() function.
  file() is now the preferred way to open a file.

- Previously, __new__ would only see sequential arguments passed to
  the type in a constructor call; __init__ would see both sequential
  and keyword arguments.  This made no sense whatsoever any more, so
  now both __new__ and __init__ see all arguments.

- Previously, hash() applied to an instance of a subclass of str or
  unicode always returned 0.  This has been repaired.

- Previously, an operation on an instance of a subclass of an
  immutable type (int, long, float, complex, tuple, str, unicode),
  where the subtype didn't override the operation (and so the
  operation was handled by the built-in type), could return that
  instance instead a value of the base type.  For example, if s was of
  a str subclass type, s[:] returned s as-is.  Now it returns a str
  with the same value as s.

- Provisional support for pickling new-style objects has been added.

Core
----

- file.writelines() now accepts any iterable object producing strings.

- PyUnicode_FromEncodedObject() now works very much like
  PyObject_Str(obj) in that it tries to use __str__/tp_str
  on the object if the object is not a string or buffer. This
  makes unicode() behave like str() when applied to non-string/buffer
  objects.

- PyFile_WriteObject now passes Unicode objects to the file's write
  method. As a result, all file-like objects which may be the target
  of a print statement must support Unicode objects, i.e. they must
  at least convert them into ASCII strings.

- Thread scheduling on Solaris should be improved; it is no longer
  necessary to insert a small sleep at the start of a thread in order
  to let other runnable threads be scheduled.

Library
-------

- StringIO.StringIO instances and cStringIO.StringIO instances support
  read character buffer compatible objects for their .write() methods.
  These objects are converted to strings and then handled as such
  by the instances.

- The "email" package has been added.  This is basically a port of the
  mimelib package <http://sf.net/projects/mimelib> with API changes
  and some implementations updated to use iterators and generators.

- difflib.ndiff() and difflib.Differ.compare() are generators now.  This
  restores the ability of Tools/scripts/ndiff.py to start producing output
  before the entire comparison is complete.

- StringIO.StringIO instances and cStringIO.StringIO instances support
  iteration just like file objects (i.e. their .readline() method is
  called for each iteration until it returns an empty string).

- The codecs module has grown four new helper APIs to access
  built-in codecs: getencoder(), getdecoder(), getreader(),
  getwriter().

- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer)
  simplifies writing XML RPC servers.

- os.path.realpath(): a new function that returns the absolute pathname
  after interpretation of symbolic links.  On non-Unix systems, this
  is an alias for os.path.abspath().

- operator.indexOf() (PySequence_Index() in the C API) now works with any
  iterable object.

- smtplib now supports various authentication and security features of
  the SMTP protocol through the new login() and starttls() methods.

- hmac: a new module implementing keyed hashing for message
  authentication.

- mimetypes now recognizes more extensions and file types.  At the
  same time, some mappings not sanctioned by IANA were removed.

- The "compiler" package has been brought up to date to the state of
  Python 2.2 bytecode generation.  It has also been promoted from a
  Tool to a standard library package.  (Tools/compiler still exists as
  a sample driver.)

Build
-----

- Large file support (LFS) is now automatic when the platform supports
  it; no more manual configuration tweaks are needed.  On Linux, at
  least, it's possible to have a system whose C library supports large
  files but whose kernel doesn't; in this case, large file support is
  still enabled but doesn't do you any good unless you upgrade your
  kernel or share your Python executable with another system whose
  kernel has large file support.

- The configure script now supplies plausible defaults in a
  cross-compilation environment.  This doesn't mean that the supplied
  values are always correct, or that cross-compilation now works
  flawlessly -- but it's a first step (and it shuts up most of
  autoconf's warnings about AC_TRY_RUN).

- The Unix build is now a bit less chatty, courtesy of the parser
  generator.  The build is completely silent (except for errors) when
  using "make -s", thanks to a -q option to setup.py.

C API
-----

- The "structmember" API now supports some new flag bits to deny read
  and/or write access to attributes in restricted execution mode.

New platforms
-------------

- Compaq's iPAQ handheld, running the "familiar" Linux distribution
  (http://familiar.handhelds.org).

Tests
-----

- The "classic" standard tests, which work by comparing stdout to
  an expected-output file under Lib/test/output/, no longer stop at
  the first mismatch.  Instead the test is run to completion, and a
  variant of ndiff-style comparison is used to report all differences.
  This is much easier to understand than the previous style of reporting.

- The unittest-based standard tests now use regrtest's test_main()
  convention, instead of running as a side-effect of merely being
  imported.  This allows these tests to be run in more natural and
  flexible ways as unittests, outside the regrtest framework.

- regrtest.py is much better integrated with unittest and doctest now,
  especially in regard to reporting errors.

Windows
-------

- Large file support now also works for files > 4GB, on filesystems
  that support it (NTFS under Windows 2000).  See "What's New in
  Python 2.2a3" for more detail.


What's New in Python 2.2a3?
===========================

*Release Date: 07-Sep-2001*

Core
----

- Conversion of long to float now raises OverflowError if the long is too
  big to represent as a C double.

- The 3-argument builtin pow() no longer allows a third non-None argument
  if either of the first two arguments is a float, or if both are of
  integer types and the second argument is negative (in which latter case
  the arguments are converted to float, so this is really the same
  restriction).

- The builtin dir() now returns more information, and sometimes much
  more, generally naming all attributes of an object, and all attributes
  reachable from the object via its class, and from its class's base
  classes, and so on from them too.  Example:  in 2.2a2, dir([]) returned
  an empty list.  In 2.2a3,

  >>> dir([])
  ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
   '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__',
   '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__',
   '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__',
   '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__',
   'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
   'reverse', 'sort']

  dir(module) continues to return only the module's attributes, though.

- Overflowing operations on plain ints now return a long int rather
  than raising OverflowError.  This is a partial implementation of PEP
  237.  You can use -Wdefault::OverflowWarning to enable a warning for
  this situation, and -Werror::OverflowWarning to revert to the old
  OverflowError exception.

- A new command line option, -Q<arg>, is added to control run-time
  warnings for the use of classic division.  (See PEP 238.)  Possible
  values are -Qold, -Qwarn, -Qwarnall, and -Qnew.  The default is
  -Qold, meaning the / operator has its classic meaning and no
  warnings are issued.  Using -Qwarn issues a run-time warning about
  all uses of classic division for int and long arguments; -Qwarnall
  also warns about classic division for float and complex arguments
  (for use with fixdiv.py).
  [Note:  the remainder of this item (preserved below) became
  obsolete in 2.2c1 -- -Qnew has global effect in 2.2] ::

    Using -Qnew is questionable; it turns on new division by default, but
    only in the __main__ module.  You can usefully combine -Qwarn or
    -Qwarnall and -Qnew: this gives the __main__ module new division, and
    warns about classic division everywhere else.

- Many built-in types can now be subclassed.  This applies to int,
  long, float, str, unicode, and tuple.  (The types complex, list and
  dictionary can also be subclassed; this was introduced earlier.)
  Note that restrictions apply when subclassing immutable built-in
  types: you can only affect the value of the instance by overloading
  __new__.  You can add mutable attributes, and the subclass instances
  will have a __dict__ attribute, but you cannot change the "value"
  (as implemented by the base class) of an immutable subclass instance
  once it is created.

- The dictionary constructor now takes an optional argument, a
  mapping-like object, and initializes the dictionary from its
  (key, value) pairs.

- A new built-in type, super, has been added.  This facilitates making
  "cooperative super calls" in a multiple inheritance setting.  For an
  explanation, see http://www.python.org/2.2/descrintro.html#cooperation

- A new built-in type, property, has been added.  This enables the
  creation of "properties".  These are attributes implemented by
  getter and setter functions (or only one of these for read-only or
  write-only attributes), without the need to override __getattr__.
  See http://www.python.org/2.2/descrintro.html#property

- The syntax of floating-point and imaginary literals has been
  liberalized, to allow leading zeroes.  Examples of literals now
  legal that were SyntaxErrors before:

      00.0    0e3   0100j   07.5   00000000000000000008.

- An old tokenizer bug allowed floating point literals with an incomplete
  exponent, such as 1e and 3.1e-.  Such literals now raise SyntaxError.

Library
-------

- telnetlib includes symbolic names for the options, and support for
  setting an option negotiation callback. It also supports processing
  of suboptions.

- The new C standard no longer requires that math libraries set errno to
  ERANGE on overflow.  For platform libraries that exploit this new
  freedom, Python's overflow-checking was wholly broken.  A new overflow-
  checking scheme attempts to repair that, but may not be reliable on all
  platforms (C doesn't seem to provide anything both useful and portable
  in this area anymore).

- Asynchronous timeout actions are available through the new class
  threading.Timer.

- math.log and math.log10 now return sensible results for even huge
  long arguments.  For example, math.log10(10 ** 10000) ~= 10000.0.

- A new function, imp.lock_held(), returns 1 when the import lock is
  currently held.  See the docs for the imp module.

- pickle, cPickle and marshal on 32-bit platforms can now correctly read
  dumps containing ints written on platforms where Python ints are 8 bytes.
  When read on a box where Python ints are 4 bytes, such values are
  converted to Python longs.

- In restricted execution mode (using the rexec module), unmarshalling
  code objects is no longer allowed.  This plugs a security hole.

- unittest.TestResult instances no longer store references to tracebacks
  generated by test failures. This prevents unexpected dangling references
  to objects that should be garbage collected between tests.

Tools
-----

- Tools/scripts/fixdiv.py has been added which can be used to fix
  division operators as per PEP 238.

Build
-----

- If you are an adventurous person using Mac OS X you may want to look at
  Mac/OSX. There is a Makefile there that will build Python as a real Mac
  application, which can be used for experimenting with Carbon or Cocoa.
  Discussion of this on pythonmac-sig, please.

C API
-----

- New function PyObject_Dir(obj), like Python __builtin__.dir(obj).

- Note that PyLong_AsDouble can fail!  This has always been true, but no
  callers checked for it.  It's more likely to fail now, because overflow
  errors are properly detected now.  The proper way to check::

      double x = PyLong_AsDouble(some_long_object);
      if (x == -1.0 && PyErr_Occurred()) {
              /* The conversion failed. */
      }

- The GC API has been changed.  Extensions that use the old API will still
  compile but will not participate in GC.  To upgrade an extension
  module:

    - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC

    - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and
      PyObject_GC_Del to deallocate them

    - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini
      to PyObject_GC_UnTrack

    - remove PyGC_HEAD_SIZE from object size calculations

    - remove calls to PyObject_AS_GC and PyObject_FROM_GC

- Two new functions: PyString_FromFormat() and PyString_FromFormatV().
  These can be used safely to construct string objects from a
  sprintf-style format string (similar to the format string supported
  by PyErr_Format()).

New platforms
-------------

- Stephen Hansen contributed patches sufficient to get a clean compile
  under Borland C (Windows), but he reports problems running it and ran
  out of time to complete the port.  Volunteers?  Expect a MemoryError
  when importing the types module; this is probably shallow, and
  causing later failures too.

Tests
-----

Windows
-------

- Large file support is now enabled on Win32 platforms as well as on
  Win64.  This means that, for example, you can use f.tell() and f.seek()
  to manipulate files larger than 2 gigabytes (provided you have enough
  disk space, and are using a Windows filesystem that supports large
  partitions).  Windows filesystem limits:  FAT has a 2GB (gigabyte)
  filesize limit, and large file support makes no difference there.
  FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now.
  NTFS has no practical limit on file size, and files of any size can be
  used from Python now.

- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC
  points to command.com (patch from Brian Quinlan).


What's New in Python 2.2a2?
===========================

*Release Date: 22-Aug-2001*

Build
-----

- Tim Peters developed a brand new Windows installer using Wise 8.1,
  generously donated to us by Wise Solutions.

- configure supports a new option --enable-unicode, with the values
  ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode
  type and supporting code is completely removed from the interpreter.

- A new configure option --enable-framework builds a Mac OS X framework,
  which "make frameworkinstall" will install. This provides a starting
  point for more mac-like functionality, join pythonmac-sig@python.org
  if you are interested in helping.

- The NeXT platform is no longer supported.

- The 'new' module is now statically linked.

Tools
-----

- The new Tools/scripts/cleanfuture.py can be used to automatically
  edit out obsolete future statements from Python source code.  See
  the module docstring for details.

Tests
-----

- regrtest.py now knows which tests are expected to be skipped on some
  platforms, allowing to give clearer test result output.  regrtest
  also has optional --use/-u switch to run normally disabled tests
  which require network access or consume significant disk resources.

- Several new tests in the standard test suite, with special thanks to
  Nick Mathewson.

Core
----

- The floor division operator // has been added as outlined in PEP
  238.  The / operator still provides classic division (and will until
  Python 3.0) unless "from __future__ import division" is included, in
  which case the / operator will provide true division.  The operator
  module provides truediv() and floordiv() functions.  Augmented
  assignment variants are included, as are the equivalent overloadable
  methods and C API methods.  See the PEP for a full discussion:
  <http://python.sf.net/peps/pep-0238.html>

- Future statements are now effective in simulated interactive shells
  (like IDLE).  This should "just work" by magic, but read Michael
  Hudson's "Future statements in simulated shells" PEP 264 for full
  details:  <http://python.sf.net/peps/pep-0264.html>.

- The type/class unification (PEP 252-253) was integrated into the
  trunk and is not so tentative any more (the exact specification of
  some features is still tentative).  A lot of work has done on fixing
  bugs and adding robustness and features (performance still has to
  come a long way).

- Warnings about a mismatch in the Python API during extension import
  now use the Python warning framework (which makes it possible to
  write filters for these warnings).

- A function's __dict__ (aka func_dict) will now always be a
  dictionary.  It used to be possible to delete it or set it to None,
  but now both actions raise TypeErrors.  It is still legal to set it
  to a dictionary object.  Getting func.__dict__ before any attributes
  have been assigned now returns an empty dictionary instead of None.

- A new command line option, -E, was added which disables the use of
  all environment variables, or at least those that are specifically
  significant to Python.  Usually those have a name starting with
  "PYTHON".  This was used to fix a problem where the tests fail if
  the user happens to have PYTHONHOME or PYTHONPATH pointing to an
  older distribution.

Library
-------

- New class Differ and new functions ndiff() and restore() in difflib.py.
  These package the algorithms used by the popular Tools/scripts/ndiff.py,
  for programmatic reuse.

- New function xml.sax.saxutils.quoteattr():  Quote an XML attribute
  value using the minimal quoting required for the value; more
  reliable than using xml.sax.saxutils.escape() for attribute values.

- Readline completion support for cmd.Cmd was added.

- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings.

- Added function threading.BoundedSemaphore()

- Added Ka-Ping Yee's cgitb.py module.

- The 'new' module now exposes the CO_xxx flags.

- The gc module offers the get_referents function.

New platforms
-------------

C API
-----

- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added
  which provide a cross-platform implementations for the
  relatively new snprintf()/vsnprintf() C lib APIs. In contrast to
  the standard sprintf() and vsprintf() C lib APIs, these versions
  apply bounds checking on the used buffer which enhances protection
  against buffer overruns.

- Unicode APIs now use name mangling to assure that mixing interpreters
  and extensions using different Unicode widths is rendered next to
  impossible. Trying to import an incompatible Unicode-aware extension
  will result in an ImportError.  Unicode extensions writers must make
  sure to check the Unicode width compatibility in their extensions by
  using at least one of the mangled Unicode APIs in the extension.

- Two new flags METH_NOARGS and METH_O are available in method definition
  tables to simplify implementation of methods with no arguments and a
  single untyped argument. Calling such methods is more efficient than
  calling corresponding METH_VARARGS methods. METH_OLDARGS is now
  deprecated.

Windows
-------

- "import module" now compiles module.pyw if it exists and nothing else
  relevant is found.


What's New in Python 2.2a1?
===========================

*Release date: 18-Jul-2001*

Core
----

- TENTATIVELY, a large amount of code implementing much of what's
  described in PEP 252 (Making Types Look More Like Classes) and PEP
  253 (Subtyping Built-in Types) was added.  This will be released
  with Python 2.2a1.  Documentation will be provided separately
  through http://www.python.org/2.2/.  The purpose of releasing this
  with Python 2.2a1 is to test backwards compatibility.  It is
  possible, though not likely, that a decision is made not to release
  this code as part of 2.2 final, if any serious backwards
  incompatibilities are found during alpha testing that cannot be
  repaired.

- Generators were added; this is a new way to create an iterator (see
  below) using what looks like a simple function containing one or
  more 'yield' statements.  See PEP 255.  Since this adds a new
  keyword to the language, this feature must be enabled by including a
  future statement: "from __future__ import generators" (see PEP 236).
  Generators will become a standard feature in a future release
  (probably 2.3).  Without this future statement, 'yield' remains an
  ordinary identifier, but a warning is issued each time it is used.
  (These warnings currently don't conform to the warnings framework of
  PEP 230; we intend to fix this in 2.2a2.)

- The UTF-16 codec was modified to be more RFC compliant. It will now
  only remove BOM characters at the start of the string and then
  only if running in native mode (UTF-16-LE and -BE won't remove a
  leading BMO character).

- Strings now have a new method .decode() to complement the already
  existing .encode() method. These two methods provide direct access
  to the corresponding decoders and encoders of the registered codecs.

  To enhance the usability of the .encode() method, the special
  casing of Unicode object return values was dropped (Unicode objects
  were auto-magically converted to string using the default encoding).

  Both methods will now return whatever the codec in charge of the
  requested encoding returns as object, e.g. Unicode codecs will
  return Unicode objects when decoding is requested ("äöü".decode("latin-1")
  will return u"äöü"). This enables codec writer to create codecs
  for various simple to use conversions.

  New codecs were added to demonstrate these new features (the .encode()
  and .decode() columns indicate the type of the returned objects):

  +---------+-----------+-----------+-----------------------------+
  |Name     | .encode() | .decode() | Description                 |
  +=========+===========+===========+=============================+
  |uu       | string    | string    | UU codec (e.g. for email)   |
  +---------+-----------+-----------+-----------------------------+
  |base64   | string    | string    | base64 codec                |
  +---------+-----------+-----------+-----------------------------+
  |quopri   | string    | string    | quoted-printable codec      |
  +---------+-----------+-----------+-----------------------------+
  |zlib     | string    | string    | zlib compression            |
  +---------+-----------+-----------+-----------------------------+
  |hex      | string    | string    | 2-byte hex codec            |
  +---------+-----------+-----------+-----------------------------+
  |rot-13   | string    | Unicode   | ROT-13 Unicode charmap codec|
  +---------+-----------+-----------+-----------------------------+

- Some operating systems now support the concept of a default Unicode
  encoding for file system operations.  Notably, Windows supports 'mbcs'
  as the default.  The Macintosh will also adopt this concept in the medium
  term, although the default encoding for that platform will be other than
  'mbcs'.

  On operating system that support non-ASCII filenames, it is common for
  functions that return filenames (such as os.listdir()) to return Python
  string objects pre-encoded using the default file system encoding for
  the platform.  As this encoding is likely to be different from Python's
  default encoding, converting this name to a Unicode object before passing
  it back to the Operating System would result in a Unicode error, as Python
  would attempt to use its default encoding (generally ASCII) rather than
  the default encoding for the file system.

  In general, this change simply removes surprises when working with
  Unicode and the file system, making these operations work as you expect,
  increasing the transparency of Unicode objects in this context.
  See [????] for more details, including examples.

- Float (and complex) literals in source code were evaluated to full
  precision only when running from a .py file; the same code loaded from a
  .pyc (or .pyo) file could suffer numeric differences starting at about the
  12th significant decimal digit.  For example, on a machine with IEEE-754
  floating arithmetic,

      x = 9007199254740992.0
      print long(x)

  printed 9007199254740992 if run directly from .py, but 9007199254740000
  if from a compiled (.pyc or .pyo) file.  This was due to marshal using
  str(float) instead of repr(float) when building code objects.  marshal
  now uses repr(float) instead, which should reproduce floats to full
  machine precision (assuming the platform C float<->string I/O conversion
  functions are of good quality).

  This may cause floating-point results to change in some cases, and
  usually for the better, but may also cause numerically unstable
  algorithms to break.

- The implementation of dicts suffers fewer collisions, which has speed
  benefits.  However, the order in which dict entries appear in dict.keys(),
  dict.values() and dict.items() may differ from previous releases for a
  given dict.  Nothing is defined about this order, so no program should
  rely on it.  Nevertheless, it's easy to write test cases that rely on the
  order by accident, typically because of printing the str() or repr() of a
  dict to an "expected results" file.  See Lib/test/test_support.py's new
  sortdict(dict) function for a simple way to display a dict in sorted
  order.

- Many other small changes to dicts were made, resulting in faster
  operation along the most common code paths.

- Dictionary objects now support the "in" operator: "x in dict" means
  the same as dict.has_key(x).

- The update() method of dictionaries now accepts generic mapping
  objects.  Specifically the argument object must support the .keys()
  and __getitem__() methods.  This allows you to say, for example,
  {}.update(UserDict())

- Iterators were added; this is a generalized way of providing values
  to a for loop.  See PEP 234.  There's a new built-in function iter()
  to return an iterator.  There's a new protocol to get the next value
  from an iterator using the next() method (in Python) or the
  tp_iternext slot (in C).  There's a new protocol to get iterators
  using the __iter__() method (in Python) or the tp_iter slot (in C).
  Iterating (i.e. a for loop) over a dictionary generates its keys.
  Iterating over a file generates its lines.

- The following functions were generalized to work nicely with iterator
  arguments::

    map(), filter(), reduce(), zip()
    list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API)
    max(), min()
    join() method of strings
    extend() method of lists
    'x in y' and 'x not in y' (PySequence_Contains() in C API)
    operator.countOf() (PySequence_Count() in C API)
    right-hand side of assignment statements with multiple targets, such as ::
        x, y, z = some_iterable_object_returning_exactly_3_values

- Accessing module attributes is significantly faster (for example,
  random.random or os.path or yourPythonModule.yourAttribute).

- Comparing dictionary objects via == and != is faster, and now works even
  if the keys and values don't support comparisons other than ==.

- Comparing dictionaries in ways other than == and != is slower:  there were
  insecurities in the dict comparison implementation that could cause Python
  to crash if the element comparison routines for the dict keys and/or
  values mutated the dicts.  Making the code bulletproof slowed it down.

- Collisions in dicts are resolved via a new approach, which can help
  dramatically in bad cases.  For example, looking up every key in a dict
  d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x
  faster now.  Thanks to Christian Tismer for pointing out the cause and
  the nature of an effective cure (last December! better late than never).

- repr() is much faster for large containers (dict, list, tuple).


Library
-------

- The constants ascii_letters, ascii_lowercase. and ascii_uppercase
  were added to the string module.  These a locale-independent
  constants, unlike letters, lowercase, and uppercase.  These are now
  use in appropriate locations in the standard library.

- The flags used in dlopen calls can now be configured using
  sys.setdlopenflags and queried using sys.getdlopenflags.

- Fredrik Lundh's xmlrpclib is now a standard library module.  This
  provides full client-side XML-RPC support.  In addition,
  Demo/xmlrpc/ contains two server frameworks (one SocketServer-based,
  one asyncore-based).  Thanks to Eric Raymond for the documentation.

- The xrange() object is simplified: it no longer supports slicing,
  repetition, comparisons, efficient 'in' checking, the tolist()
  method, or the start, stop and step attributes.  See PEP 260.

- A new function fnmatch.filter to filter lists of file names was added.

- calendar.py uses month and day names based on the current locale.

- strop is now *really* obsolete (this was announced before with 1.6),
  and issues DeprecationWarning when used (except for the four items
  that are still imported into string.py).

- Cookie.py now sorts key+value pairs by key in output strings.

- pprint.isrecursive(object) didn't correctly identify recursive objects.
  Now it does.

- pprint functions now much faster for large containers (tuple, list, dict).

- New 'q' and 'Q' format codes in the struct module, corresponding to C
  types "long long" and "unsigned long long" (on Windows, __int64).  In
  native mode, these can be used only when the platform C compiler supports
  these types (when HAVE_LONG_LONG is #define'd by the Python config
  process), and then they inherit the sizes and alignments of the C types.
  In standard mode, 'q' and 'Q' are supported on all platforms, and are
  8-byte integral types.

- The site module installs a new built-in function 'help' that invokes
  pydoc.help.  It must be invoked as 'help()'; when invoked as 'help',
  it displays a message reminding the user to use 'help()' or
  'help(object)'.

Tests
-----

- New test_mutants.py runs dict comparisons where the key and value
  comparison operators mutate the dicts randomly during comparison.  This
  rapidly causes Python to crash under earlier releases (not for the faint
  of heart:  it can also cause Win9x to freeze or reboot!).

- New test_pprint.py verifies that pprint.isrecursive() and
  pprint.isreadable() return sensible results.  Also verifies that simple
  cases produce correct output.

C API
-----

- Removed the unused last_is_sticky argument from the internal
  _PyTuple_Resize().  If this affects you, you were cheating.

What's New in Python 2.1 (final)?
=================================

We only changed a few things since the last release candidate, all in
Python library code:

- A bug in the locale module was fixed that affected locales which
  define no grouping for numeric formatting.

- A few bugs in the weakref module's implementations of weak
  dictionaries (WeakValueDictionary and WeakKeyDictionary) were fixed,
  and the test suite was updated to check for these bugs.

- An old bug in the os.path.walk() function (introduced in Python
  2.0!) was fixed: a non-existent file would cause an exception
  instead of being ignored.

- Fixed a few bugs in the new symtable module found by Neil Norwitz's
  PyChecker.


What's New in Python 2.1c2?
===========================

A flurry of small changes, and one showstopper fixed in the nick of
time made it necessary to release another release candidate.  The list
here is the *complete* list of patches (except version updates):

Core

- Tim discovered a nasty bug in the dictionary code, caused by
  PyDict_Next() calling dict_resize(), and the GC code's use of
  PyDict_Next() violating an assumption in dict_items().  This was
  fixed with considerable amounts of band-aid, but the net effect is a
  saner and more robust implementation.

- Made a bunch of symbols static that were accidentally global.

Build and Ports

- The setup.py script didn't check for a new enough version of zlib
  (1.1.3 is needed).  Now it does.

- Changed "make clean" target to also remove shared libraries.

- Added a more general warning about the SGI Irix optimizer to README.

Library

- Fix a bug in urllib.basejoin("http://host", "../file.html") which
  omitted the slash between host and file.html.

- The mailbox module's _Mailbox class contained a completely broken
  and undocumented seek() method.  Ripped it out.

- Fixed a bunch of typos in various library modules (urllib2, smtpd,
  sgmllib, netrc, chunk) found by Neil Norwitz's PyChecker.

- Fixed a few last-minute bugs in unittest.

Extensions

- Reverted the patch to the OpenSSL code in socketmodule.c to support
  RAND_status() and the EGD, and the subsequent patch that tried to
  fix it for pre-0.9.5 versions; the problem with the patch is that on
  some systems it issues a warning whenever socket is imported, and
  that's unacceptable.

Tests

- Fixed the pickle tests to work with "import test.test_pickle".

- Tweaked test_locale.py to actually run the test Windows.

- In distutils/archive_util.py, call zipfile.ZipFile() with mode "w",
  not "wb" (which is not a valid mode at all).

- Fix pstats browser crashes.  Import readline if it exists to make
  the user interface nicer.

- Add "import thread" to the top of test modules that import the
  threading module (test_asynchat and test_threadedtempfile).  This
  prevents test failures caused by a broken threading module resulting
  from a previously caught failed import.

- Changed test_asynchat.py to set the SO_REUSEADDR option; this was
  needed on some platforms (e.g. Solaris 8) when the tests are run
  twice in succession.

- Skip rather than fail test_sunaudiodev if no audio device is found.


What's New in Python 2.1c1?
===========================

This list was significantly updated when 2.1c2 was released; the 2.1c1
release didn't mention most changes that were actually part of 2.1c1:

Legal

- Copyright was assigned to the Python Software Foundation (PSF) and a
  PSF license (very similar to the CNRI license) was added.

- The CNRI copyright notice was updated to include 2001.

Core

- After a public outcry, assignment to __debug__ is no longer illegal;
  instead, a warning is issued.  It will become illegal in 2.2.

- Fixed a core dump with "%#x" % 0, and changed the semantics so that
  "%#x" now always prepends "0x", even if the value is zero.

- Fixed some nits in the bytecode compiler.

- Fixed core dumps when calling certain kinds of non-functions.

- Fixed various core dumps caused by reference count bugs.

Build and Ports

- Use INSTALL_SCRIPT to install script files.

- New port: SCO Unixware 7, by Billy G. Allie.

- Updated RISCOS port.

- Updated BeOS port and notes.

- Various other porting problems resolved.

Library

- The TERMIOS and SOCKET modules are now truly obsolete and
  unnecessary.  Their symbols are incorporated in the termios and
  socket modules.

- Fixed some 64-bit bugs in pickle, cPickle, and struct, and added
  better tests for pickling.

- threading: make Condition.wait() robust against KeyboardInterrupt.

- zipfile: add support to zipfile to support opening an archive
  represented by an open file rather than a file name.  Fix bug where
  the archive was not properly closed.  Fixed a bug in this bugfix
  where flush() was called for a read-only file.

- imputil: added an uninstall() method to the ImportManager.

- Canvas: fixed bugs in lower() and tkraise() methods.

- SocketServer: API change (added overridable close_request() method)
  so that the TCP server can explicitly close the request.

- pstats: Eric Raymond added a simple interactive statistics browser,
  invoked when the module is run as a script.

- locale: fixed a problem in format().

- webbrowser: made it work when the BROWSER environment variable has a
  value like "/usr/bin/netscape".  Made it auto-detect Konqueror for
  KDE 2.  Fixed some other nits.

- unittest: changes to allow using a different exception than
  AssertionError, and added a few more function aliases.  Some other
  small changes.

- urllib, urllib2: fixed redirect problems and a coupleof other nits.

- asynchat: fixed a critical bug in asynchat that slipped through the
  2.1b2 release.  Fixed another rare bug.

- Fix some unqualified except: clauses (always a bad code example).

XML

- pyexpat: new API get_version_string().

- Fixed some minidom bugs.

Extensions

- Fixed a core dump in _weakref.  Removed the weakref.mapping()
  function (it adds nothing to the API).

- Rationalized the use of header files in the readline module, to make
  it compile (albeit with some warnings) with the very recent readline
  4.2, without breaking for earlier versions.

- Hopefully fixed a buffering problem in linuxaudiodev.

- Attempted a fix to make the OpenSSL support in the socket module
  work again with pre-0.9.5 versions of OpenSSL.

Tests

- Added a test case for asynchat and asyncore.

- Removed coupling between tests where one test failing could break
  another.

Tools

- Ping added an interactive help browser to pydoc, fixed some nits
  in the rest of the pydoc code, and added some features to his
  inspect module.

- An updated python-mode.el version 4.1 which integrates Ken
  Manheimer's pdbtrack.el.  This makes debugging Python code via pdb
  much nicer in XEmacs and Emacs.  When stepping through your program
  with pdb, in either the shell window or the *Python* window, the
  source file and line will be tracked by an arrow.  Very cool!

- IDLE: syntax warnings in interactive mode are changed into errors.

- Some improvements to Tools/webchecker (ignore some more URL types,
  follow some more links).

- Brought the Tools/compiler package up to date.


What's New in Python 2.1 beta 2?
================================

(Unlisted are many fixed bugs, more documentation, etc.)

Core language, builtins, and interpreter

- The nested scopes work (enabled by "from __future__ import
  nested_scopes") is completed; in particular, the future now extends
  into code executed through exec, eval() and execfile(), and into the
  interactive interpreter.

- When calling a base class method (e.g. BaseClass.__init__(self)),
  this is now allowed even if self is not strictly spoken a class
  instance (e.g. when using metaclasses or the Don Beaudry hook).

- Slice objects are now comparable but not hashable; this prevents
  dict[:] from being accepted but meaningless.

- Complex division is now calculated using less braindead algorithms.
  This doesn't change semantics except it's more likely to give useful
  results in extreme cases.  Complex repr() now uses full precision
  like float repr().

- sgmllib.py now calls handle_decl() for simple <!...> declarations.

- It is illegal to assign to the name __debug__, which is set when the
  interpreter starts.  It is effectively a compile-time constant.

- A warning will be issued if a global statement for a variable
  follows a use or assignment of that variable.

Standard library

- unittest.py, a unit testing framework by Steve Purcell (PyUNIT,
  inspired by JUnit), is now part of the standard library.  You now
  have a choice of two testing frameworks: unittest requires you to
  write testcases as separate code, doctest gathers them from
  docstrings.  Both approaches have their advantages and
  disadvantages.

- A new module Tix was added, which wraps the Tix extension library
  for Tk.  With that module, it is not necessary to statically link
  Tix with _tkinter, since Tix will be loaded with Tcl's "package
  require" command.  See Demo/tix/.

- tzparse.py is now obsolete.

- In gzip.py, the seek() and tell() methods are removed -- they were
  non-functional anyway, and it's better if callers can test for their
  existence with hasattr().

Python/C API

- PyDict_Next(): it is now safe to call PyDict_SetItem() with a key
  that's already in the dictionary during a PyDict_Next() iteration.
  This used to fail occasionally when a dictionary resize operation
  could be triggered that would rehash all the keys.  All other
  modifications to the dictionary are still off-limits during a
  PyDict_Next() iteration!

- New extended APIs related to passing compiler variables around.

- New abstract APIs PyObject_IsInstance(), PyObject_IsSubclass()
  implement isinstance() and issubclass().

- Py_BuildValue() now has a "D" conversion to create a Python complex
  number from a Py_complex C value.

- Extensions types which support weak references must now set the
  field allocated for the weak reference machinery to NULL themselves;
  this is done to avoid the cost of checking each object for having a
  weakly referencable type in PyObject_INIT(), since most types are
  not weakly referencable.

- PyFrame_FastToLocals() and PyFrame_LocalsToFast() copy bindings for
  free variables and cell variables to and from the frame's f_locals.

- Variants of several functions defined in pythonrun.h have been added
  to support the nested_scopes future statement.  The variants all end
  in Flags and take an extra argument, a PyCompilerFlags *; examples:
  PyRun_AnyFileExFlags(), PyRun_InteractiveLoopFlags().  These
  variants may be removed in Python 2.2, when nested scopes are
  mandatory.

Distutils

- the sdist command now writes a PKG-INFO file, as described in PEP 241,
  into the release tree.

- several enhancements to the bdist_wininst command from Thomas Heller
  (an uninstaller, more customization of the installer's display)

- from Jack Jansen: added Mac-specific code to generate a dialog for
  users to specify the command-line (because providing a command-line with
  MacPython is awkward).  Jack also made various fixes for the Mac
  and the Metrowerks compiler.

- added 'platforms' and 'keywords' to the set of metadata that can be
  specified for a distribution.

- applied patches from Jason Tishler to make the compiler class work with
  Cygwin.


What's New in Python 2.1 beta 1?
================================

Core language, builtins, and interpreter

- Following an outcry from the community about the amount of code
  broken by the nested scopes feature introduced in 2.1a2, we decided
  to make this feature optional, and to wait until Python 2.2 (or at
  least 6 months) to make it standard.  The option can be enabled on a
  per-module basis by adding "from __future__ import nested_scopes" at
  the beginning of a module (before any other statements, but after
  comments and an optional docstring).  See PEP 236 (Back to the
  __future__) for a description of the __future__ statement.  PEP 227
  (Statically Nested Scopes) has been updated to reflect this change,
  and to clarify the semantics in a number of endcases.

- The nested scopes code, when enabled, has been hardened, and most
  bugs and memory leaks in it have been fixed.

- Compile-time warnings are now generated for a number of conditions
  that will break or change in meaning when nested scopes are enabled:

  - Using "from...import *" or "exec" without in-clause in a function
    scope that also defines a lambda or nested function with one or
    more free (non-local) variables.  The presence of the import* or
    bare exec makes it impossible for the compiler to determine the
    exact set of local variables in the outer scope, which makes it
    impossible to determine the bindings for free variables in the
    inner scope.  To avoid the warning about import *, change it into
    an import of explicitly name object, or move the import* statement
    to the global scope; to avoid the warning about bare exec, use
    exec...in... (a good idea anyway -- there's a possibility that
    bare exec will be deprecated in the future).

  - Use of a global variable in a nested scope with the same name as a
    local variable in a surrounding scope.  This will change in
    meaning with nested scopes: the name in the inner scope will
    reference the variable in the outer scope rather than the global
    of the same name.  To avoid the warning, either rename the outer
    variable, or use a global statement in the inner function.

- An optional object allocator has been included.  This allocator is
  optimized for Python objects and should be faster and use less memory
  than the standard system allocator.  It is not enabled by default
  because of possible thread safety problems.  The allocator is only
  protected by the Python interpreter lock and it is possible that some
  extension modules require a thread safe allocator.  The object
  allocator can be enabled by providing the "--with-pymalloc" option to
  configure.

Standard library

- pyexpat now detects the expat version if expat.h defines it. A
  number of additional handlers are provided, which are only available
  since expat 1.95. In addition, the methods SetParamEntityParsing and
  GetInputContext of Parser objects are available with 1.95.x
  only. Parser objects now provide the ordered_attributes and
  specified_attributes attributes. A new module expat.model was added,
  which offers a number of additional constants if 1.95.x is used.

- xml.dom offers the new functions registerDOMImplementation and
  getDOMImplementation.

- xml.dom.minidom offers a toprettyxml method. A number of DOM
  conformance issues have been resolved. In particular, Element now
  has an hasAttributes method, and the handling of namespaces was
  improved.

- Ka-Ping Yee contributed two new modules: inspect.py, a module for
  getting information about live Python code, and pydoc.py, a module
  for interactively converting docstrings to HTML or text.
  Tools/scripts/pydoc, which is now automatically installed into
  <prefix>/bin, uses pydoc.py to display documentation; try running
  "pydoc -h" for instructions.  "pydoc -g" pops up a small GUI that
  lets you browse the module docstrings using a web browser.

- New library module difflib.py, primarily packaging the SequenceMatcher
  class at the heart of the popular ndiff.py file-comparison tool.

- doctest.py (a framework for verifying Python code examples in docstrings)
  is now part of the std library.

Windows changes

- A new entry in the Start menu, "Module Docs", runs "pydoc -g" -- a
  small GUI that lets you browse the module docstrings using your
  default web browser.

- Import is now case-sensitive.  PEP 235 (Import on Case-Insensitive
  Platforms) is implemented.  See

      http://python.sourceforge.net/peps/pep-0235.html

  for full details, especially the "Current Lower-Left Semantics" section.
  The new Windows import rules are simpler than before:

  A. If the PYTHONCASEOK environment variable exists, same as
     before:  silently accept the first case-insensitive match of any
     kind; raise ImportError if none found.

  B. Else search sys.path for the first case-sensitive match; raise
     ImportError if none found.

  The same rules have been implemented on other platforms with case-
  insensitive but case-preserving filesystems too (including Cygwin, and
  several flavors of Macintosh operating systems).

- winsound module:  Under Win9x, winsound.Beep() now attempts to simulate
  what it's supposed to do (and does do under NT and 2000) via direct
  port manipulation.  It's unknown whether this will work on all systems,
  but it does work on my Win98SE systems now and was known to be useless on
  all Win9x systems before.

- Build:  Subproject _test (effectively) renamed to _testcapi.

New platforms

- 2.1 should compile and run out of the box under MacOS X, even using HFS+.
  Thanks to Steven Majewski!

- 2.1 should compile and run out of the box on Cygwin.  Thanks to Jason
  Tishler!

- 2.1 contains new files and patches for RISCOS, thanks to Dietmar
  Schwertberger!  See RISCOS/README for more information -- it seems
  that because of the bizarre filename conventions on RISCOS, no port
  to that platform is easy.


What's New in Python 2.1 alpha 2?
=================================

Core language, builtins, and interpreter

- Scopes nest.  If a name is used in a function or class, but is not
  local, the definition in the nearest enclosing function scope will
  be used.  One consequence of this change is that lambda statements
  could reference variables in the namespaces where the lambda is
  defined.  In some unusual cases, this change will break code.

  In all previous version of Python, names were resolved in exactly
  three namespaces -- the local namespace, the global namespace, and
  the builtins namespace.  According to this old definition, if a
  function A is defined within a function B, the names bound in B are
  not visible in A.  The new rules make names bound in B visible in A,
  unless A contains a name binding that hides the binding in B.

  Section 4.1 of the reference manual describes the new scoping rules
  in detail.  The test script in Lib/test/test_scope.py demonstrates
  some of the effects of the change.

  The new rules will cause existing code to break if it defines nested
  functions where an outer function has local variables with the same
  name as globals or builtins used by the inner function.  Example:

    def munge(str):
        def helper(x):
            return str(x)
        if type(str) != type(''):
            str = helper(str)
        return str.strip()

  Under the old rules, the name str in helper() is bound to the
  built-in function str().  Under the new rules, it will be bound to
  the argument named str and an error will occur when helper() is
  called.

- The compiler will report a SyntaxError if "from ... import *" occurs
  in a function or class scope.  The language reference has documented
  that this case is illegal, but the compiler never checked for it.
  The recent introduction of nested scope makes the meaning of this
  form of name binding ambiguous.  In a future release, the compiler
  may allow this form when there is no possibility of ambiguity.

- repr(string) is easier to read, now using hex escapes instead of octal,
  and using \t, \n and \r instead of \011, \012 and \015 (respectively):

  >>> "\texample \r\n" + chr(0) + chr(255)
  '\texample \r\n\x00\xff'         # in 2.1
  '\011example \015\012\000\377'   # in 2.0

- Functions are now compared and hashed by identity, not by value, since
  the func_code attribute is writable.

- Weak references (PEP 205) have been added.  This involves a few
  changes in the core, an extension module (_weakref), and a Python
  module (weakref).  The weakref module is the public interface.  It
  includes support for "explicit" weak references, proxy objects, and
  mappings with weakly held values.

- A 'continue' statement can now appear in a try block within the body
  of a loop.  It is still not possible to use continue in a finally
  clause.

Standard library

- mailbox.py now has a new class, PortableUnixMailbox which is
  identical to UnixMailbox but uses a more portable scheme for
  determining From_ separators.  Also, the constructors for all the
  classes in this module have a new optional `factory' argument, which
  is a callable used when new message classes must be instantiated by
  the next() method.

- random.py is now self-contained, and offers all the functionality of
  the now-deprecated whrandom.py.  See the docs for details.  random.py
  also supports new functions getstate() and setstate(), for saving
  and restoring the internal state of the generator; and jumpahead(n),
  for quickly forcing the internal state to be the same as if n calls to
  random() had been made.  The latter is particularly useful for multi-
  threaded programs, creating one instance of the random.Random() class for
  each thread, then using .jumpahead() to force each instance to use a
  non-overlapping segment of the full period.

- random.py's seed() function is new.  For bit-for-bit compatibility with
  prior releases, use the whseed function instead.  The new seed function
  addresses two problems:  (1) The old function couldn't produce more than
  about 2**24 distinct internal states; the new one about 2**45 (the best
  that can be done in the Wichmann-Hill generator).  (2) The old function
  sometimes produced identical internal states when passed distinct
  integers, and there was no simple way to predict when that would happen;
  the new one guarantees to produce distinct internal states for all
  arguments in [0, 27814431486576L).

- The socket module now supports raw packets on Linux.  The socket
  family is AF_PACKET.

- test_capi.py is a start at running tests of the Python C API.  The tests
  are implemented by the new Modules/_testmodule.c.

- A new extension module, _symtable, provides provisional access to the
  internal symbol table used by the Python compiler.  A higher-level
  interface will be added on top of _symtable in a future release.

- Removed the obsolete soundex module.

- xml.dom.minidom now uses the standard DOM exceptions. Node supports
  the isSameNode method; NamedNodeMap the get method.

- xml.sax.expatreader supports the lexical handler property; it
  generates comment, startCDATA, and endCDATA events.

Windows changes

- Build procedure:  the zlib project is built in a different way that
  ensures the zlib header files used can no longer get out of synch with
  the zlib binary used.  See PCbuild\readme.txt for details.  Your old
  zlib-related directories can be deleted; you'll need to download fresh
  source for zlib and unpack it into a new directory.

- Build:  New subproject _test for the benefit of test_capi.py (see above).

- Build:  New subproject _symtable, for new DLL _symtable.pyd (a nascent
  interface to some Python compiler internals).

- Build:  Subproject ucnhash is gone, since the code was folded into the
  unicodedata subproject.

What's New in Python 2.1 alpha 1?
=================================

Core language, builtins, and interpreter

- There is a new Unicode companion to the PyObject_Str() API
  called PyObject_Unicode(). It behaves in the same way as the
  former, but assures that the returned value is an Unicode object
  (applying the usual coercion if necessary).

- The comparison operators support "rich comparison overloading" (PEP
  207).  C extension types can provide a rich comparison function in
  the new tp_richcompare slot in the type object.  The cmp() function
  and the C function PyObject_Compare() first try the new rich
  comparison operators before trying the old 3-way comparison.  There
  is also a new C API PyObject_RichCompare() (which also falls back on
  the old 3-way comparison, but does not constrain the outcome of the
  rich comparison to a Boolean result).

  The rich comparison function takes two objects (at least one of
  which is guaranteed to have the type that provided the function) and
  an integer indicating the opcode, which can be Py_LT, Py_LE, Py_EQ,
  Py_NE, Py_GT, Py_GE (for <, <=, ==, !=, >, >=), and returns a Python
  object, which may be NotImplemented (in which case the tp_compare
  slot function is used as a fallback, if defined).

  Classes can overload individual comparison operators by defining one
  or more of the methods__lt__, __le__, __eq__, __ne__, __gt__,
  __ge__.  There are no explicit "reflected argument" versions of
  these; instead, __lt__ and __gt__ are each other's reflection,
  likewise for__le__ and __ge__; __eq__ and __ne__ are their own
  reflection (similar at the C level).  No other implications are
  made; in particular, Python does not assume that == is the Boolean
  inverse of !=, or that < is the Boolean inverse of >=.  This makes
  it possible to define types with partial orderings.

  Classes or types that want to implement (in)equality tests but not
  the ordering operators (i.e. unordered types) should implement ==
  and !=, and raise an error for the ordering operators.

  It is possible to define types whose rich comparison results are not
  Boolean; e.g. a matrix type might want to return a matrix of bits
  for A < B, giving elementwise comparisons.  Such types should ensure
  that any interpretation of their value in a Boolean context raises
  an exception, e.g. by defining __nonzero__ (or the tp_nonzero slot
  at the C level) to always raise an exception.

- Complex numbers use rich comparisons to define == and != but raise
  an exception for <, <=, > and >=.  Unfortunately, this also means
  that cmp() of two complex numbers raises an exception when the two
  numbers differ.  Since it is not mathematically meaningful to compare
  complex numbers except for equality, I hope that this doesn't break
  too much code.

- The outcome of comparing non-numeric objects of different types is
  not defined by the language, other than that it's arbitrary but
  consistent (see the Reference Manual).  An implementation detail changed
  in 2.1a1 such that None now compares less than any other object.  Code
  relying on this new behavior (like code that relied on the previous
  behavior) does so at its own risk.

- Functions and methods now support getting and setting arbitrarily
  named attributes (PEP 232).  Functions have a new __dict__
  (a.k.a. func_dict) which hold the function attributes.  Methods get
  and set attributes on their underlying im_func.  It is a TypeError
  to set an attribute on a bound method.

- The xrange() object implementation has been improved so that
  xrange(sys.maxint) can be used on 64-bit platforms.  There's still a
  limitation that in this case len(xrange(sys.maxint)) can't be
  calculated, but the common idiom "for i in xrange(sys.maxint)" will
  work fine as long as the index i doesn't actually reach 2**31.
  (Python uses regular ints for sequence and string indices; fixing
  that is much more work.)

- Two changes to from...import:

  1) "from M import X" now works even if (after loading module M)
     sys.modules['M'] is not a real module; it's basically a getattr()
     operation with AttributeError exceptions changed into ImportError.

  2) "from M import *" now looks for M.__all__ to decide which names to
     import; if M.__all__ doesn't exist, it uses M.__dict__.keys() but
     filters out names starting with '_' as before.  Whether or not
     __all__ exists, there's no restriction on the type of M.

- File objects have a new method, xreadlines().  This is the fastest
  way to iterate over all lines in a file:

  for line in file.xreadlines():
      ...do something to line...

  See the xreadlines module (mentioned below) for how to do this for
  other file-like objects.

- Even if you don't use file.xreadlines(), you may expect a speedup on
  line-by-line input.  The file.readline() method has been optimized
  quite a bit in platform-specific ways:  on systems (like Linux) that
  support flockfile(), getc_unlocked(), and funlockfile(), those are
  used by default.  On systems (like Windows) without getc_unlocked(),
  a complicated (but still thread-safe) method using fgets() is used by
  default.

  You can force use of the fgets() method by #define'ing
  USE_FGETS_IN_GETLINE at build time (it may be faster than
  getc_unlocked()).

  You can force fgets() not to be used by #define'ing
  DONT_USE_FGETS_IN_GETLINE (this is the first thing to try if std test
  test_bufio.py fails -- and let us know if it does!).

- In addition, the fileinput module, while still slower than the other
  methods on most platforms, has been sped up too, by using
  file.readlines(sizehint).

- Support for run-time warnings has been added, including a new
  command line option (-W) to specify the disposition of warnings.
  See the description of the warnings module below.

- Extensive changes have been made to the coercion code.  This mostly
  affects extension modules (which can now implement mixed-type
  numerical operators without having to use coercion), but
  occasionally, in boundary cases the coercion semantics have changed
  subtly.  Since this was a terrible gray area of the language, this
  is considered an improvement.  Also note that __rcmp__ is no longer
  supported -- instead of calling __rcmp__, __cmp__ is called with
  reflected arguments.

- In connection with the coercion changes, a new built-in singleton
  object, NotImplemented is defined.  This can be returned for
  operations that wish to indicate they are not implemented for a
  particular combination of arguments.  From C, this is
  Py_NotImplemented.

- The interpreter accepts now bytecode files on the command line even
  if they do not have a .pyc or .pyo extension. On Linux, after executing

import imp,sys,string
magic = string.join(["\\x%.2x" % ord(c) for c in imp.get_magic()],"")
reg = ':pyc:M::%s::%s:' % (magic, sys.executable)
open("/proc/sys/fs/binfmt_misc/register","wb").write(reg)

  any byte code file can be used as an executable (i.e. as an argument
  to execve(2)).

- %[xXo] formats of negative Python longs now produce a sign
  character.  In 1.6 and earlier, they never produced a sign,
  and raised an error if the value of the long was too large
  to fit in a Python int.  In 2.0, they produced a sign if and
  only if too large to fit in an int.  This was inconsistent
  across platforms (because the size of an int varies across
  platforms), and inconsistent with hex() and oct().  Example:

  >>> "%x" % -0x42L
  '-42'      # in 2.1
  'ffffffbe' # in 2.0 and before, on 32-bit machines
  >>> hex(-0x42L)
  '-0x42L'   # in all versions of Python

  The behavior of %d formats for negative Python longs remains
  the same as in 2.0 (although in 1.6 and before, they raised
  an error if the long didn't fit in a Python int).

  %u formats don't make sense for Python longs, but are allowed
  and treated the same as %d in 2.1.  In 2.0, a negative long
  formatted via %u produced a sign if and only if too large to
  fit in an int.  In 1.6 and earlier, a negative long formatted
  via %u raised an error if it was too big to fit in an int.

- Dictionary objects have an odd new method, popitem().  This removes
  an arbitrary item from the dictionary and returns it (in the form of
  a (key, value) pair).  This can be useful for algorithms that use a
  dictionary as a bag of "to do" items and repeatedly need to pick one
  item.  Such algorithms normally end up running in quadratic time;
  using popitem() they can usually be made to run in linear time.

Standard library

- In the time module, the time argument to the functions strftime,
  localtime, gmtime, asctime and ctime is now optional, defaulting to
  the current time (in the local timezone).

- The ftplib module now defaults to passive mode, which is deemed a
  more useful default given that clients are often inside firewalls
  these days.  Note that this could break if ftplib is used to connect
  to a *server* that is inside a firewall, from outside; this is
  expected to be a very rare situation.  To fix that, you can call
  ftp.set_pasv(0).

- The module site now treats .pth files not only for path configuration,
  but also supports extensions to the initialization code: Lines starting
  with import are executed.

- There's a new module, warnings, which implements a mechanism for
  issuing and filtering warnings.  There are some new built-in
  exceptions that serve as warning categories, and a new command line
  option, -W, to control warnings (e.g. -Wi ignores all warnings, -We
  turns warnings into errors).  warnings.warn(message[, category])
  issues a warning message; this can also be called from C as
  PyErr_Warn(category, message).

- A new module xreadlines was added.  This exports a single factory
  function, xreadlines().  The intention is that this code is the
  absolutely fastest way to iterate over all lines in an open
  file(-like) object:

  import xreadlines
  for line in xreadlines.xreadlines(file):
      ...do something to line...

  This is equivalent to the previous the speed record holder using
  file.readlines(sizehint).  Note that if file is a real file object
  (as opposed to a file-like object), this is equivalent:

  for line in file.xreadlines():
      ...do something to line...

- The bisect module has new functions bisect_left, insort_left,
  bisect_right and insort_right.  The old names bisect and insort
  are now aliases for bisect_right and insort_right.  XXX_right
  and XXX_left methods differ in what happens when the new element
  compares equal to one or more elements already in the list:  the
  XXX_left methods insert to the left, the XXX_right methods to the
  right.  Code that doesn't care where equal elements end up should
  continue to use the old, short names ("bisect" and "insort").

- The new curses.panel module wraps the panel library that forms part
  of SYSV curses and ncurses.  Contributed by Thomas Gellekum.

- The SocketServer module now sets the allow_reuse_address flag by
  default in the TCPServer class.

- A new function, sys._getframe(), returns the stack frame pointer of
  the caller.  This is intended only as a building block for
  higher-level mechanisms such as string interpolation.

- The pyexpat module supports a number of new handlers, which are
  available only in expat 1.2. If invocation of a callback fails, it
  will report an additional frame in the traceback. Parser objects
  participate now in garbage collection. If expat reports an unknown
  encoding, pyexpat will try to use a Python codec; that works only
  for single-byte charsets. The parser type objects is exposed as
  XMLParserObject.

- xml.dom now offers standard definitions for symbolic node type and
  exception code constants, and a hierarchy of DOM exceptions. minidom
  was adjusted to use them.

- The conformance of xml.dom.minidom to the DOM specification was
  improved. It detects a number of additional error cases; the
  previous/next relationship works even when the tree is modified;
  Node supports the normalize() method; NamedNodeMap, DocumentType and
  DOMImplementation classes were added; Element supports the
  hasAttribute and hasAttributeNS methods; and Text supports the splitText
  method.

Build issues

- For Unix (and Unix-compatible) builds, configuration and building of
  extension modules is now greatly automated.  Rather than having to
  edit the Modules/Setup file to indicate which modules should be
  built and where their include files and libraries are, a
  distutils-based setup.py script now takes care of building most
  extension modules.  All extension modules built this way are built
  as shared libraries.  Only a few modules that must be linked
  statically are still listed in the Setup file; you won't need to
  edit their configuration.

- Python should now build out of the box on Cygwin.  If it doesn't,
  mail to Jason Tishler (jlt63 at users.sourceforge.net).

- Python now always uses its own (renamed) implementation of getopt()
  -- there's too much variation among C library getopt()
  implementations.

- C++ compilers are better supported; the CXX macro is always set to a
  C++ compiler if one is found.

Windows changes

- select module:  By default under Windows, a select() call
  can specify no more than 64 sockets.  Python now boosts
  this Microsoft default to 512.  If you need even more than
  that, see the MS docs (you'll need to #define FD_SETSIZE
  and recompile Python from source).

- Support for Windows 3.1, DOS and OS/2 is gone.  The Lib/dos-8x3
  subdirectory is no more!


What's New in Python 2.0?
=========================

Below is a list of all relevant changes since release 1.6.  Older
changes are in the file HISTORY.  If you are making the jump directly
from Python 1.5.2 to 2.0, make sure to read the section for 1.6 in the
HISTORY file!  Many important changes listed there.

Alternatively, a good overview of the changes between 1.5.2 and 2.0 is
the document "What's New in Python 2.0" by Kuchling and Moshe Zadka:
http://www.amk.ca/python/2.0/.

--Guido van Rossum (home page: http://www.pythonlabs.com/~guido/)

======================================================================

What's new in 2.0 (since release candidate 1)?
==============================================

Standard library

- The copy_reg module was modified to clarify its intended use: to
  register pickle support for extension types, not for classes.
  pickle() will raise a TypeError if it is passed a class.

- Fixed a bug in gettext's "normalize and expand" code that prevented
  it from finding an existing .mo file.

- Restored support for HTTP/0.9 servers in httplib.

- The math module was changed to stop raising OverflowError in case of
  underflow, and return 0 instead in underflow cases.  Whether Python
  used to raise OverflowError in case of underflow was platform-
  dependent (it did when the platform math library set errno to ERANGE
  on underflow).

- Fixed a bug in StringIO that occurred when the file position was not
  at the end of the file and write() was called with enough data to
  extend past the end of the file.

- Fixed a bug that caused Tkinter error messages to get lost on
  Windows.  The bug was fixed by replacing direct use of
  interp->result with Tcl_GetStringResult(interp).

- Fixed bug in urllib2 that caused it to fail when it received an HTTP
  redirect response.

- Several changes were made to distutils: Some debugging code was
  removed from util.  Fixed the installer used when an external zip
  program (like WinZip) is not found; the source code for this
  installer is in Misc/distutils.  check_lib() was modified to behave
  more like AC_CHECK_LIB by add other_libraries() as a parameter.  The
  test for whether installed modules are on sys.path was changed to
  use both normcase() and normpath().

- Several minor bugs were fixed in the xml package (the minidom,
  pulldom, expatreader, and saxutils modules).

- The regression test driver (regrtest.py) behavior when invoked with
  -l changed: It now reports a count of objects that are recognized as
  garbage but not freed by the garbage collector.

- The regression test for the math module was changed to test
  exceptional behavior when the test is run in verbose mode.  Python
  cannot yet guarantee consistent exception behavior across platforms,
  so the exception part of test_math is run only in verbose mode, and
  may fail on your platform.

Internals

- PyOS_CheckStack() has been disabled on Win64, where it caused
  test_sre to fail.

Build issues

- Changed compiler flags, so that gcc is always invoked with -Wall and
  -Wstrict-prototypes.  Users compiling Python with GCC should see
  exactly one warning, except if they have passed configure the
  --with-pydebug flag.  The expected warning is for getopt() in
  Modules/main.c.  This warning will be fixed for Python 2.1.

- Fixed configure to add -threads argument during linking on OSF1.

Tools and other miscellany

- The compiler in Tools/compiler was updated to support the new
  language features introduced in 2.0: extended print statement, list
  comprehensions, and augmented assignments.  The new compiler should
  also be backwards compatible with Python 1.5.2; the compiler will
  always generate code for the version of the interpreter it runs
  under.

What's new in 2.0 release candidate 1 (since beta 2)?
=====================================================

What is release candidate 1?

We believe that release candidate 1 will fix all known bugs that we
intend to fix for the 2.0 final release.  This release should be a bit
more stable than the previous betas.  We would like to see even more
widespread testing before the final release, so we are producing this
release candidate.  The final release will be exactly the same unless
any show-stopping (or brown bag) bugs are found by testers of the
release candidate.

All the changes since the last beta release are bug fixes or changes
to support building Python for specific platforms.

Core language, builtins, and interpreter

- A bug that caused crashes when __coerce__ was used with augmented
  assignment, e.g. +=, was fixed.

- Raise ZeroDivisionError when raising zero to a negative number,
  e.g. 0.0 ** -2.0.  Note that math.pow is unrelated to the built-in
  power operator and the result of math.pow(0.0, -2.0) will vary by
  platform.  On Linux, it raises a ValueError.

- A bug in Unicode string interpolation was fixed that occasionally
  caused errors with formats including "%%".  For example, the
  following expression "%% %s" % u"abc" no longer raises a TypeError.

- Compilation of deeply nested expressions raises MemoryError instead
  of SyntaxError, e.g. eval("[" * 50 + "]" * 50).

- In 2.0b2 on Windows, the interpreter wrote .pyc files in text mode,
  rendering them useless.  They are now written in binary mode again.

Standard library

- Keyword arguments are now accepted for most pattern and match object
  methods in SRE, the standard regular expression engine.

- In SRE, fixed error with negative lookahead and lookbehind that
  manifested itself as a runtime error in patterns like "(?<!abc)(def)".

- Several bugs in the Unicode handling and error handling in _tkinter
  were fixed.

- Fix memory management errors in Merge() and Tkapp_Call() routines.

- Several changes were made to cStringIO to make it compatible with
  the file-like object interface and with StringIO.  If operations are
  performed on a closed object, an exception is raised.  The truncate
  method now accepts a position argument and readline accepts a size
  argument.

- There were many changes made to the linuxaudiodev module and its
  test suite; as a result, a short, unexpected audio sample should now
  play when the regression test is run.

  Note that this module is named poorly, because it should work
  correctly on any platform that supports the Open Sound System
  (OSS).

  The module now raises exceptions when errors occur instead of
  crashing.  It also defines the AFMT_A_LAW format (logarithmic A-law
  audio) and defines a getptr() method that calls the
  SNDCTL_DSP_GETxPTR ioctl defined in the OSS Programmer's Guide.

- The library_version attribute, introduced in an earlier beta, was
  removed because it can not be supported with early versions of the C
  readline library, which provides no way to determine the version at
  compile-time.

- The binascii module is now enabled on Win64.

- tokenize.py no longer suffers "recursion depth" errors when parsing
  programs with very long string literals.

Internals

- Fixed several buffer overflow vulnerabilities in calculate_path(),
  which is called when the interpreter starts up to determine where
  the standard library is installed.  These vulnerabilities affect all
  previous versions of Python and can be exploited by setting very
  long values for PYTHONHOME or argv[0].  The risk is greatest for a
  setuid Python script, although use of the wrapper in
  Misc/setuid-prog.c will eliminate the vulnerability.

- Fixed garbage collection bugs in instance creation that were
  triggered when errors occurred during initialization.  The solution,
  applied in cPickle and in PyInstance_New(), is to call
  PyObject_GC_Init() after the initialization of the object's
  container attributes is complete.

- pyexpat adds definitions of PyModule_AddStringConstant and
  PyModule_AddObject if the Python version is less than 2.0, which
  provides compatibility with PyXML on Python 1.5.2.

- If the platform has a bogus definition for LONG_BIT (the number of
  bits in a long), an error will be reported at compile time.

- Fix bugs in _PyTuple_Resize() which caused hard-to-interpret garbage
  collection crashes and possibly other, unreported crashes.

- Fixed a memory leak in _PyUnicode_Fini().

Build issues

- configure now accepts a --with-suffix option that specifies the
  executable suffix.  This is useful for builds on Cygwin and Mac OS
  X, for example.

- The mmap.PAGESIZE constant is now initialized using sysconf when
  possible, which eliminates a dependency on -lucb for Reliant UNIX.

- The md5 file should now compile on all platforms.

- The select module now compiles on platforms that do not define
  POLLRDNORM and related constants.

- Darwin (Mac OS X):  Initial support for static builds on this
  platform.

- BeOS: A number of changes were made to the build and installation
  process.  ar-fake now operates on a directory of object files.
  dl_export.h is gone, and its macros now appear on the mwcc command
  line during build on PPC BeOS.

- Platform directory in lib/python2.0 is "plat-beos5" (or
  "plat-beos4", if building on BeOS 4.5), rather than "plat-beos".

- Cygwin: Support for shared libraries, Tkinter, and sockets.

- SunOS 4.1.4_JL: Fix test for directory existence in configure.

Tools and other miscellany

- Removed debugging prints from main used with freeze.

- IDLE auto-indent no longer crashes when it encounters Unicode
  characters.

What's new in 2.0 beta 2 (since beta 1)?
========================================

Core language, builtins, and interpreter

- Add support for unbounded ints in %d,i,u,x,X,o formats; for example
  "%d" % 2L**64 == "18446744073709551616".

- Add -h and -V command line options to print the usage message and
  Python version number and exit immediately.

- eval() and exec accept Unicode objects as code parameters.

- getattr() and setattr() now also accept Unicode objects for the
  attribute name, which are converted to strings using the default
  encoding before lookup.

- Multiplication on string and Unicode now does proper bounds
  checking; e.g. 'a' * 65536 * 65536 will raise ValueError, "repeated
  string is too long."

- Better error message when continue is found in try statement in a
  loop.


Standard library and extensions

- socket module: the OpenSSL code now adds support for RAND_status()
  and EGD (Entropy Gathering Device).

- array: reverse() method of array now works.  buffer_info() now does
  argument checking; it still takes no arguments.

- asyncore/asynchat: Included most recent version from Sam Rushing.

- cgi: Accept '&' or ';' as separator characters when parsing form data.

- CGIHTTPServer: Now works on Windows (and perhaps even Mac).

- ConfigParser: When reading the file, options spelled in upper case
  letters are now correctly converted to lowercase.

- copy: Copy Unicode objects atomically.

- cPickle: Fail gracefully when copy_reg can't be imported.

- cStringIO: Implemented readlines() method.

- dbm: Add get() and setdefault() methods to dbm object.  Add constant
  `library' to module that names the library used.  Added doc strings
  and method names to error messages.  Uses configure to determine
  which ndbm.h file to include; Berkeley DB's nbdm and GDBM's ndbm is
  now available options.

- distutils: Update to version 0.9.3.

- dl: Add several dl.RTLD_ constants.

- fpectl: Now supported on FreeBSD.

- gc: Add DEBUG_SAVEALL option.  When enabled all garbage objects
  found by the collector will be saved in gc.garbage.  This is useful
  for debugging a program that creates reference cycles.

- httplib: Three changes: Restore support for set_debuglevel feature
  of HTTP class.  Do not close socket on zero-length response.  Do not
  crash when server sends invalid content-length header.

- mailbox: Mailbox class conforms better to qmail specifications.

- marshal: When reading a short, sign-extend on platforms where shorts
  are bigger than 16 bits.  When reading a long, repair the unportable
  sign extension that was being done for 64-bit machines.  (It assumed
  that signed right shift sign-extends.)

- operator: Add contains(), invert(), __invert__() as aliases for
  __contains__(), inv(), and __inv__() respectively.

- os: Add support for popen2() and popen3() on all platforms where
  fork() exists.  (popen4() is still in the works.)

- os: (Windows only:) Add startfile() function that acts like double-
  clicking on a file in Explorer (or passing the file name to the
  DOS "start" command).

- os.path: (Windows, DOS:) Treat trailing colon correctly in
  os.path.join.  os.path.join("a:", "b") yields "a:b".

- pickle: Now raises ValueError when an invalid pickle that contains
  a non-string repr where a string repr was expected.  This behavior
  matches cPickle.

- posixfile: Remove broken __del__() method.

- py_compile: support CR+LF line terminators in source file.

- readline: Does not immediately exit when ^C is hit when readline and
  threads are configured.  Adds definition of rl_library_version.  (The
  latter addition requires GNU readline 2.2 or later.)

- rfc822: Domain literals returned by AddrlistClass method
  getdomainliteral() are now properly wrapped in brackets.

- site: sys.setdefaultencoding() should only be called in case the
  standard default encoding ("ascii") is changed. This saves quite a
  few cycles during startup since the first call to
  setdefaultencoding() will initialize the codec registry and the
  encodings package.

- socket: Support for size hint in readlines() method of object returned
  by makefile().

- sre: Added experimental expand() method to match objects.  Does not
  use buffer interface on Unicode strings.  Does not hang if group id
  is followed by whitespace.

- StringIO: Size hint in readlines() is now supported as documented.

- struct: Check ranges for bytes and shorts.

- urllib: Improved handling of win32 proxy settings. Fixed quote and
  quote_plus functions so that the always encode a comma.

- Tkinter: Image objects are now guaranteed to have unique ids.  Set
  event.delta to zero if Tk version doesn't support mousewheel.
  Removed some debugging prints.

- UserList: now implements __contains__().

- webbrowser: On Windows, use os.startfile() instead of os.popen(),
  which works around a bug in Norton AntiVirus 2000 that leads directly
  to a Blue Screen freeze.

- xml: New version detection code allows PyXML to override standard
  XML package if PyXML version is greater than 0.6.1.

- xml.dom: DOM level 1 support for basic XML.  Includes xml.dom.minidom
  (conventional DOM), and xml.dom.pulldom, which allows building the DOM
  tree only for nodes which are sufficiently interesting to a specific
  application.  Does not provide the HTML-specific extensions.  Still
  undocumented.

- xml.sax: SAX 2 support for Python, including all the handler
  interfaces needed to process XML 1.0 compliant XML.  Some
  documentation is already available.

- pyexpat: Renamed to xml.parsers.expat since this is part of the new,
  packagized XML support.


C API

- Add three new convenience functions for module initialization --
  PyModule_AddObject(), PyModule_AddIntConstant(), and
  PyModule_AddStringConstant().

- Cleaned up definition of NULL in C source code; all definitions were
  removed and add #error to Python.h if NULL isn't defined after
  #include of stdio.h.

- Py_PROTO() macros that were removed in 2.0b1 have been restored for
  backwards compatibility (at the source level) with old extensions.

- A wrapper API was added for signal() and sigaction().  Instead of
  either function, always use PyOS_getsig() to get a signal handler
  and PyOS_setsig() to set one.  A new convenience typedef
  PyOS_sighandler_t is defined for the type of signal handlers.

- Add PyString_AsStringAndSize() function that provides access to the
  internal data buffer and size of a string object -- or the default
  encoded version of a Unicode object.

- PyString_Size() and PyString_AsString() accept Unicode objects.

- The standard header <limits.h> is now included by Python.h (if it
  exists).  INT_MAX and LONG_MAX will always be defined, even if
  <limits.h> is not available.

- PyFloat_FromString takes a second argument, pend, that was
  effectively useless.  It is now officially useless but preserved for
  backwards compatibility.  If the pend argument is not NULL, *pend is
  set to NULL.

- PyObject_GetAttr() and PyObject_SetAttr() now accept Unicode objects
  for the attribute name.  See note on getattr() above.

- A few bug fixes to argument processing for Unicode.
  PyArg_ParseTupleAndKeywords() now accepts "es#" and "es".
  PyArg_Parse() special cases "s#" for Unicode objects; it returns a
  pointer to the default encoded string data instead of to the raw
  UTF-16.

- Py_BuildValue accepts B format (for bgen-generated code).


Internals

- On Unix, fix code for finding Python installation directory so that
  it works when argv[0] is a relative path.

- Added a true unicode_internal_encode() function and fixed the
  unicode_internal_decode function() to support Unicode objects directly
  rather than by generating a copy of the object.

- Several of the internal Unicode tables are much smaller now, and
  the source code should be much friendlier to weaker compilers.

- In the garbage collector: Fixed bug in collection of tuples.  Fixed
  bug that caused some instances to be removed from the container set
  while they were still live.  Fixed parsing in gc.set_debug() for
  platforms where sizeof(long) > sizeof(int).

- Fixed refcount problem in instance deallocation that only occurred
  when Py_REF_DEBUG was defined and Py_TRACE_REFS was not.

- On Windows, getpythonregpath is now protected against null data in
  registry key.

- On Unix, create .pyc/.pyo files with O_EXCL flag to avoid a race
  condition.


Build and platform-specific issues

- Better support of GNU Pth via --with-pth configure option.

- Python/C API now properly exposed to dynamically-loaded extension
  modules on Reliant UNIX.

- Changes for the benefit of SunOS 4.1.4 (really!).  mmapmodule.c:
  Don't define MS_SYNC to be zero when it is undefined.  Added missing
  prototypes in posixmodule.c.

- Improved support for HP-UX build.  Threads should now be correctly
  configured (on HP-UX 10.20 and 11.00).

- Fix largefile support on older NetBSD systems and OpenBSD by adding
  define for TELL64.


Tools and other miscellany

- ftpmirror: Call to main() is wrapped in if __name__ == "__main__".

- freeze: The modulefinder now works with 2.0 opcodes.

- IDLE:
  Move hackery of sys.argv until after the Tk instance has been
  created, which allows the application-specific Tkinter
  initialization to be executed if present; also pass an explicit
  className parameter to the Tk() constructor.


What's new in 2.0 beta 1?
=========================

Source Incompatibilities
------------------------

None.  Note that 1.6 introduced several incompatibilities with 1.5.2,
such as single-argument append(), connect() and bind(), and changes to
str(long) and repr(float).


Binary Incompatibilities
------------------------

- Third party extensions built for Python 1.5.x or 1.6 cannot be used
with Python 2.0; these extensions will have to be rebuilt for Python
2.0.

- On Windows, attempting to import a third party extension built for
Python 1.5.x or 1.6 results in an immediate crash; there's not much we
can do about this.  Check your PYTHONPATH environment variable!

- Python bytecode files (*.pyc and *.pyo) are not compatible between
releases.


Overview of Changes Since 1.6
-----------------------------

There are many new modules (including brand new XML support through
the xml package, and i18n support through the gettext module); a list
of all new modules is included below.  Lots of bugs have been fixed.

The process for making major new changes to the language has changed
since Python 1.6.  Enhancements must now be documented by a Python
Enhancement Proposal (PEP) before they can be accepted.

There are several important syntax enhancements, described in more
detail below:

  - Augmented assignment, e.g. x += 1

  - List comprehensions, e.g. [x**2 for x in range(10)]

  - Extended import statement, e.g. import Module as Name

  - Extended print statement, e.g. print >> file, "Hello"

Other important changes:

  - Optional collection of cyclical garbage

Python Enhancement Proposal (PEP)
---------------------------------

PEP stands for Python Enhancement Proposal.  A PEP is a design
document providing information to the Python community, or describing
a new feature for Python.  The PEP should provide a concise technical
specification of the feature and a rationale for the feature.

We intend PEPs to be the primary mechanisms for proposing new
features, for collecting community input on an issue, and for
documenting the design decisions that have gone into Python.  The PEP
author is responsible for building consensus within the community and
documenting dissenting opinions.

The PEPs are available at http://python.sourceforge.net/peps/.

Augmented Assignment
--------------------

This must have been the most-requested feature of the past years!
Eleven new assignment operators were added:

    += -= *= /= %= **= <<= >>= &= ^= |=

For example,

    A += B

is similar to

    A = A + B

except that A is evaluated only once (relevant when A is something
like dict[index].attr).

However, if A is a mutable object, A may be modified in place.  Thus,
if A is a number or a string, A += B has the same effect as A = A+B
(except A is only evaluated once); but if a is a list, A += B has the
same effect as A.extend(B)!

Classes and built-in object types can override the new operators in
order to implement the in-place behavior; the not-in-place behavior is
used automatically as a fallback when an object doesn't implement the
in-place behavior.  For classes, the method name is derived from the
method name for the corresponding not-in-place operator by inserting
an 'i' in front of the name, e.g. __iadd__ implements in-place
__add__.

Augmented assignment was implemented by Thomas Wouters.


List Comprehensions
-------------------

This is a flexible new notation for lists whose elements are computed
from another list (or lists).  The simplest form is:

    [<expression> for <variable> in <sequence>]

For example, [i**2 for i in range(4)] yields the list [0, 1, 4, 9].
This is more efficient than a for loop with a list.append() call.

You can also add a condition:

    [<expression> for <variable> in <sequence> if <condition>]

For example, [w for w in words if w == w.lower()] would yield the list
of words that contain no uppercase characters.  This is more efficient
than a for loop with an if statement and a list.append() call.

You can also have nested for loops and more than one 'if' clause.  For
example, here's a function that flattens a sequence of sequences::

    def flatten(seq):
        return [x for subseq in seq for x in subseq]

    flatten([[0], [1,2,3], [4,5], [6,7,8,9], []])

This prints

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

List comprehensions originated as a patch set from Greg Ewing; Skip
Montanaro and Thomas Wouters also contributed.  Described by PEP 202.


Extended Import Statement
-------------------------

Many people have asked for a way to import a module under a different
name.  This can be accomplished like this:

    import foo
    bar = foo
    del foo

but this common idiom gets old quickly.  A simple extension of the
import statement now allows this to be written as follows:

    import foo as bar

There's also a variant for 'from ... import':

    from foo import bar as spam

This also works with packages; e.g. you can write this:

    import test.regrtest as regrtest

Note that 'as' is not a new keyword -- it is recognized only in this
context (this is only possible because the syntax for the import
statement doesn't involve expressions).

Implemented by Thomas Wouters.  Described by PEP 221.


Extended Print Statement
------------------------

Easily the most controversial new feature, this extension to the print
statement adds an option to make the output go to a different file
than the default sys.stdout.

For example, to write an error message to sys.stderr, you can now
write:

    print >> sys.stderr, "Error: bad dog!"

As a special feature, if the expression used to indicate the file
evaluates to None, the current value of sys.stdout is used.  Thus:

    print >> None, "Hello world"

is equivalent to

    print "Hello world"

Design and implementation by Barry Warsaw.  Described by PEP 214.


Optional Collection of Cyclical Garbage
---------------------------------------

Python is now equipped with a garbage collector that can hunt down
cyclical references between Python objects.  It's no replacement for
reference counting; in fact, it depends on the reference counts being
correct, and decides that a set of objects belong to a cycle if all
their reference counts can be accounted for from their references to
each other.  This devious scheme was first proposed by Eric Tiedemann,
and brought to implementation by Neil Schemenauer.

There's a module "gc" that lets you control some parameters of the
garbage collection.  There's also an option to the configure script
that lets you enable or disable the garbage collection.  In 2.0b1,
it's on by default, so that we (hopefully) can collect decent user
experience with this new feature.  There are some questions about its
performance.  If it proves to be too much of a problem, we'll turn it
off by default in the final 2.0 release.


Smaller Changes
---------------

A new function zip() was added.  zip(seq1, seq2, ...) is equivalent to
map(None, seq1, seq2, ...) when the sequences have the same length;
i.e. zip([1,2,3], [10,20,30]) returns [(1,10), (2,20), (3,30)].  When
the lists are not all the same length, the shortest list wins:
zip([1,2,3], [10,20]) returns [(1,10), (2,20)].  See PEP 201.

sys.version_info is a tuple (major, minor, micro, level, serial).

Dictionaries have an odd new method, setdefault(key, default).
dict.setdefault(key, default) returns dict[key] if it exists; if not,
it sets dict[key] to default and returns that value.  Thus:

    dict.setdefault(key, []).append(item)

does the same work as this common idiom:

    if not dict.has_key(key):
        dict[key] = []
    dict[key].append(item)

There are two new variants of SyntaxError that are raised for
indentation-related errors: IndentationError and TabError.

Changed \x to consume exactly two hex digits; see PEP 223.  Added \U
escape that consumes exactly eight hex digits.

The limits on the size of expressions and file in Python source code
have been raised from 2**16 to 2**32.  Previous versions of Python
were limited because the maximum argument size the Python VM accepted
was 2**16.  This limited the size of object constructor expressions,
e.g. [1,2,3] or {'a':1, 'b':2}, and the size of source files.  This
limit was raised thanks to a patch by Charles Waldman that effectively
fixes the problem.  It is now much more likely that you will be
limited by available memory than by an arbitrary limit in Python.

The interpreter's maximum recursion depth can be modified by Python
programs using sys.getrecursionlimit and sys.setrecursionlimit.  This
limit is the maximum number of recursive calls that can be made by
Python code.  The limit exists to prevent infinite recursion from
overflowing the C stack and causing a core dump.  The default value is
1000.  The maximum safe value for a particular platform can be found
by running Tools/scripts/find_recursionlimit.py.

New Modules and Packages
------------------------

atexit - for registering functions to be called when Python exits.

imputil - Greg Stein's alternative API for writing custom import
hooks.

pyexpat - an interface to the Expat XML parser, contributed by Paul
Prescod.

xml - a new package with XML support code organized (so far) in three
subpackages: xml.dom, xml.sax, and xml.parsers.  Describing these
would fill a volume.  There's a special feature whereby a
user-installed package named _xmlplus overrides the standard
xmlpackage; this is intended to give the XML SIG a hook to distribute
backwards-compatible updates to the standard xml package.

webbrowser - a platform-independent API to launch a web browser.


Changed Modules
---------------

array -- new methods for array objects: count, extend, index, pop, and
remove

binascii -- new functions b2a_hex and a2b_hex that convert between
binary data and its hex representation

calendar -- Many new functions that support features including control
over which day of the week is the first day, returning strings instead
of printing them.  Also new symbolic constants for days of week,
e.g. MONDAY, ..., SUNDAY.

cgi -- FieldStorage objects have a getvalue method that works like a
dictionary's get method and returns the value attribute of the object.

ConfigParser -- The parser object has new methods has_option,
remove_section, remove_option, set, and write.  They allow the module
to be used for writing config files as well as reading them.

ftplib -- ntransfercmd(), transfercmd(), and retrbinary() all now
optionally support the RFC 959 REST command.

gzip -- readline and readlines now accept optional size arguments

httplib -- New interfaces and support for HTTP/1.1 by Greg Stein.  See
the module doc strings for details.

locale -- implement getdefaultlocale for Win32 and Macintosh

marshal -- no longer dumps core when marshaling deeply nested or
recursive data structures

os -- new functions isatty, seteuid, setegid, setreuid, setregid

os/popen2 -- popen2/popen3/popen4 support under Windows.  popen2/popen3
support under Unix.

os/pty -- support for openpty and forkpty

os.path -- fix semantics of os.path.commonprefix

smtplib -- support for sending very long messages

socket -- new function getfqdn()

readline -- new functions to read, write and truncate history files.
The readline section of the library reference manual contains an
example.

select -- add interface to poll system call

shutil -- new copyfileobj function

SimpleHTTPServer, CGIHTTPServer -- Fix problems with buffering in the
HTTP server.

Tkinter -- optimization of function flatten

urllib -- scans environment variables for proxy configuration,
e.g. http_proxy.

whichdb -- recognizes dumbdbm format


Obsolete Modules
----------------

None.  However note that 1.6 made a whole slew of modules obsolete:
stdwin, soundex, cml, cmpcache, dircache, dump, find, grep, packmail,
poly, zmod, strop, util, whatsound.


Changed, New, Obsolete Tools
----------------------------

None.


C-level Changes
---------------

Several cleanup jobs were carried out throughout the source code.

All C code was converted to ANSI C; we got rid of all uses of the
Py_PROTO() macro, which makes the header files a lot more readable.

Most of the portability hacks were moved to a new header file,
pyport.h; several other new header files were added and some old
header files were removed, in an attempt to create a more rational set
of header files.  (Few of these ever need to be included explicitly;
they are all included by Python.h.)

Trent Mick ensured portability to 64-bit platforms, under both Linux
and Win64, especially for the new Intel Itanium processor.  Mick also
added large file support for Linux64 and Win64.

The C APIs to return an object's size have been update to consistently
use the form PyXXX_Size, e.g. PySequence_Size and PyDict_Size.  In
previous versions, the abstract interfaces used PyXXX_Length and the
concrete interfaces used PyXXX_Size.  The old names,
e.g. PyObject_Length, are still available for backwards compatibility
at the API level, but are deprecated.

The PyOS_CheckStack function has been implemented on Windows by
Fredrik Lundh.  It prevents Python from failing with a stack overflow
on Windows.

The GC changes resulted in creation of two new slots on object,
tp_traverse and tp_clear.  The augmented assignment changes result in
the creation of a new slot for each in-place operator.

The GC API creates new requirements for container types implemented in
C extension modules.  See Include/objimpl.h for details.

PyErr_Format has been updated to automatically calculate the size of
the buffer needed to hold the formatted result string.  This change
prevents crashes caused by programmer error.

New C API calls: PyObject_AsFileDescriptor, PyErr_WriteUnraisable.

PyRun_AnyFileEx, PyRun_SimpleFileEx, PyRun_FileEx -- New functions
that are the same as their non-Ex counterparts except they take an
extra flag argument that tells them to close the file when done.

XXX There were other API changes that should be fleshed out here.


Windows Changes
---------------

New popen2/popen3/peopen4 in os module (see Changed Modules above).

os.popen is much more usable on Windows 95 and 98.  See Microsoft
Knowledge Base article Q150956.  The Win9x workaround described there
is implemented by the new w9xpopen.exe helper in the root of your
Python installation.  Note that Python uses this internally; it is not
a standalone program.

Administrator privileges are no longer required to install Python
on Windows NT or Windows 2000.  If you have administrator privileges,
Python's registry info will be written under HKEY_LOCAL_MACHINE.
Otherwise the installer backs off to writing Python's registry info
under HKEY_CURRENT_USER.  The latter is sufficient for all "normal"
uses of Python, but will prevent some advanced uses from working
(for example, running a Python script as an NT service, or possibly
from CGI).

[This was new in 1.6] The installer no longer runs a separate Tcl/Tk
installer; instead, it installs the needed Tcl/Tk files directly in the
Python directory.  If you already have a Tcl/Tk installation, this
wastes some disk space (about 4 Megs) but avoids problems with
conflicting Tcl/Tk installations, and makes it much easier for Python
to ensure that Tcl/Tk can find all its files.

[This was new in 1.6] The Windows installer now installs by default in
\Python20\ on the default volume, instead of \Program Files\Python-2.0\.


Updates to the changes between 1.5.2 and 1.6
--------------------------------------------

The 1.6 NEWS file can't be changed after the release is done, so here
is some late-breaking news:

New APIs in locale.py: normalize(), getdefaultlocale(), resetlocale(),
and changes to getlocale() and setlocale().

The new module is now enabled per default.

It is not true that the encodings codecs cannot be used for normal
strings: the string.encode() (which is also present on 8-bit strings
!) allows using them for 8-bit strings too, e.g. to convert files from
cp1252 (Windows) to latin-1 or vice-versa.

Japanese codecs are available from Tamito KAJIYAMA:
http://pseudo.grad.sccs.chukyo-u.ac.jp/~kajiyama/python/


======================================================================


=======================================
==> Release 1.6 (September 5, 2000) <==
=======================================

What's new in release 1.6?
==========================

Below is a list of all relevant changes since release 1.5.2.


Source Incompatibilities
------------------------

Several small incompatible library changes may trip you up:

  - The append() method for lists can no longer be invoked with more
  than one argument.  This used to append a single tuple made out of
  all arguments, but was undocumented.  To append a tuple, use
  e.g. l.append((a, b, c)).

  - The connect(), connect_ex() and bind() methods for sockets require
  exactly one argument.  Previously, you could call s.connect(host,
  port), but this was undocumented. You must now write
  s.connect((host, port)).

  - The str() and repr() functions are now different more often.  For
  long integers, str() no longer appends a 'L'.  Thus, str(1L) == '1',
  which used to be '1L'; repr(1L) is unchanged and still returns '1L'.
  For floats, repr() now gives 17 digits of precision, to ensure no
  precision is lost (on all current hardware).

  - The -X option is gone.  Built-in exceptions are now always
  classes.  Many more library modules also have been converted to
  class-based exceptions.


Binary Incompatibilities
------------------------

- Third party extensions built for Python 1.5.x cannot be used with
Python 1.6; these extensions will have to be rebuilt for Python 1.6.

- On Windows, attempting to import a third party extension built for
Python 1.5.x results in an immediate crash; there's not much we can do
about this.  Check your PYTHONPATH environment variable!


Overview of Changes since 1.5.2
-------------------------------

For this overview, I have borrowed from the document "What's New in
Python 2.0" by Andrew Kuchling and Moshe Zadka:
http://www.amk.ca/python/2.0/ .

There are lots of new modules and lots of bugs have been fixed.  A
list of all new modules is included below.

Probably the most pervasive change is the addition of Unicode support.
We've added a new fundamental datatype, the Unicode string, a new
build-in function unicode(), an numerous C APIs to deal with Unicode
and encodings.  See the file Misc/unicode.txt for details, or
http://starship.python.net/crew/lemburg/unicode-proposal.txt.

Two other big changes, related to the Unicode support, are the
addition of string methods and (yet another) new regular expression
engine.

  - String methods mean that you can now say s.lower() etc. instead of
  importing the string module and saying string.lower(s) etc.  One
  peculiarity is that the equivalent of string.join(sequence,
  delimiter) is delimiter.join(sequence).  Use " ".join(sequence) for
  the effect of string.join(sequence); to make this more readable, try
  space=" " first.  Note that the maxsplit argument defaults in
  split() and replace() have changed from 0 to -1.

  - The new regular expression engine, SRE by Fredrik Lundh, is fully
  backwards compatible with the old engine, and is in fact invoked
  using the same interface (the "re" module).  You can explicitly
  invoke the old engine by import pre, or the SRE engine by importing
  sre.  SRE is faster than pre, and supports Unicode (which was the
  main reason to put effort in yet another new regular expression
  engine -- this is at least the fourth!).


Other Changes
-------------

Other changes that won't break code but are nice to know about:

Deleting objects is now safe even for deeply nested data structures.

Long/int unifications: long integers can be used in seek() calls, as
slice indexes.

String formatting (s % args) has a new formatting option, '%r', which
acts like '%s' but inserts repr(arg) instead of str(arg). (Not yet in
alpha 1.)

Greg Ward's "distutils" package is included: this will make
installing, building and distributing third party packages much
simpler.

There's now special syntax that you can use instead of the apply()
function.  f(*args, **kwds) is equivalent to apply(f, args, kwds).
You can also use variations f(a1, a2, *args, **kwds) and you can leave
one or the other out: f(*args), f(**kwds).

The built-ins int() and long() take an optional second argument to
indicate the conversion base -- of course only if the first argument
is a string.  This makes string.atoi() and string.atol() obsolete.
(string.atof() was already obsolete).

When a local variable is known to the compiler but undefined when
used, a new exception UnboundLocalError is raised.  This is a class
derived from NameError so code catching NameError should still work.
The purpose is to provide better diagnostics in the following example:
  x = 1
  def f():
      print x
      x = x+1
This used to raise a NameError on the print statement, which confused
even experienced Python programmers (especially if there are several
hundreds of lines of code between the reference and the assignment to
x :-).

You can now override the 'in' operator by defining a __contains__
method.  Note that it has its arguments backwards: x in a causes
a.__contains__(x) to be called.  That's why the name isn't __in__.

The exception AttributeError will have a more friendly error message,
e.g.: <code>'Spam' instance has no attribute 'eggs'</code>.  This may
<b>break code</b> that expects the message to be exactly the attribute
name.


New Modules in 1.6
------------------

UserString - base class for deriving from the string type.

distutils - tools for distributing Python modules.

robotparser - parse a robots.txt file, for writing web spiders.
(Moved from Tools/webchecker/.)

linuxaudiodev - audio for Linux.

mmap - treat a file as a memory buffer.  (Windows and Unix.)

sre - regular expressions (fast, supports unicode).  Currently, this
code is very rough.  Eventually, the re module will be reimplemented
using sre (without changes to the re API).

filecmp - supersedes the old cmp.py and dircmp.py modules.

tabnanny - check Python sources for tab-width dependance.  (Moved from
Tools/scripts/.)

urllib2 - new and improved but incompatible version of urllib (still
experimental).

zipfile - read and write zip archives.

codecs - support for Unicode encoders/decoders.

unicodedata - provides access to the Unicode 3.0 database.

_winreg - Windows registry access.

encodings - package which provides a large set of standard codecs --
currently only for the new Unicode support. It has a drop-in extension
mechanism which allows you to add new codecs by simply copying them
into the encodings package directory. Asian codec support will
probably be made available as separate distribution package built upon
this technique and the new distutils package.


Changed Modules
---------------

readline, ConfigParser, cgi, calendar, posix, readline, xmllib, aifc,
chunk, wave, random, shelve, nntplib - minor enhancements.

socket, httplib, urllib - optional OpenSSL support (Unix only).

_tkinter - support for 8.0 up to 8.3.  Support for versions older than
8.0 has been dropped.

string - most of this module is deprecated now that strings have
methods.  This no longer uses the built-in strop module, but takes
advantage of the new string methods to provide transparent support for
both Unicode and ordinary strings.


Changes on Windows
------------------

The installer no longer runs a separate Tcl/Tk installer; instead, it
installs the needed Tcl/Tk files directly in the Python directory.  If
you already have a Tcl/Tk installation, this wastes some disk space
(about 4 Megs) but avoids problems with conflincting Tcl/Tk
installations, and makes it much easier for Python to ensure that
Tcl/Tk can find all its files.  Note: the alpha installers don't
include the documentation.

The Windows installer now installs by default in \Python16\ on the
default volume, instead of \Program Files\Python-1.6\.


Changed Tools
-------------

IDLE - complete overhaul.  See the <a href="../idle/">IDLE home
page</a> for more information.  (Python 1.6 alpha 1 will come with
IDLE 0.6.)

Tools/i18n/pygettext.py - Python equivalent of xgettext(1).  A message
text extraction tool used for internationalizing applications written
in Python.


Obsolete Modules
----------------

stdwin and everything that uses it.  (Get Python 1.5.2 if you need
it. :-)

soundex.  (Skip Montanaro has a version in Python but it won't be
included in the Python release.)

cmp, cmpcache, dircmp.  (Replaced by filecmp.)

dump.  (Use pickle.)

find.  (Easily coded using os.walk().)

grep.  (Not very useful as a library module.)

packmail.  (No longer has any use.)

poly, zmod.  (These were poor examples at best.)

strop.  (No longer needed by the string module.)

util.  (This functionality was long ago built in elsewhere).

whatsound.  (Use sndhdr.)


Detailed Changes from 1.6b1 to 1.6
----------------------------------

- Slight changes to the CNRI license.  A copyright notice has been
added; the requirement to indicate the nature of modifications now
applies when making a derivative work available "to others" instead of
just "to the public"; the version and date are updated.  The new
license has a new handle.

- Added the Tools/compiler package.  This is a project led by Jeremy
Hylton to write the Python bytecode generator in Python.

- The function math.rint() is removed.

- In Python.h, "#define _GNU_SOURCE 1" was added.

- Version 0.9.1 of Greg Ward's distutils is included (instead of
version 0.9).

- A new version of SRE is included.  It is more stable, and more
compatible with the old RE module.  Non-matching ranges are indicated
by -1, not None.  (The documentation said None, but the PRE
implementation used -1; changing to None would break existing code.)

- The winreg module has been renamed to _winreg.  (There are plans for
a higher-level API called winreg, but this has not yet materialized in
a form that is acceptable to the experts.)

- The _locale module is enabled by default.

- Fixed the configuration line for the _curses module.

- A few crashes have been fixed, notably <file>.writelines() with a
list containing non-string objects would crash, and there were
situations where a lost SyntaxError could dump core.

- The <list>.extend() method now accepts an arbitrary sequence
argument.

- If __str__() or __repr__() returns a Unicode object, this is
converted to an 8-bit string.

- Unicode string comparisons is no longer aware of UTF-16
encoding peculiarities; it's a straight 16-bit compare.

- The Windows installer now installs the LICENSE file and no longer
registers the Python DLL version in the registry (this is no longer
needed).  It now uses Tcl/Tk 8.3.2.

- A few portability problems have been fixed, in particular a
compilation error involving socklen_t.

- The PC configuration is slightly friendlier to non-Microsoft
compilers.


======================================================================


======================================
==> Release 1.5.2 (April 13, 1999) <==
======================================

From 1.5.2c1 to 1.5.2 (final)
=============================

Tue Apr 13 15:44:49 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse: Bump version to 1.5.2 (final)

	* PCbuild/python15.dsp: Added shamodule.c

	* PC/config.c: Added sha module!

	* README, Include/patchlevel.h: Prepare for final release.

	* Misc/ACKS:
	More (Cameron Laird is honorary; the others are 1.5.2c1 testers).

	* Python/thread_solaris.h:
	While I can't really test this thoroughly, Pat Knight and the Solaris
	man pages suggest that the proper thing to do is to add THR_NEW_LWP to
	the flags on thr_create(), and that there really isn't a downside, so
	I'll do that.

	* Misc/ACKS:
	Bunch of new names who helped iron out the last wrinkles of 1.5.2.

	* PC/python_nt.rc:
	Bump the myusterious M$ version number from 1,5,2,1 to 1,5,2,3.
	(I can't even display this on NT, maybe Win/98 can?)

	* Lib/pstats.py:
	Fix mysterious references to jprofile that were in the source since
	its creation.  I'm assuming these were once valid references to "Jim
	Roskind's profile"...

	* Lib/Attic/threading_api.py:
	Removed; since long subsumed in Doc/lib/libthreading.tex

	* Modules/socketmodule.c:
	Put back __osf__ support for gethostbyname_r(); the real bug was that
	it was being used even without threads.  This of course might be an
	all-platform problem so now we only use the _r variant when we are
	using threads.

Mon Apr 12 22:51:20 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/cPickle.c:
	Fix accidentally reversed NULL test in load_mark().  Suggested by
	Tamito Kajiyama.  (This caused a bug only on platforms where malloc(0)
	returns NULL.)

	* README:
	Add note about popen2 problem on Linux noticed by Pablo Bleyer.

	* README: Add note about -D_REENTRANT for HP-UX 10.20.

	* Modules/Makefile.pre.in: 'clean' target should remove hassignal.

	* PC/Attic/vc40.mak, PC/readme.txt:
	Remove all VC++ info (except VC 1.5) from readme.txt;
	remove the VC++ 4.0 project file; remove the unused _tkinter extern defs.

	* README: Clarify PC build instructions (point to PCbuild).

	* Modules/zlibmodule.c: Cast added by Jack Jansen (for Mac port).

	* Lib/plat-sunos5/CDIO.py, Lib/plat-linux2/CDROM.py:
	Forgot to add this file.  CDROM device parameters.

	* Lib/gzip.py: Two different changes.

	1. Jack Jansen reports that on the Mac, the time may be negative, and
	solves this by adding a write32u() function that writes an unsigned
	long.

	2. On 64-bit platforms the CRC comparison fails; I've fixed this by
	casting both values to be compared to "unsigned long" i.e. modulo
	0x100000000L.

Sat Apr 10 18:42:02 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PC/Attic/_tkinter.def: No longer needed.

	* Misc/ACKS: Correct missed character in Andrew Dalke's name.

	* README: Add DEC Ultrix notes (from Donn Cave's email).

	* configure: The usual

	* configure.in:
	Quote a bunch of shell variables used in test, related to long-long.

	* Objects/fileobject.c, Modules/shamodule.c, Modules/regexpr.c:
	casts for picky compilers.

	* Modules/socketmodule.c:
	3-arg gethostbyname_r doesn't really work on OSF/1.

	* PC/vc15_w31/_.c, PC/vc15_lib/_.c, Tools/pynche/__init__.py:
	Avoid totally empty files.

Fri Apr  9 14:56:35 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/fixps.py: Use re instead of regex.
	Don't rewrite the file in place.
	(Reported by Andy Dustman.)

	* Lib/netrc.py, Lib/shlex.py: Get rid of #! line

Thu Apr  8 23:13:37 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse: Use the Tcl 8.0.5 installer.
	Add a variable %_TCL_% that makes it easier to switch to a different version.


======================================================================


From 1.5.2b2 to 1.5.2c1
=======================

Thu Apr  8 23:13:37 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse:
	Release 1.5.2c1.  Add IDLE and Uninstall to program group.
	Don't distribute zlib.dll.  Tweak some comments.

	* PCbuild/zlib.dsp: Now using static zlib 1.1.3

	* Lib/dos-8x3/userdict.py, Lib/dos-8x3/userlist.py, Lib/dos-8x3/test_zli.py, Lib/dos-8x3/test_use.py, Lib/dos-8x3/test_pop.py, Lib/dos-8x3/test_pic.py, Lib/dos-8x3/test_ntp.py, Lib/dos-8x3/test_gzi.py, Lib/dos-8x3/test_fcn.py, Lib/dos-8x3/test_cpi.py, Lib/dos-8x3/test_bsd.py, Lib/dos-8x3/posixfil.py, Lib/dos-8x3/mimetype.py, Lib/dos-8x3/nturl2pa.py, Lib/dos-8x3/compilea.py, Lib/dos-8x3/exceptio.py, Lib/dos-8x3/basehttp.py:
	The usual

	* Include/patchlevel.h: Release 1.5.2c1

	* README: Release 1.5.2c1.

	* Misc/NEWS: News for the 1.5.2c1 release.

	* Lib/test/test_strftime.py:
	On Windows, we suddenly find, strftime() may return "" for an
	unsupported format string.  (I guess this is because the logic for
	deciding whether to reallocate the buffer or not has been improved.)
	This caused the test code to crash on result[0].  Fix this by assuming
	an empty result also means the format is not supported.

	* Demo/tkinter/matt/window-creation-w-location.py:
	This demo imported some private code from Matt.  Make it cripple along.

	* Lib/lib-tk/Tkinter.py:
	Delete an accidentally checked-in feature that actually broke more
	than was worth it: when deleting a canvas item, it would try to
	automatically delete the bindings for that item.  Since there's
	nothing that says you can't reuse the tag and still have the bindings,
	this is not correct.  Also, it broke at least one demo
	(Demo/tkinter/matt/rubber-band-box-demo-1.py).

	* Python/thread_wince.h: Win/CE thread support by Mark Hammond.

Wed Apr  7 20:23:17 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Patch by Andrew Kuchling to unflush() (flush() for deflating).
	Without this, if inflate() returned Z_BUF_ERROR asking for more output
	space, we would report the error; now, we increase the buffer size and
	try again, just as for Z_OK.

	* Lib/test/test_gzip.py: Use binary mode for all gzip files we open.

	* Tools/idle/ChangeLog: New change log.

	* Tools/idle/README.txt, Tools/idle/NEWS.txt: New version.

	* Python/pythonrun.c:
	Alas, get rid of the Win specific hack to ask the user to press Return
	before exiting when an error happened.  This didn't work right when
	Python is invoked from a daemon.

	* Tools/idle/idlever.py: Version bump awaiting impending new release.
	(Not much has changed :-( )

	* Lib/lib-tk/Tkinter.py:
	lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
	so the preferred name for them is tag_lower, tag_raise
	(similar to tag_bind, and similar to the Text widget);
	unfortunately can't delete the old ones yet (maybe in 1.6)

	* Python/thread.c, Python/strtod.c, Python/mystrtoul.c, Python/import.c, Python/ceval.c:
	Changes by Mark Hammond for Windows CE.  Mostly of the form
	  #ifdef DONT_HAVE_header_H ... #endif around #include <header.h>.

	* Python/bltinmodule.c:
	Remove unused variable from complex_from_string() code.

	* Include/patchlevel.h:
	Add the possibility of a gamma release (release candidate).
	Add '+' to string version number to indicate we're beyond b2 now.

	* Modules/posixmodule.c: Add extern decl for fsync() for SunOS 4.x.

	* Lib/smtplib.py: Changes by Per Cederquist and The Dragon.

	Per writes:

	"""
	The application where Signum Support uses smtplib needs to be able to
	report good error messages to the user when sending email fails.  To
	help in diagnosing problems it is useful to be able to report the
	entire message sent by the server, not only the SMTP error code of the
	offending command.

	A lot of the functions in sendmail.py unfortunately discards the
	message, leaving only the code.  The enclosed patch fixes that
	problem.

	The enclosed patch also introduces a base class for exceptions that
	include an SMTP error code and error message, and make the code and
	message available on separate attributes, so that surrounding code can
	deal with them in whatever way it sees fit.  I've also added some
	documentation to the exception classes.

	The constructor will now raise an exception if it cannot connect to
	the SMTP server.

	The data() method will raise an SMTPDataError if it doesn't receive
	the expected 354 code in the middle of the exchange.

	According to section 5.2.10 of RFC 1123 a smtp client must accept "any
	text, including no text at all" after the error code.  If the response
	of a HELO command contains no text self.helo_resp will be set to the
	empty string ("").  The patch fixes the test in the sendmail() method
	so that helo_resp is tested against None; if it has the empty string
	as value the sendmail() method would invoke the helo() method again.

	The code no longer accepts a -1 reply from the ehlo() method in
	sendmail().

	[Text about removing SMTPRecipientsRefused deleted --GvR]
	"""

	and also:

	"""
	smtplib.py appends an extra blank line to the outgoing mail if the
	`msg' argument to the sendmail method already contains a trailing
	newline.  This patch should fix the problem.
	"""

	The Dragon writes:

	"""
		Mostly I just re-added the SMTPRecipientsRefused exception
	(the exeption object now has the appropriate info in it ) [Per had
	removed this in his patch --GvR] and tweaked the behavior of the
	sendmail method whence it throws the newly added SMTPHeloException (it
	was closing the connection, which it shouldn't.  whatever catches the
	exception should do that. )

		I pondered the change of the return values to tuples all around,
	and after some thinking I decided that regularizing the return values was
	too much of the Right Thing (tm) to not do.

		My one concern is that code expecting an integer & getting a tuple
	may fail silently.

	(i.e. if it's doing :

	      x.somemethod() >= 400:
	expecting an integer, the expression will always be true if it gets a
	tuple instead. )

		However, most smtplib code I've seen only really uses the
	sendmail() method, so this wouldn't bother it.  Usually code I've seen
	that calls the other methods usually only calls helo() and ehlo() for
	doing ESMTP, a feature which was not in the smtplib included with 1.5.1,
	and thus I would think not much code uses it yet.
	"""

Tue Apr  6 19:38:18 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_ntpath.py:
	Fix the tests now that splitdrive() no longer treats UNC paths special.
	(Some tests converted to splitunc() tests.)

	* Lib/ntpath.py:
	Withdraw the UNC support from splitdrive().  Instead, a new function
	splitunc() parses UNC paths.  The contributor of the UNC parsing in
	splitdrive() doesn't like it, but I haven't heard a good reason to
	keep it, and it causes some problems.  (I think there's a
	philosophical problem -- to me, the split*() functions are purely
	syntactical, and the fact that \\foo is not a valid path doesn't mean
	that it shouldn't be considered an absolute path.)

	Also (quite separately, but strangely related to the philosophical
	issue above) fix abspath() so that if win32api exists, it doesn't fail
	when the path doesn't actually exist -- if GetFullPathName() fails,
	fall back on the old strategy (join with getcwd() if necessary, and
	then use normpath()).

	* configure.in, configure, config.h.in, acconfig.h:
	For BeOS PowerPC.  Chris Herborth.

Mon Apr  5 21:54:14 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/timemodule.c:
	Jonathan Giddy notes, and Chris Lawrence agrees, that some comments on
	#else/#endif are wrong, and that #if HAVE_TM_ZONE should be #ifdef.

	* Misc/ACKS:
	Bunch of new contributors, including 9 who contributed to the Docs,
	reported by Fred.

Mon Apr  5 18:37:59 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/gzip.py:
	Oops, missed mode parameter to open().

	* Lib/gzip.py:
	Made the default mode 'rb' instead of 'r', for better cross-platform
	support.  (Based on comment on the documentation by Bernhard Reiter
	<bernhard@csd.uwm.edu>).

Fri Apr  2 22:18:25 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/dutree.py:
	For reasons I dare not explain, this script should always execute
	main() when imported (in other words, it is not usable as a module).

Thu Apr  1 15:32:30 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_cpickle.py: Jonathan Giddy write:

	In test_cpickle.py, the module os got imported, but the line to remove
	the temp file has gone missing.

Tue Mar 30 20:17:31 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/BaseHTTPServer.py: Per Cederqvist writes:

	If you send something like "PUT / HTTP/1.0" to something derived from
	BaseHTTPServer that doesn't define do_PUT, you will get a response
	that begins like this:

		HTTP/1.0 501 Unsupported method ('do_PUT')
		Server: SimpleHTTP/0.3 Python/1.5
		Date: Tue, 30 Mar 1999 18:53:53 GMT

	The server should complain about 'PUT' instead of 'do_PUT'.  This
	patch should fix the problem.

Mon Mar 29 20:33:21 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/smtplib.py: Patch by Per Cederqvist, who writes:

	"""
	 - It needlessly used the makefile() method for each response that is
	   read from the SMTP server.

	 - If the remote SMTP server closes the connection unexpectedly the
	   code raised an IndexError.  It now raises an SMTPServerDisconnected
	   exception instead.

	 - The code now checks that all lines in a multiline response actually
	   contains an error code.
	"""

	The Dragon approves.

Mon Mar 29 20:25:40 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/compileall.py:
	When run as a script, report failures in the exit code as well.
	Patch largely based on changes by Andrew Dalke, as discussed in the
	distutils-sig.

Mon Mar 29 20:23:41 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	Hack so that if a 302 or 301 redirect contains a relative URL, the
	right thing "just happens" (basejoin() with old URL).

	* Modules/cPickle.c:
	Protection against picling to/from closed (real) file.
	The problem was reported by Moshe Zadka.

	* Lib/test/test_cpickle.py:
	Test protection against picling to/from closed (real) file.

	* Modules/timemodule.c: Chris Lawrence writes:

	"""
	The GNU folks, in their infinite wisdom, have decided not to implement
	altzone in libc6; this would not be horrible, except that timezone
	(which is implemented) includes the current DST setting (i.e. timezone
	for Central is 18000 in summer and 21600 in winter).  So Python's
	timezone and altzone variables aren't set correctly during DST.

	Here's a patch relative to 1.5.2b2 that (a) makes timezone and altzone
	show the "right" thing on Linux (by using the tm_gmtoff stuff
	available in BSD, which is how the GLIBC manual claims things should
	be done) and (b) should cope with the southern hemisphere.  In pursuit
	of (b), I also took the liberty of renaming the "summer" and "winter"
	variables to "july" and "jan".  This patch should also make certain
	time calculations on Linux actually work right (like the tz-aware
	functions in the rfc822 module).

	(It's hard to find DST that's currently being used in the southern
	hemisphere; I tested using Africa/Windhoek.)
	"""

	* Lib/test/output/test_gzip:
	Jonathan Giddy discovered this file was missing.

	* Modules/shamodule.c:
	Avoid warnings from AIX compiler.  Reported by Vladimir (AIX is my
	middlename) Marangozov, patch coded by Greg Stein.

	* Tools/idle/ScriptBinding.py, Tools/idle/PyShell.py:
	At Tim Peters' recommendation, add a dummy flush() method to PseudoFile.

Sun Mar 28 17:55:32 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/ndiff.py: Tim Peters writes:

	I should have waited overnight <wink/sigh>.  Nothing wrong with the one I
	sent, but I couldn't resist going on to add new -r1 / -r2 cmdline options
	for recreating the original files from ndiff's output.  That's attached, if
	you're game!  Us Windows guys don't usually have a sed sitting around
	<wink>.

Sat Mar 27 13:34:01 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/ndiff.py: Tim Peters writes:

	Attached is a cleaned-up version of ndiff (added useful module
	docstring, now echo'ed in case of cmd line mistake); added -q option
	to suppress initial file identification lines; + other minor cleanups,
	& a slightly faster match engine.

Fri Mar 26 22:36:00 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Tools/scripts/dutree.py:
	During display, if EPIPE is raised, it's probably because a pager was
	killed.  Discard the error in that case, but propogate it otherwise.

Fri Mar 26 16:20:45 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_userlist, Lib/test/test_userlist.py:
	Test suite for UserList.

	* Lib/UserList.py: Use isinstance() where appropriate.
	Reformatted with 4-space indent.

Fri Mar 26 16:11:40 1999  Barry Warsaw  <bwarsaw@eric.cnri.reston.va.us>

	* Tools/pynche/PyncheWidget.py:
	Helpwin.__init__(): The text widget should get focus.

	* Tools/pynche/pyColorChooser.py:
	Removed unnecessary import `from PyncheWidget import PyncheWidget'

Fri Mar 26 15:32:05 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_userdict, Lib/test/test_userdict.py:
	Test suite for UserDict

	* Lib/UserDict.py: Improved a bunch of things.
	The constructor now takes an optional dictionary.
	Use isinstance() where appropriate.

Thu Mar 25 22:38:49 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_pickle, Lib/test/output/test_cpickle, Lib/test/test_pickle.py, Lib/test/test_cpickle.py:
	Basic regr tests for pickle/cPickle

	* Lib/pickle.py:
	Don't use "exec" in find_class().  It's slow, unnecessary, and (as AMK
	points out) it doesn't work in JPython Applets.

Thu Mar 25 21:50:27 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Lib/test/test_gzip.py:
	Added a simple test suite for gzip.  It simply opens a temp file,
	writes a chunk of compressed data, closes it, writes another chunk, and
	reads the contents back to verify that they are the same.

	* Lib/gzip.py:
	Based on a suggestion from bruce@hams.com, make a trivial change to
	allow using the 'a' flag as a mode for opening a GzipFile.  gzip
	files, surprisingly enough, can be concatenated and then decompressed;
	the effect is to concatenate the two chunks of data.

	If we support it on writing, it should also be supported on reading.
	This *wasn't* trivial, and required rearranging the code in the
	reading path, particularly the _read() method.

	Raise IOError instead of RuntimeError in two cases, 'Not a gzipped file'
	and 'Unknown compression method'

Thu Mar 25 21:25:01 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_b1.py:
	Add tests for float() and complex() with string args (Nick/Stephanie
	Lockwood).

Thu Mar 25 21:21:08 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Add an .unused_data attribute to decompressor objects.  If .unused_data
	is not an empty string, this means that you have arrived at the
	end of the stream of compressed data, and the contents of .unused_data are
	whatever follows the compressed stream.

Thu Mar 25 21:16:07 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Python/bltinmodule.c:
	Patch by Nick and Stephanie Lockwood to implement complex() with a string
	argument.  This closes TODO item 2.19.

Wed Mar 24 19:09:00 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/webchecker/wcnew.py: Added Samuel Bayer's new webchecker.
	Unfortunately his code breaks wcgui.py in a way that's not easy
	to fix.  I expect that this is a temporary situation --
	eventually Sam's changes will be merged back in.
	(The changes add a -t option to specify exceptions to the -x
	option, and explicit checking for #foo style fragment ids.)

	* Objects/dictobject.c:
	Vladimir Marangozov contributed updated comments.

	* Objects/bufferobject.c: Folded long lines.

	* Lib/test/output/test_sha, Lib/test/test_sha.py:
	Added Jeremy's test code for the sha module.

	* Modules/shamodule.c, Modules/Setup.in:
	Added Greg Stein and Andrew Kuchling's sha module.
	Fix comments about zlib version and URL.

	* Lib/test/test_bsddb.py: Remove the temp file when we're done.

	* Include/pythread.h: Conform to standard boilerplate.

	* configure.in, configure, BeOS/linkmodule, BeOS/ar-fake:
	Chris Herborth: the new compiler in R4.1 needs some new options to work...

	* Modules/socketmodule.c:
	Implement two suggestions by Jonathan Giddy: (1) in AIX, clear the
	data struct before calling gethostby{name,addr}_r(); (2) ignore the
	3/5/6 args determinations made by the configure script and switch on
	platform identifiers instead:

	AIX, OSF have 3 args
	Sun, SGI have 5 args
	Linux has 6 args

	On all other platforms, undef HAVE_GETHOSTBYNAME_R altogether.

	* Modules/socketmodule.c:
	Vladimir Marangozov implements the AIX 3-arg gethostbyname_r code.

	* Lib/mailbox.py:
	Add readlines() to _Subfile class.  Not clear who would need it, but
	Chris Lawrence sent me a broken version; this one is a tad simpler and
	more conforming to the standard.

Tue Mar 23 23:05:34 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/gzip.py: use struct instead of bit-manipulate in Python

Tue Mar 23 19:00:55 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/Makefile.pre.in:
	Add $(EXE) to various occurrences of python so it will work on Cygwin
	with egcs (after setting EXE=.exe).  Patch by Norman Vine.

	* configure, configure.in:
	Ack!  It never defined HAVE_GETHOSTBYNAME_R so that code was never tested!

Mon Mar 22 22:25:39 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Include/thread.h:
	Adding thread.h -- unused but for b/w compatibility.
	As requested by Bill Janssen.

	* configure.in, configure:
	Add code to test for all sorts of gethostbyname_r variants,
	donated by David Arnold.

	* config.h.in, acconfig.h:
	Add symbols for gethostbyname_r variants (sigh).

	* Modules/socketmodule.c: Clean up pass for the previous patches.

	- Use HAVE_GETHOSTBYNAME_R_6_ARG instead of testing for Linux and
	glibc2.

	- If gethostbyname takes 3 args, undefine HAVE_GETHOSTBYNAME_R --
	don't know what code should be used.

	- New symbol USE_GETHOSTBYNAME_LOCK defined iff the lock should be used.

	- Modify the gethostbyaddr() code to also hold on to the lock until
	after it is safe to release, overlapping with the Python lock.

	(Note: I think that it could in theory be possible that Python code
	executed while gethostbyname_lock is held could attempt to reacquire
	the lock -- e.g. in a signal handler or destructor.  I will simply say
	"don't do that then.")

	* Modules/socketmodule.c: Jonathan Giddy writes:

	Here's a patch to fix the race condition, which wasn't fixed by Rob's
	patch.  It holds the gethostbyname lock until the results are copied out,
	which means that this lock and the Python global lock are held at the same
	time.  This shouldn't be a problem as long as the gethostbyname lock is
	always acquired when the global lock is not held.

Mon Mar 22 19:25:30 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Fixed the flush() method of compression objects; the test for
	    the end of loop was incorrect, and failed when the flushmode != Z_FINISH.
	    Logic cleaned up and commented.

	* Lib/test/test_zlib.py:
	Added simple test for the flush() method of compression objects, trying the
	    different flush values Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH.

Mon Mar 22 15:28:08 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/shlex.py:
	Bug reported by Tobias Thelen: missing "self." in assignment target.

Fri Mar 19 21:50:11 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/arraymodule.c:
	Use an unsigned cast to avoid a warning in VC++.

	* Lib/dospath.py, Lib/ntpath.py:
	New code for split() by Tim Peters, behaves more like posixpath.split().

	* Objects/floatobject.c:
	Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
	a block cannot be freed, add its free items back to the free list.
	This is necessary to avoid leaking when Python is reinitialized later.

	* Objects/intobject.c:
	Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
	a block cannot be freed, add its free items back to the free list, and
	add its valid ints back to the small_ints array if they are in range.
	This is necessary to avoid leaking when Python is reinitialized later.

	* Lib/types.py:
	Added BufferType, the type returned by the new builtin buffer().  Greg Stein.

	* Python/bltinmodule.c:
	New builtin buffer() creates a derived read-only buffer from any
	object that supports the buffer interface (e.g. strings, arrays).

	* Objects/bufferobject.c:
	Added check for negative offset for PyBuffer_FromObject and check for
	negative size for PyBuffer_FromMemory.  Greg Stein.

Thu Mar 18 15:10:44 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py: Sjoerd Mullender writes:

	If a filename on Windows starts with \\, it is converted to a URL
	which starts with ////.  If this URL is passed to urlparse.urlparse
	you get a path that starts with // (and an empty netloc).  If you pass
	the result back to urlparse.urlunparse, you get a URL that starts with
	//, which is parsed differently by urlparse.urlparse.  The fix is to
	add the (empty) netloc with accompanying slashes if the path in
	urlunparse starts with //.  Do this for all schemes that use a netloc.

	* Lib/nturl2path.py: Sjoerd Mullender writes:

	Pathnames of files on other hosts in the same domain
	(\\host\path\to\file) are not translated correctly to URLs and back.
	The URL should be something like file:////host/path/to/file.
	Note that a combination of drive letter and remote host is not
	possible.

Wed Mar 17 22:30:10 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py:
	Delete non-standard-conforming code in urljoin() that would use the
	netloc from the base url as the default netloc for the resulting url
	even if the schemes differ.

	Once upon a time, when the web was wild, this was a valuable hack
	because some people had a URL referencing an ftp server colocated with
	an http server without having the host in the ftp URL (so they could
	replicate it or change the hostname easily).

	More recently, after the file: scheme got added back to the list of
	schemes that accept a netloc, it turns out that this caused weirdness
	when joining an http: URL with a file: URL -- the resulting file: URL
	would always inherit the host from the http: URL because the file:
	scheme supports a netloc but in practice never has one.

	There are two reasons to get rid of the old, once-valuable hack,
	instead of removing the file: scheme from the uses_netloc list.  One,
	the RFC says that file: uses the netloc syntax, and does not endorse
	the old hack.  Two, neither netscape 4.5 nor IE 4.0 support the old
	hack.

	* Include/ceval.h, Include/abstract.h:
	Add DLL level b/w compat for PySequence_In and PyEval_CallObject

Tue Mar 16 21:54:50 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/lib-tk/Tkinter.py: Bug reported by Jim Robinson:

	An attempt to execute grid_slaves with arguments (0,0) results in
	*all* of the slaves being returned, not just the slave associated with
	row 0, column 0.  This is because the test for arguments in the method
	does not test to see if row (and column) does not equal None, but
	rather just whether is evaluates to non-false.  A value of 0 fails
	this test.

Tue Mar 16 14:17:48 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Modules/cmathmodule.c:
	Docstring fix:  acosh() returns the hyperbolic arccosine, not the
	hyperbolic cosine.  Problem report via David Ascher by one of his
	students.

Mon Mar 15 21:40:59 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* configure.in:
	Should test for gethost*by*name_r, not for gethostname_r (which
	doesn't exist and doesn't make sense).

	* Modules/socketmodule.c:
	Patch by Rob Riggs for Linux -- glibc2 has a different argument
	converntion for gethostbyname_r() etc. than Solaris!

	* Python/thread_pthread.h: Rob Riggs wrote:

	"""
	Spec says that on success pthread_create returns 0. It does not say
	that an error code will be < 0. Linux glibc2 pthread_create() returns
	ENOMEM (12) when one exceed process limits. (It looks like it should
	return EAGAIN, but that's another story.)

	For reference, see:
	http://www.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html
	"""

	[I have a feeling that similar bugs were fixed before; perhaps someone
	could check that all error checks no check for != 0?]

	* Tools/bgen/bgen/bgenObjectDefinition.py:
	New mixin class that defines cmp and hash that use
	the ob_itself pointer.  This allows (when using the mixin)
	different Python objects pointing to the same C object and
	behaving well as dictionary keys.

	Or so sez Jack Jansen...

	* Lib/urllib.py: Yet another patch by Sjoerd Mullender:

	Don't convert URLs to URLs using pathname2url.

Fri Mar 12 22:15:43 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/cmd.py: Patch by Michael Scharf.  He writes:

	    The module cmd requires for each do_xxx command a help_xxx
	    function. I think this is a little old fashioned.

	    Here is a patch: use the docstring as help if no help_xxx
	    function can be found.

	[I'm tempted to rip out all the help_* functions from pdb, but I'll
	resist it.  Any takers?  --Guido]

	* Tools/freeze/freeze.py: Bug submitted by Wayne Knowles, who writes:

	   Under Windows, python freeze.py -o hello hello.py
	   creates all the correct files in the hello subdirectory, but the
	   Makefile has the directory prefix in it for frozen_extensions.c
	   nmake fails because it tries to locate hello/frozen_extensions.c

	(His fix adds a call to os.path.basename() in the appropriate place.)

	* Objects/floatobject.c, Objects/intobject.c:
	Vladimir has restructured his code somewhat so that the blocks are now
	represented by an explicit structure.  (There are still too many casts
	in the code, but that may be unavoidable.)

	Also added code so that with -vv it is very chatty about what it does.

	* Demo/zlib/zlibdemo.py, Demo/zlib/minigzip.py:
	Change #! line to modern usage; also chmod +x

	* Demo/pdist/rrcs, Demo/pdist/rcvs, Demo/pdist/rcsbump:
	Change #! line to modern usage

	* Lib/nturl2path.py, Lib/urllib.py: From: Sjoerd Mullender

	The filename to URL conversion didn't properly quote special
	characters.
	The URL to filename didn't properly unquote special chatacters.

	* Objects/floatobject.c:
	OK, try again.  Vladimir gave me a fix for the alignment bus error,
	so here's his patch again.  This time it works (at least on Solaris,
	Linux and Irix).

Thu Mar 11 23:21:23 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/idle/PathBrowser.py:
	Don't crash when sys.path contains an empty string.

	* Tools/idle/PathBrowser.py:
	- Don't crash in the case where a superclass is a string instead of a
	pyclbr.Class object; this can happen when the superclass is
	unrecognizable (to pyclbr), e.g. when module renaming is used.

	- Show a watch cursor when calling pyclbr (since it may take a while
	recursively parsing imported modules!).

Thu Mar 11 16:04:04 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/mimetypes.py:
	Added .rdf and .xsl as application/xml types.  (.rdf is for the
	Resource Description Framework, a metadata encoding, and .xsl is for
	the Extensible Stylesheet Language.)

Thu Mar 11 13:26:23 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_popen2, Lib/test/test_popen2.py:
	Test for popen2 module, by Chris Tismer.

	* Objects/floatobject.c:
	Alas, Vladimir's patch caused a bus error (probably double
	alignment?), and I didn't test it.  Withdrawing it for now.

Wed Mar 10 22:55:47 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Objects/floatobject.c:
	Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
	floats on finalization.

	* Objects/intobject.c:
	Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
	integers on finalization.

	* Tools/idle/EditorWindow.py, Tools/idle/Bindings.py:
	Add PathBrowser to File module

	* Tools/idle/PathBrowser.py:
	"Path browser" - 4 scrolled lists displaying:
	    directories on sys.path
	    modules in selected directory
	    classes in selected module
	    methods of selected class

	Sinlge clicking in a directory, module or class item updates the next
	column with info about the selected item.  Double clicking in a
	module, class or method item opens the file (and selects the clicked
	item if it is a class or method).

	I guess eventually I should be using a tree widget for this, but the
	ones I've seen don't work well enough, so for now I use the old
	Smalltalk or NeXT style multi-column hierarchical browser.

	* Tools/idle/MultiScrolledLists.py:
	New utility: multiple scrolled lists in parallel

	* Tools/idle/ScrolledList.py: - White background.
	- Display "(None)" (or text of your choosing) when empty.
	- Don't set the focus.

Tue Mar  9 19:31:21 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	open_http also had the 'data is None' test backwards.  don't call with the
	extra argument if data is None.

	* Demo/embed/demo.c:
	Call Py_SetProgramName() instead of redefining getprogramname(),
	reflecting changes in the runtime around 1.5 or earlier.

	* Python/ceval.c:
	Always test for an error return (usually NULL or -1) without setting
	an exception.

	* Modules/timemodule.c: Patch by Chris Herborth for BeOS code.
	He writes:

	I had an off-by-1000 error in floatsleep(),
	and the problem with time.clock() is that it's not implemented properly
	on QNX... ANSI says it's supposed to return _CPU_ time used by the
	process, but on QNX it returns the amount of real time used... so I was
	confused.

	* Tools/bgen/bgen/macsupport.py: Small change by Jack Jansen.
	Test for self.returntype behaving like OSErr rather than being it.

Thu Feb 25 16:14:58 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	http_error had the 'data is None' test backwards.  don't call with the
	extra argument if data is None.

	* Lib/urllib.py: change indentation from 8 spaces to 4 spaces

	* Lib/urllib.py: pleasing the tabnanny

Thu Feb 25 14:26:02 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/colorsys.py:
	Oops, one more "x, y, z" to convert...

	* Lib/colorsys.py:
	Adjusted comment at the top to be less confusing, following Fredrik
	Lundh's example.

	Converted comment to docstring.

Wed Feb 24 18:49:15 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/toaiff.py:
	Use sndhdr instead of the obsolete whatsound module.

Wed Feb 24 18:42:38 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	When performing a POST request, i.e. when the second argument to
	urlopen is used to specify form data, make sure the second argument is
	threaded through all of the http_error_NNN calls.  This allows error
	handlers like the redirect and authorization handlers to properly
	re-start the connection.

Wed Feb 24 16:25:17 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/mhlib.py: Patch by Lars Wirzenius:

		o the initial comment is wrong: creating messages is already
		  implemented

		o Message.getbodytext: if the mail or it's part contains an
		  empty content-transfer-encoding header, the code used to
		  break; the change below treats an empty encoding value the same
		  as the other types that do not need decoding

		o SubMessage.getbodytext was missing the decode argument; the
		  change below adds it; I also made it unconditionally return
		  the raw text if decoding was not desired, because my own
		  routines needed that (and it was easier than rewriting my
		  own routines ;-)

Wed Feb 24 00:35:43 1999  Barry Warsaw  <bwarsaw@eric.cnri.reston.va.us>

	* Python/bltinmodule.c (initerrors):
	Make sure that the exception tuples ("base-classes" when
	string-based exceptions are used) reflect the real class hierarchy,
	i.e. that SystemExit derives from Exception not StandardError.

	* Lib/exceptions.py:
	Document the correct class hierarchy for SystemExit.  It is not an
	error and so it derives from Exception and not SystemError.  The
	docstring was incorrect but the implementation was fine.

Tue Feb 23 23:07:51 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/shutil.py:
	Add import sys, needed by reference to sys.exc_info() in rmtree().
	Discovered by Mitch Chapman.

	* config.h.in:
	Now that we don't have AC_CHECK_LIB(m, pow), the HAVE_LIBM symbol
	disappears.  It wasn't used anywhere anyway...

	* Modules/arraymodule.c:
	Carefully check for overflow when allocating the memory for fromfile
	-- someone tried to pass in sys.maxint and got bitten by the bogus
	calculations.

	* configure.in:
	Get rid of AC_CHECK_LIB(m, pow) since this is taken care of later with
	LIBM (from --with-libm=...); this actually broke the customizability
	offered by the latter option.  Thanks go to Clay Spence for reporting
	this.

	* Lib/test/test_dl.py:
	1. Print the error message (carefully) when a dl.open() fails in verbose mode.
	2. When no test case worked, raise ImportError instead of failing.

	* Python/bltinmodule.c:
	Patch by Tim Peters to improve the range checks for range() and
	xrange(), especially for platforms where int and long are different
	sizes (so sys.maxint isn't actually the theoretical limit for the
	length of a list, but the largest C int is -- sys.maxint is the
	largest Python int, which is actually a C long).

	* Makefile.in:
	1. Augment the DG/UX rule so it doesn't break the BeOS build.
	2. Add $(EXE) to various occurrences of python so it will work on
	   Cygwin with egcs (after setting EXE=.exe).  These patches by
	   Norman Vine.

	* Lib/posixfile.py:
	According to Jeffrey Honig, bsd/os 2.0 - 4.0 should be added to the
	list (of bsd variants that have a different lock structure).

	* Lib/test/test_fcntl.py:
	According to Jeffrey Honig, bsd/os 4.0 should be added to the list.

	* Modules/timemodule.c:
	Patch by Tadayoshi Funaba (with some changes) to be smarter about
	guessing what happened when strftime() returns 0.  Is it buffer
	overflow or was the result simply 0 bytes long?  (This happens for an
	empty format string, or when the format string is a single %Z and the
	timezone is unknown.)  if the buffer is at least 256 times as long as
	the format, assume the latter.

Mon Feb 22 19:01:42 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	As Des Barry points out, we need to call pathname2url(file) in two
	calls to addinfourl() in open_file().

	* Modules/Setup.in: Document *static* -- in two places!

	* Modules/timemodule.c:
	We don't support leap seconds, so the seconds field of a time 9-tuple
	should be in the range [0-59].  Noted by Tadayoshi Funaba.

	* Modules/stropmodule.c:
	In atoi(), don't use isxdigit() to test whether the last character
	converted was a "digit" -- use isalnum().  This test is there only to
	guard against "+" or "-" being interpreted as a valid int literal.
	Reported by Takahiro Nakayama.

	* Lib/os.py:
	As Finn Bock points out, _P_WAIT etc. don't have a leading underscore
	so they don't need to be treated specially here.

Mon Feb 22 15:38:58 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Misc/NEWS:
	Typo:  "apparentlt" --> "apparently"

Mon Feb 22 15:38:46 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py: Steve Clift pointed out that 'file' allows a netloc.

	* Modules/posixmodule.c:
	The docstring for ttyname(..) claims a second "mode" argument. The
	actual code does not allow such an argument.  (Finn Bock.)

	* Lib/lib-old/poly.py:
	Dang.  Even though this is obsolete code, somebody found a bug, and I
	fix it.  Oh well.

Thu Feb 18 20:51:50 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/pyclbr.py:
	Bow to font-lock at the end of the docstring, since it throws stuff
	off.

	Make sure the path paramter to readmodule() is a list before adding it
	with sys.path, or the addition could fail.


======================================================================


From 1.5.2b1 to 1.5.2b2
=======================

General
-------

- Many memory leaks fixed.

- Many small bugs fixed.

- Command line option -OO (or -O -O) suppresses inclusion of doc
strings in resulting bytecode.

Windows-specific changes
------------------------

- New built-in module winsound provides an interface to the Win32
PlaySound() call.

- Re-enable the audioop module in the config.c file.

- On Windows, support spawnv() and associated P_* symbols.

- Fixed the conversion of times() return values on Windows.

- Removed freeze from the installer -- it doesn't work without the
source tree.  (See FAQ 8.11.)

- On Windows 95/98, the Tkinter module now is smart enough to find
Tcl/Tk even when the PATH environment variable hasn't been set -- when
the import of _tkinter fails, it searches in a standard locations,
patches os.environ["PATH"], and tries again.  When it still fails, a
clearer error message is produced.  This should avoid most
installation problems with Tkinter use (e.g. in IDLE).

- The -i option doesn't make any calls to set[v]buf() for stdin --
this apparently screwed up _kbhit() and the _tkinter main loop.

- The ntpath module (and hence, os.path on Windows) now parses out UNC
paths (e.g. \\host\mountpoint\dir\file) as "drive letters", so that
splitdrive() will \\host\mountpoint as the drive and \dir\file as the
path.  ** EXPERIMENTAL **

- Added a hack to the exit code so that if (1) the exit status is
nonzero and (2) we think we have our own DOS box (i.e. we're not
started from a command line shell), we print a message and wait for
the user to hit a key before the DOS box is closed.

- Updated the installer to WISE 5.0g.  Added a dialog warning about
the imminent Tcl installation.  Added a dialog to specify the program
group name in the start menu.  Upgraded the Tcl installer to Tcl
8.0.4.

Changes to intrinsics
---------------------

- The repr() or str() of a module object now shows the __file__
attribute (i.e., the file which it was loaded), or the string
"(built-in)" if there is no __file__ attribute.

- The range() function now avoids overflow during its calculations (if
at all possible).

- New info string sys.hexversion, which is an integer encoding the
version in hexadecimal.  In other words, hex(sys.hexversion) ==
0x010502b2 for Python 1.5.2b2.

New or improved ports
---------------------

- Support for Nextstep descendants (future Mac systems).

- Improved BeOS support.

- Support dynamic loading of shared libraries on NetBSD platforms that 
use ELF (i.e., MIPS and Alpha systems).

Configuration/build changes
---------------------------

- The Lib/test directory is no longer included in the default module
search path (sys.path) -- "test" has been a package ever since 1.5.

- Now using autoconf 2.13.

New library modules
-------------------

- New library modules asyncore and asynchat: these form Sam Rushing's
famous asynchronous socket library.  Sam has gracefully allowed me to
incorporate these in the standard Python library.

- New module statvfs contains indexing constants for [f]statvfs()
return tuple.

Changes to the library
----------------------

- The wave module (platform-independent support for Windows sound
files) has been fixed to actually make it work.

- The sunau module (platform-independent support for Sun/NeXT sound
files) has been fixed to work across platforms.  Also, a weird
encoding bug in the header of the audio test data file has been
corrected.

- Fix a bug in the urllib module that occasionally tripped up
webchecker and other ftp retrieves.

- ConfigParser's get() method now accepts an optional keyword argument
(vars) that is substituted on top of the defaults that were setup in
__init__.  You can now also have recusive references in your
configuration file.

- Some improvements to the Queue module, including a put_nowait()
module and an optional "block" second argument, to get() and put(),
defaulting to 1.

- The updated xmllib module is once again compatible with the version
present in Python 1.5.1 (this was accidentally broken in 1.5.2b1).

- The bdb module (base class for the debugger) now supports
canonicalizing pathnames used in breakpoints.  The derived class must
override the new canonical() method for this to work.  Also changed
clear_break() to the backwards compatible old signature, and added
clear_bpbynumber() for the new functionality.

- In sgmllib (and hence htmllib), recognize attributes even if they
don't have space in front of them.  I.e.  '<a
name="foo"href="bar.html">' will now have two attributes recognized.

- In the debugger (pdb), change clear syntax to support three
alternatives: clear; clear file:line; clear bpno bpno ...

- The os.path module now pretends to be a submodule within the os
"package", so you can do things like "from os.path import exists".

- The standard exceptions now have doc strings.

- In the smtplib module, exceptions are now classes.  Also avoid
inserting a non-standard space after "TO" in rcpt() command.

- The rfc822 module's getaddrlist() method now uses all occurrences of
the specified header instead of just the first.  Some other bugfixes
too (to handle more weird addresses found in a very large test set,
and to avoid crashes on certain invalid dates), and a small test
module has been added.

- Fixed bug in urlparse in the common-case code for HTTP URLs; it
would lose the query, fragment, and/or parameter information.

- The sndhdr module no longer supports whatraw() -- it depended on a
rare extenral program.

- The UserList module/class now supports the extend() method, like
real list objects.

- The uu module now deals better with trailing garbage generated by
some broke uuencoders.

- The telnet module now has an my_interact() method which uses threads
instead of select.  The interact() method uses this by default on
Windows (where the single-threaded version doesn't work).

- Add a class to mailbox.py for dealing with qmail directory
mailboxes.  The test code was extended to notice these being used as
well.

Changes to extension modules
----------------------------

- Support for the [f]statvfs() system call, where it exists.

- Fixed some bugs in cPickle where bad input could cause it to dump
core.

- Fixed cStringIO to make the writelines() function actually work.

- Added strop.expandtabs() so string.expandtabs() is now much faster.

- Added fsync() and fdatasync(), if they appear to exist.

- Support for "long files" (64-bit seek pointers).

- Fixed a bug in the zlib module's flush() function.

- Added access() system call.  It returns 1 if access granted, 0 if
not.

- The curses module implements an optional nlines argument to
w.scroll().  (It then calls wscrl(win, nlines) instead of scoll(win).)

Changes to tools
----------------

- Some changes to IDLE; see Tools/idle/NEWS.txt.

- Latest version of Misc/python-mode.el included.

Changes to Tkinter
------------------

- Avoid tracebacks when an image is deleted after its root has been
destroyed.

Changes to the Python/C API
---------------------------

- When parentheses are used in a PyArg_Parse[Tuple]() call, any
sequence is now accepted, instead of requiring a tuple.  This is in
line with the general trend towards accepting arbitrary sequences.

- Added PyModule_GetFilename().

- In PyNumber_Power(), remove unneeded and even harmful test for float
to the negative power (which is already and better done in
floatobject.c).

- New version identification symbols; read patchlevel.h for info.  The
version numbers are now exported by Python.h.

- Rolled back the API version change -- it's back to 1007!

- The frozenmain.c function calls PyInitFrozenExtensions().

- Added 'N' format character to Py_BuildValue -- like 'O' but doesn't
INCREF.


======================================================================


From 1.5.2a2 to 1.5.2b1
=======================

Changes to intrinsics
---------------------

- New extension NotImplementedError, derived from RuntimeError.  Not
used, but recommended use is for "abstract" methods to raise this.

- The parser will now spit out a warning or error when -t or -tt is
used for parser input coming from a string, too.

- The code generator now inserts extra SET_LINENO opcodes when
compiling multi-line argument lists.

- When comparing bound methods, use identity test on the objects, not
equality test.

New or improved ports
---------------------

- Chris Herborth has redone his BeOS port; it now works on PowerPC
(R3/R4) and x86 (R4 only).  Threads work too in this port.

Renaming
--------

- Thanks to Chris Herborth, the thread primitives now have proper Py*
names in the source code (they already had those for the linker,
through some smart macros; but the source still had the old, un-Py
names).

Configuration/build changes
---------------------------

- Improved support for FreeBSD/3.

- Check for pthread_detach instead of pthread_create in libc.

- The makesetup script now searches EXECINCLUDEPY before INCLUDEPY.

- Misc/Makefile.pre.in now also looks at Setup.thread and Setup.local.
Otherwise modules such as thread didn't get incorporated in extensions.

New library modules
-------------------

- shlex.py by Eric Raymond provides a lexical analyzer class for
simple shell-like syntaxes.

- netrc.py by Eric Raymond provides a parser for .netrc files.  (The
undocumented Netrc class in ftplib.py is now obsolete.)

- codeop.py is a new module that contains the compile_command()
function that was previously in code.py.  This is so that JPython can
provide its own version of this function, while still sharing the
higher-level classes in code.py.

- turtle.py is a new module for simple turtle graphics.  I'm still
working on it; let me know if you use this to teach Python to children 
or other novices without prior programming experience.

Obsoleted library modules
-------------------------

- poly.py and zmod.py have been moved to Lib/lib-old to emphasize
their status of obsoleteness.  They don't do a particularly good job
and don't seem particularly relevant to the Python core.

New tools
---------

- I've added IDLE: my Integrated DeveLopment Environment for Python.
Requires Tcl/Tk (and Tkinter).  Works on Windows and Unix (and should
work on Macintosh, but I haven't been able to test it there; it does
depend on new features in 1.5.2 and perhaps even new features in
1.5.2b1, especially the new code module).  This is very much a work in
progress.  I'd like to hear how people like it compared to PTUI (or
any other IDE they are familiar with).

- New tools by Barry Warsaw:

  = audiopy: controls the Solaris Audio device
  = pynche:  The PYthonically Natural Color and Hue Editor
  = world:   Print mappings between country names and DNS country codes

New demos
---------

- Demo/scripts/beer.py prints the lyrics to an arithmetic drinking
song.

- Demo/tkinter/guido/optionmenu.py shows how to do an option menu in
Tkinter.  (By Fredrik Lundh -- not by me!)

Changes to the library
----------------------

- compileall.py now avoids recompiling .py files that haven't changed;
it adds a -f option to force recompilation.

- New version of xmllib.py by Sjoerd Mullender (0.2 with latest
patches).

- nntplib.py: statparse() no longer lowercases the message-id.

- types.py: use type(__stdin__) for FileType.

- urllib.py: fix translations for filenames with "funny" characters.
Patch by Sjoerd Mullender.  Note that if you subclass one of the
URLopener classes, and you have copied code from the old urllib.py,
your subclass may stop working.  A long-term solution is to provide
more methods so that you don't have to copy code.

- cgi.py: In read_multi, allow a subclass to override the class we
instantiate when we create a recursive instance, by setting the class
variable 'FieldStorageClass' to the desired class.  By default, this
is set to None, in which case we use self.__class__ (as before).
Also, a patch by Jim Fulton to pass additional arguments to recursive
calls to the FieldStorage constructor from its read_multi method.

- UserList.py: In __getslice__, use self.__class__ instead of
UserList.

- In SimpleHTTPServer.py, the server specified in test() should be
BaseHTTPServer.HTTPServer, in case the request handler should want to
reference the two attributes added by BaseHTTPServer.server_bind.  (By
Jeff Rush, for Bobo).  Also open the file in binary mode, so serving
images from a Windows box might actually work.

- In CGIHTTPServer.py, the list of acceptable formats is -split-
on spaces but -joined- on commas, resulting in double commas
in the joined text.  (By Jeff Rush.)

- SocketServer.py, patch by Jeff Bauer: a minor change to declare two
new threaded versions of Unix Server classes, using the ThreadingMixIn
class: ThreadingUnixStreamServer, ThreadingUnixDatagramServer.

- bdb.py: fix bomb on deleting a temporary breakpoint: there's no
method do_delete(); do_clear() was meant.  By Greg Ward.

- getopt.py: accept a non-list sequence for the long options (request
by Jack Jansen).  Because it might be a common mistake to pass a
single string, this situation is treated separately.  Also added
docstrings (copied from the library manual) and removed the (now
redundant) module comments.

- tempfile.py: improvements to avoid security leaks.

- code.py: moved compile_command() to new module codeop.py.

- pickle.py: support pickle format 1.3 (binary float added).  By Jim
Fulton. Also get rid of the undocumented obsolete Pickler dump_special
method.

- uu.py: Move 'import sys' to top of module, as noted by Tim Peters.

- imaplib.py: fix problem with some versions of IMAP4 servers that
choose to mix the case in their CAPABILITIES response.

- cmp.py: use (f1, f2) as cache key instead of f1 + ' ' + f2.  Noted
by Fredrik Lundh.

Changes to extension modules
----------------------------

- More doc strings for several modules were contributed by Chris
Petrilli: math, cmath, fcntl.

- Fixed a bug in zlibmodule.c that could cause core dumps on
decompression of rarely occurring input.

- cPickle.c: new version from Jim Fulton, with Open Source copyright
notice.  Also, initialize self->safe_constructors early on to prevent
crash in early dealloc.

- cStringIO.c: new version from Jim Fulton, with Open Source copyright
notice.  Also fixed a core dump in cStringIO.c when doing seeks.

- mpzmodule.c: fix signed character usage in mpz.mpz(stringobjecty).

- readline.c: Bernard Herzog pointed out that rl_parse_and_bind
modifies its argument string (bad function!), so we make a temporary
copy.

- sunaudiodev.c: Barry Warsaw added more smarts to get the device and
control pseudo-device, per audio(7I).

Changes to tools
----------------

- New, improved version of Barry Warsaw's Misc/python-mode.el (editing 
support for Emacs).

- tabnanny.py: added a -q ('quiet') option to tabnanny, which causes
only the names of offending files to be printed.

- freeze: when printing missing modules, also print the module they
were imported from.

- untabify.py: patch by Detlef Lannert to implement -t option
(set tab size).

Changes to Tkinter
------------------

- grid_bbox(): support new Tk API: grid bbox ?column row? ?column2
row2?

- _tkinter.c: RajGopal Srinivasan noted that the latest code (1.5.2a2)
doesn't work when running in a non-threaded environment.  He added
some #ifdefs that fix this.

Changes to the Python/C API
---------------------------

- Bumped API version number to 1008 -- enough things have changed!

- There's a new macro, PyThreadState_GET(), which does the same work
as PyThreadState_Get() without the overhead of a function call (it
also avoids the error check).  The two top calling locations of
PyThreadState_Get() have been changed to use this macro.

- All symbols intended for export from a DLL or shared library are now
marked as such (with the DL_IMPORT() macro) in the header file that
declares them.  This was needed for the BeOS port, and should also
make some other ports easier.  The PC port no longer needs the file
with exported symbols (PC/python_nt.def).  There's also a DL_EXPORT
macro which is only used for init methods in extension modules, and
for Py_Main().

Invisible changes to internals
------------------------------

- Fixed a bug in new_buffersize() in fileobject.c which could
return a buffer size that was way too large.

- Use PySys_WriteStderr instead of fprintf in most places.

- dictobject.c: remove dead code discovered by Vladimir Marangozov.

- tupleobject.c: make tuples less hungry -- an extra item was
allocated but never used.  Tip by Vladimir Marangozov.

- mymath.h: Metrowerks PRO4 finally fixes the hypot snafu.  (Jack
Jansen)

- import.c: Jim Fulton fixes a reference count bug in
PyEval_GetGlobals.

- glmodule.c: check in the changed version after running the stubber
again -- this solves the conflict with curses over the 'clear' entry
point much nicer.  (Jack Jansen had checked in the changes to cstubs
eons ago, but I never regenrated glmodule.c :-( )

- frameobject.c: fix reference count bug in PyFrame_New.  Vladimir
Marangozov.

- stropmodule.c: add a missing DECREF in an error exit.  Submitted by
Jonathan Giddy.


======================================================================


From 1.5.2a1 to 1.5.2a2
=======================

General
-------

- It is now a syntax error to have a function argument without a
default following one with a default.

- __file__ is now set to the .py file if it was parsed (it used to
always be the .pyc/.pyo file).

- Don't exit with a fatal error during initialization when there's a
problem with the exceptions.py module.

- New environment variable PYTHONOPTIMIZE can be used to set -O.

- New version of python-mode.el for Emacs.

Miscellaneous fixed bugs
------------------------

- No longer print the (confusing) error message about stack underflow
while compiling.

- Some threading and locking bugs fixed.

- When errno is zero, report "Error", not "Success".

Documentation
-------------

- Documentation will be released separately.

- Doc strings added to array and md5 modules by Chris Petrilli.

Ports and build procedure
-------------------------

- Stop installing when a move or copy fails.

- New version of the OS/2 port code by Jeff Rush.

- The makesetup script handles absolute filenames better.

- The 'new' module is now enabled by default in the Setup file.

- I *think* I've solved the problem with the Linux build blowing up
sometimes due to a conflict between sigcheck/intrcheck and
signalmodule.

Built-in functions
------------------

- The second argument to apply() can now be any sequence, not just a
tuple.

Built-in types
--------------

- Lists have a new method: L1.extend(L2) is equivalent to the common
idiom L1[len(L1):] = L2.

- Better error messages when a sequence is indexed with a non-integer.

- Bettter error message when calling a non-callable object (include
the type in the message).

Python services
---------------

- New version of cPickle.c fixes some bugs.

- pickle.py: improved instantiation error handling.

- code.py: reworked quite a bit.  New base class
InteractiveInterpreter and derived class InteractiveConsole.  Fixed
several problems in compile_command().

- py_compile.py: print error message and continue on syntax errors.
Also fixed an old bug with the fstat code (it was never used).

- pyclbr.py: support submodules of packages.

String Services
---------------

- StringIO.py: raise the right exception (ValueError) for attempted
I/O on closed StringIO objects.

- re.py: fixed a bug in subn(), which caused .groups() to fail inside
the replacement function called by sub().

- The struct module has a new format 'P': void * in native mode.

Generic OS Services
-------------------

- Module time: Y2K robustness.  2-digit year acceptance depends on
value of time.accept2dyear, initialized from env var PYTHONY2K,
default 0.  Years 00-68 mean 2000-2068, while 69-99 mean 1969-1999
(POSIX or X/Open recommendation).

- os.path: normpath(".//x") should return "x", not "/x".

- getpass.py: fall back on default_getpass() when sys.stdin.fileno()
doesn't work.

- tempfile.py: regenerate the template after a fork() call.

Optional OS Services
--------------------

- In the signal module, disable restarting interrupted system calls
when we have siginterrupt().

Debugger
--------

- No longer set __args__; this feature is no longer supported and can
affect the debugged code.

- cmd.py, pdb.py and bdb.py have been overhauled by Richard Wolff, who
added aliases and some other useful new features, e.g. much better
breakpoint support: temporary breakpoint, disabled breakpoints,
breakpoints with ignore counts, and conditions; breakpoints can be set
on a file before it is loaded.

Profiler
--------

- Changes so that JPython can use it.  Also fix the calibration code
so it actually works again
.
Internet Protocols and Support
------------------------------

- imaplib.py: new version from Piers Lauder.

- smtplib.py: change sendmail() method to accept a single string or a
list or strings as the destination (commom newbie mistake).

- poplib.py: LIST with a msg argument fixed.

- urlparse.py: some optimizations for common case (http).

- urllib.py: support content-length in info() for ftp protocol;
support for a progress meter through a third argument to
urlretrieve(); commented out gopher test (the test site is dead).

Internet Data handling
----------------------

- sgmllib.py: support tags with - or . in their name.

- mimetypes.py: guess_type() understands 'data' URLs.

Restricted Execution
--------------------

- The classes rexec.RModuleLoader and rexec.RModuleImporter no
longer exist.

Tkinter
-------

- When reporting an exception, store its info in sys.last_*.  Also,
write all of it to stderr.

- Added NS, EW, and NSEW constants, for grid's sticky option.

- Fixed last-minute bug in 1.5.2a1 release: need to include "mytime.h".

- Make bind variants without a sequence return a tuple of sequences
(formerly it returned a string, which wasn't very convenient).

- Add image commands to the Text widget (these are new in Tk 8.0).

- Added new listbox and canvas methods: {xview,yview}_{scroll,moveto}.)

- Improved the thread code (but you still can't call update() from
another thread on Windows).

- Fixed unnecessary references to _default_root in the new dialog
modules.

- Miscellaneous problems fixed.


Windows General
---------------

- Call LoadLibraryEx(..., ..., LOAD_WITH_ALTERED_SEARCH_PATH) to
search for dependent dlls in the directory containing the .pyd.

- In debugging mode, call DebugBreak() in Py_FatalError().

Windows Installer
-----------------

- Install zlib.dll in the DLLs directory instead of in the win32
system directory, to avoid conflicts with other applications that have 
their own zlib.dll.

Test Suite
----------

- test_long.py: new test for long integers, by Tim Peters.

- regrtest.py: improved so it can be used for other test suites as
well.

- test_strftime.py: use re to compare test results, to support legal
variants (e.g. on Linux).

Tools and Demos
---------------

- Four new scripts in Tools/scripts: crlf.py and lfcr.py (to
remove/add Windows style '\r\n' line endings), untabify.py (to remove
tabs), and rgrep.yp (reverse grep).

- Improvements to Tools/freeze/.  Each Python module is now written to
its own C file.  This prevents some compilers or assemblers from
blowing up on large frozen programs, and saves recompilation time if
only a few modules are changed.  Other changes too, e.g. new command
line options -x and -i.

- Much improved (and smaller!) version of Tools/scripts/mailerdaemon.py.

Python/C API
------------

- New mechanism to support extensions of the type object while
remaining backward compatible with extensions compiled for previous
versions of Python 1.5.  A flags field indicates presence of certain
fields.

- Addition to the buffer API to differentiate access to bytes and
8-bit characters (in anticipation of Unicode characters).

- New argument parsing format t# ("text") to indicate 8-bit
characters; s# simply means 8-bit bytes, for backwards compatibility.

- New object type, bufferobject.c is an example and can be used to
create buffers from memory.

- Some support for 64-bit longs, including some MS platforms.

- Many calls to fprintf(stderr, ...) have been replaced with calls to
PySys_WriteStderr(...).

- The calling context for PyOS_Readline() has changed: it must now be
called with the interpreter lock held!  It releases the lock around
the call to the function pointed to by PyOS_ReadlineFunctionPointer
(default PyOS_StdioReadline()).

- New APIs PyLong_FromVoidPtr() and PyLong_AsVoidPtr().

- Renamed header file "thread.h" to "pythread.h".

- The code string of code objects may now be anything that supports the
buffer API.


======================================================================


From 1.5.1 to 1.5.2a1
=====================

General
-------

- When searching for the library, a landmark that is a compiled module
(string.pyc or string.pyo) is also accepted.

- When following symbolic links to the python executable, use a loop
so that a symlink to a symlink can work.

- Added a hack so that when you type 'quit' or 'exit' at the
interpreter, you get a friendly explanation of how to press Ctrl-D (or 
Ctrl-Z) to exit.

- New and improved Misc/python-mode.el (Python mode for Emacs).

- Revert a new feature in Unix dynamic loading: for one or two
revisions, modules were loaded using the RTLD_GLOBAL flag.  It turned
out to be a bad idea.

Miscellaneous fixed bugs
------------------------

- All patches on the patch page have been integrated.  (But much more
has been done!)

- Several memory leaks plugged (e.g. the one for classes with a
__getattr__ method).

- Removed the only use of calloc().  This triggered an obscure bug on
multiprocessor Sparc Solaris 2.6.

- Fix a peculiar bug that would allow "import sys.time" to succeed
(believing the built-in time module to be a part of the sys package).

- Fix a bug in the overflow checking when converting a Python long to
a C long (failed to convert -2147483648L, and some other cases).

Documentation
-------------

- Doc strings have been added to many extension modules: __builtin__,
errno, select, signal, socket, sys, thread, time.  Also to methods of
list objects (try [].append.__doc__).  A doc string on a type will now
automatically be propagated to an instance if the instance has methods
that are accessed in the usual way.

- The documentation has been expanded and the formatting improved.
(Remember that the documentation is now unbundled and has its own
release cycle though; see http://www.python.org/doc/.)

- Added Misc/Porting -- a mini-FAQ on porting to a new platform.

Ports and build procedure
-------------------------

- The BeOS port is now integrated.  Courtesy Chris Herborth.

- Symbol files for FreeBSD 2.x and 3.x have been contributed
(Lib/plat-freebsd[23]/*).

- Support HPUX 10.20 DCE threads.

- Finally fixed the configure script so that (on SGI) if -OPT:Olimit=0
works, it won't also use -Olimit 1500 (which gives a warning for every
file).  Also support the SGI_ABI environment variable better.

- The makesetup script now understands absolute pathnames ending in .o
in the module -- it assumes it's a file for which we have no source.

- Other miscellaneous improvements to the configure script and
Makefiles.

- The test suite now uses a different sound sample.

Built-in functions
------------------

- Better checks for invalid input to int(), long(), string.atoi(),
string.atol().  (Formerly, a sign without digits would be accepted as
a legal ways to spell zero.)

- Changes to map() and filter() to use the length of a sequence only
as a hint -- if an IndexError happens earlier, take that.  (Formerly,
this was considered an error.)

- Experimental feature in getattr(): a third argument can specify a
default (instead of raising AttributeError).

- Implement round() slightly different, so that for negative ndigits
no additional errors happen in the last step.

- The open() function now adds the filename to the exception when it
fails.

Built-in exceptions
-------------------

- New standard exceptions EnvironmentError and PosixError.
EnvironmentError is the base class for IOError and PosixError;
PosixError is the same as os.error.  All this so that either exception
class can be instantiated with a third argument indicating a filename.
The built-in function open() and most os/posix functions that take a
filename argument now use this.

Built-in types
--------------

- List objects now have an experimental pop() method; l.pop() returns
and removes the last item; l.pop(i) returns and removes the item at
i.  Also, the sort() method is faster again.  Sorting is now also
safer: it is impossible for the sorting function to modify the list
while the sort is going on (which could cause core dumps).

- Changes to comparisons: numbers are now smaller than any other type.
This is done to prevent the circularity where [] < 0L < 1 < [] is
true.  As a side effect, cmp(None, 0) is now positive instead of
negative.  This *shouldn't* affect any working code, but I've found
that the change caused several "sleeping" bugs to become active, so
beware!

- Instance methods may now have other callable objects than just
Python functions as their im_func.  Use new.instancemethod() or write
your own C code to create them; new.instancemethod() may be called
with None for the instance to create an unbound method.

- Assignment to __name__, __dict__ or __bases__ of a class object is
now allowed (with stringent type checks); also allow assignment to
__getattr__ etc.  The cached values for __getattr__ etc. are
recomputed after such assignments (but not for derived classes :-( ).

- Allow assignment to some attributes of function objects: func_code,
func_defaults and func_doc / __doc__.  (With type checks except for
__doc__ / func_doc .)

Python services
---------------

- New tests (in Lib/test): reperf.py (regular expression benchmark),
sortperf.py (list sorting benchmark), test_MimeWriter.py (test case
for the MimeWriter module).

- Generalized test/regrtest.py so that it is useful for testing other
packages.

- The ihooks.py module now understands package imports.

- In code.py, add a class that subsumes Fredrik Lundh's
PythonInterpreter class.  The interact() function now uses this.

- In rlcompleter.py, in completer(), return None instead of raising an
IndexError when there are no more completions left.

- Fixed the marshal module to test for certain common kinds of invalid
input.  (It's still not foolproof!)

- In the operator module, add an alias (now the preferred name)
"contains" for "sequenceincludes".

String Services
---------------

- In the string and strop modules, in the replace() function, treat an
empty pattern as an error (since it's not clear what was meant!).

- Some speedups to re.py, especially the string substitution and split
functions.  Also added new function/method findall(), to find all
occurrences of a given substring.

- In cStringIO, add better argument type checking and support the
readonly 'closed' attribute (like regular files).

- In the struct module, unsigned 1-2 byte sized formats no longer
result in long integer values.

Miscellaneous services
----------------------

- In whrandom.py, added new method and function randrange(), same as
choice(range(start, stop, step)) but faster.  This addresses the
problem that randint() was accidentally defined as taking an inclusive
range.  Also, randint(a, b) is now redefined as randrange(a, b+1),
adding extra range and type checking to its arguments!

- Add some semi-thread-safety to random.gauss() (it used to be able to 
crash when invoked from separate threads; now the worst it can do is
give a duplicate result occasionally).

- Some restructuring and generalization done to cmd.py.

- Major upgrade to ConfigParser.py; converted to using 're', added new 
exceptions, support underscore in section header and option name.  No
longer add 'name' option to every section; instead, add '__name__'.

- In getpass.py, don't use raw_input() to ask for the password -- we
don't want it to show up in the readline history!  Also don't catch
interrupts (the try-finally already does all necessary cleanup).

Generic OS Services
-------------------

- New functions in os.py: makedirs(), removedirs(), renames().  New
variable: linesep (the line separator as found in binary files,
i.e. '\n' on Unix, '\r\n' on DOS/Windows, '\r' on Mac.  Do *not* use
this with files opened in (default) text mode; the line separator used
will always be '\n'!

- Changes to the 'os.path' submodule of os.py: added getsize(),
getmtime(), getatime() -- these fetch the most popular items from the
stat return tuple.

- In the time module, add strptime(), if it exists.  (This parses a
time according to a format -- the inverse of strftime().)  Also,
remove the call to mktime() from strftime() -- it messed up the
formatting of some non-local times.

- In the socket module, added a new function gethostbyname_ex().
Also, don't use #ifdef to test for some symbols that are enums on some
platforms (and should exist everywhere).

Optional OS Services
--------------------

- Some fixes to gzip.py.  In particular, the readlines() method now
returns the lines *with* trailing newline characters, like readlines()
of regular file objects.  Also, it didn't work together with cPickle;
fixed that.

- In whichdb.py, support byte-swapped dbhash (bsddb) files.

- In anydbm.py, look at the type of an existing database to determine
which module to use to open it.  (The anydbm.error exception is now a
tuple.)

Unix Services
-------------

- In the termios module, in tcsetattr(), initialize the structure vy
calling tcgetattr().

- Added some of the "wait status inspection" macros as functions to
the posix module (and thus to the os module): WEXITSTATUS(),
WIFEXITED(), WIFSIGNALED(), WIFSTOPPED(), WSTOPSIG(), WTERMSIG().

- In the syslog module, make the default facility more intuitive
(matching the docs).

Debugger
--------

- In pdb.py, support for setting breaks on files/modules that haven't
been loaded yet.

Internet Protocols and Support
------------------------------

- Changes in urllib.py; sped up unquote() and quote().  Fixed an
obscure bug in quote_plus().  Added urlencode(dict) -- convenience
function for sending a POST request with urlopen().  Use the getpass
module to ask for a password.  Rewrote the (test) main program so that
when used as a script, it can retrieve one or more URLs to stdout.
Use -t to run the self-test.  Made the proxy code work again.

- In cgi.py, treat "HEAD" the same as "GET", so that CGI scripts don't
fail when someone asks for their HEAD.  Also, for POST, set the
default content-type to application/x-www-form-urlencoded.  Also, in
FieldStorage.__init__(), when method='GET', always get the query
string from environ['QUERY_STRING'] or sys.argv[1] -- ignore an
explicitly passed in fp.

- The smtplib.py module now supports ESMTP and has improved standard
compliance, for picky servers.

- Improved imaplib.py.

- Fixed UDP support in SocketServer.py (it never worked).

- Fixed a small bug in CGIHTTPServer.py.

Internet Data handling
----------------------

- In rfc822.py, add a new class AddressList.  Also support a new
overridable method, isheader().  Also add a get() method similar to
dictionaries (and make getheader() an alias for it).  Also, be smarter
about seekable (test whether fp.tell() works) and test for presence of
unread() method before trying seeks.

- In sgmllib.py, restore the call to report_unbalanced() that was lost
long ago.  Also some other improvements: handle <? processing
instructions >, allow . and - in entity names, and allow \r\n as line
separator.

- Some restructuring and generalization done to multifile.py; support
a 'seekable' flag.

Restricted Execution
--------------------

- Improvements to rexec.py: package support; support a (minimal)
sys.exc_info().  Also made the (test) main program a bit fancier (you
can now use it to run arbitrary Python scripts in restricted mode).

Tkinter
-------

- On Unix, Tkinter can now safely be used from a multi-threaded
application.  (Formerly, no threads would make progress while
Tkinter's mainloop() was active, because it didn't release the Python
interpreter lock.)  Unfortunately, on Windows, threads other than the
main thread should not call update() or update_idletasks() because
this will deadlock the application.

- An interactive interpreter that uses readline and Tkinter no longer
uses up all available CPU time.

- Even if readline is not used, Tk windows created in an interactive
interpreter now get continuously updated.  (This even works in Windows
as long as you don't hit a key.)

- New demos in Demo/tkinter/guido/: brownian.py, redemo.py, switch.py.

- No longer register Tcl_finalize() as a low-level exit handler.  It
may call back into Python, and that's a bad idea.

- Allow binding of Tcl commands (given as a string).

- Some minor speedups; replace explicitly coded getint() with int() in
most places.

- In FileDialog.py, remember the directory of the selected file, if
given.

- Change the names of all methods in the Wm class: they are now
wm_title(), etc.  The old names (title() etc.) are still defined as
aliases.

- Add a new method of interpreter objects, interpaddr().  This returns
the address of the Tcl interpreter object, as an integer.  Not very
useful for the Python programmer, but this can be called by another C
extension that needs to make calls into the Tcl/Tk C API and needs to
get the address of the Tcl interpreter object.  A simple cast of the
return value to (Tcl_Interp *) will do the trick.

Windows General
---------------

- Don't insist on proper case for module source files if the filename
is all uppercase (e.g. FOO.PY now matches foo; but FOO.py still
doesn't).  This should address problems with this feature on
oldfashioned filesystems (Novell servers?).

Windows Library
---------------

- os.environ is now all uppercase, but accesses are case insensitive,
and the putenv() calls made as a side effect of changing os.environ
are case preserving.

- Removed samefile(), sameopenfile(), samestat() from os.path (aka
ntpath.py) -- these cannot be made to work reliably (at least I
wouldn't know how).

- Fixed os.pipe() so that it returns file descriptors acceptable to
os.read() and os.write() (like it does on Unix), rather than Windows
file handles.

- Added a table of WSA error codes to socket.py.

- In the select module, put the (huge) file descriptor arrays on the
heap.

- The getpass module now raises KeyboardInterrupt when it sees ^C.

- In mailbox.py, fix tell/seek when using files opened in text mode.

- In rfc822.py, fix tell/seek when using files opened in text mode.

- In the msvcrt extension module, release the interpreter lock for
calls that may block: _locking(), _getch(), _getche().  Also fix a
bogus error return when open_osfhandle() doesn't have the right
argument list.

Windows Installer
-----------------

- The registry key used is now "1.5" instead of "1.5.x" -- so future
versions of 1.5 and Mark Hammond's win32all installer don't need to be 
resynchronized.

Windows Tools
-------------

- Several improvements to freeze specifically for Windows.

Windows Build Procedure
-----------------------

- The VC++ project files and the WISE installer have been moved to the
PCbuild subdirectory, so they are distributed in the same subdirectory
where they must be used.  This avoids confusion.

- New project files for Windows 3.1 port by Jim Ahlstrom.

- Got rid of the obsolete subdirectory PC/setup_nt/.

- The projects now use distinct filenames for the .exe, .dll, .lib and
.pyd files built in debug mode (by appending "_d" to the base name,
before the extension).  This makes it easier to switch between the two
and get the right versions.  There's a pragma in config.h that directs
the linker to include the appropriate .lib file (so python15.lib no
longer needs to be explicit in your project).

- The installer now installs more files (e.g. config.h).  The idea is
that you shouldn't need the source distribution if you want build your
own extensions in C or C++.

Tools and Demos
---------------

- New script nm2def.py by Marc-Andre Lemburg, to construct
PC/python_nt.def automatically (some hand editing still required).

- New tool ndiff.py: Tim Peters' text diffing tool.

- Various and sundry improvements to the freeze script.

- The script texi2html.py (which was part of the Doc tree but is no
longer used there) has been moved to the Tools/scripts subdirectory.

- Some generalizations in the webchecker code.  There's now a
primnitive gui for websucker.py: wsgui.py.  (In Tools/webchecker/.)

- The ftpmirror.py script now handles symbolic links properly, and
also files with multiple spaces in their names.

- The 1.5.1 tabnanny.py suffers an assert error if fed a script whose
last line is both indented and lacks a newline.  This is now fixed.

Python/C API
------------

- Added missing prototypes for PyEval_CallFunction() and
PyEval_CallMethod().

- New macro PyList_SET_ITEM().

- New macros to access object members for PyFunction, PyCFunction
objects.

- New APIs PyImport_AppendInittab() an PyImport_ExtendInittab() to
dynamically add one or many entries to the table of built-in modules.

- New macro Py_InitModule3(name, methods, doc) which calls
Py_InitModule4() with appropriate arguments.  (The -4 variant requires 
you to pass an obscure version number constant which is always the same.)

- New APIs PySys_WriteStdout() and PySys_WriteStderr() to write to
sys.stdout or sys.stderr using a printf-like interface.  (Used in
_tkinter.c, for example.)

- New APIs for conversion between Python longs and C 'long long' if
your compiler supports it.

- PySequence_In() is now called PySequence_Contains().
(PySequence_In() is still supported for b/w compatibility; it is
declared obsolete because its argument order is confusing.)

- PyDict_GetItem() and PyDict_GetItemString() are changed so that they
*never* raise an exception -- (even if the hash() fails, simply clear
the error).  This was necessary because there is lots of code out
there that already assumes this.

- Changes to PySequence_Tuple() and PySequence_List() to use the
length of a sequence only as a hint -- if an IndexError happens
earlier, take that.  (Formerly, this was considered an error.)

- Reformatted abstract.c to give it a more familiar "look" and fixed
many error checking bugs.

- Add NULL pointer checks to all calls of a C function through a type
object and extensions (e.g. nb_add).

- The code that initializes sys.path now calls Py_GetPythonHome()
instead of getenv("PYTHONHOME").  This, together with the new API
Py_SetPythonHome(), makes it easier for embedding applications to
change the notion of Python's "home" directory (where the libraries
etc. are sought).

- Fixed a very old bug in the parsing of "O?" format specifiers.


======================================================================


========================================
==> Release 1.5.1 (October 31, 1998) <==
========================================

From 1.5 to 1.5.1
=================

General
-------

- The documentation is now unbundled.  It has also been extensively
modified (mostly to implement a new and more uniform formatting
style).  We figure that most people will prefer to download one of the
preformatted documentation sets (HTML, PostScript or PDF) and that
only a minority have a need for the LaTeX or FrameMaker sources.  Of
course, the unbundled documentation sources still released -- just not
in the same archive file, and perhaps not on the same date.

- All bugs noted on the errors page (and many unnoted) are fixed.  All
new bugs take their places.

- No longer a core dump when attempting to print (or repr(), or str())
a list or dictionary that contains an instance of itself; instead, the
recursive entry is printed as [...] or {...}.  See Py_ReprEnter() and
Py_ReprLeave() below.  Comparisons of such objects still go beserk,
since this requires a different kind of fix; fortunately, this is a
less common scenario in practice.

Syntax change
-------------

- The raise statement can now be used without arguments, to re-raise 
a previously set exception.  This should be used after catching an
exception with an except clause only, either in the except clause or
later in the same function.

Import and module handling
--------------------------

- The implementation of import has changed to use a mutex (when
threading is supported).  This means that when two threads
simultaneously import the same module, the import statements are
serialized.  Recursive imports are not affected.

- Rewrote the finalization code almost completely, to be much more
careful with the order in which modules are destroyed.  Destructors
will now generally be able to reference built-in names such as None
without trouble.

- Case-insensitive platforms such as Mac and Windows require the case
of a module's filename to match the case of the module name as
specified in the import statement (see below).

- The code for figuring out the default path now distinguishes between
files, modules, executable files, and directories.  When expecting a
module, we also look for the .pyc or .pyo file.

Parser/tokenizer changes
------------------------

- The tokenizer can now warn you when your source code mixes tabs and
spaces for indentation in a manner that depends on how much a tab is
worth in spaces.  Use "python -t" or "python -v" to enable this
option.  Use "python -tt" to turn the warnings into errors.  (See also
tabnanny.py and tabpolice.py below.)

- Return unsigned characters from tok_nextc(), so '\377' isn't
mistaken for an EOF character.

- Fixed two pernicious bugs in the tokenizer that only affected AIX.
One was actually a general bug that was triggered by AIX's smaller I/O
buffer size.  The other was a bug in the AIX optimizer's loop
unrolling code; swapping two statements made the problem go away.

Tools, demos and miscellaneous files
------------------------------------

- There's a new version of Misc/python-mode.el (the Emacs mode for
Python) which is much smarter about guessing the indentation style
used in a particular file.  Lots of other cool features too!

- There are two new tools in Tools/scripts: tabnanny.py and
tabpolice.py, implementing two different ways of checking whether a
file uses indentation in a way that is sensitive to the interpretation
of a tab.  The preferred module is tabnanny.py (by Tim Peters).

- Some new demo programs:

	Demo/tkinter/guido/paint.py -- Dave Mitchell
	Demo/sockets/unixserver.py -- Piet van Oostrum
	

- Much better freeze support.  The freeze script can now freeze
hierarchical module names (with a corresponding change to import.c),
and has a few extra options (e.g. to suppress freezing specific
modules).  It also does much more on Windows NT.

- Version 1.0 of the faq wizard is included (only very small changes
since version 0.9.0).

- New feature for the ftpmirror script: when removing local files
(i.e., only when -r is used), do a recursive delete.

Configuring and building Python
-------------------------------

- Get rid of the check for -linet -- recent Sequent Dynix systems don't
need this any more and apparently it screws up their configuration.

- Some changes because gcc on SGI doesn't support '-all'.

- Changed the build rules to use $(LIBRARY) instead of
  -L.. -lpython$(VERSION)
since the latter trips up the SunOS 4.1.x linker (sigh).

- Fix the bug where the '# dgux is broken' comment in the Makefile
tripped over Make on some platforms.

- Changes for AIX: install the python.exp file; properly use
$(srcdir); the makexp_aix script now removes C++ entries of the form
Class::method.

- Deleted some Makefile targets only used by the (long obsolete)
gMakefile hacks.

Extension modules
-----------------

- Performance and threading improvements to the socket and bsddb
modules, by Christopher Lindblad of Infoseek.

- Added operator.__not__ and operator.not_.

- In the thread module, when a thread exits due to an unhandled
exception, don't store the exception information in sys.last_*; it
prevents proper calling of destructors of local variables.

- Fixed a number of small bugs in the cPickle module.

- Changed find() and rfind() in the strop module so that
find("x","",2) returns -1, matching the implementation in string.py.

- In the time module, be more careful with the result of ctime(), and
test for HAVE_MKTIME before usinmg mktime().

- Doc strings contributed by Mitch Chapman to the termios, pwd, gdbm
modules.

- Added the LOG_SYSLOG constant to the syslog module, if defined.

Standard library modules
------------------------

- All standard library modules have been converted to an indentation
style using either only tabs or only spaces -- never a mixture -- if
they weren't already consistent according to tabnanny.  This means
that the new -t option (see above) won't complain about standard
library modules.

- New standard library modules:

	threading -- GvR and the thread-sig
		Java style thread objects -- USE THIS!!!

	getpass -- Piers Lauder
		simple utilities to prompt for a password and to
		retrieve the current username

	imaplib -- Piers Lauder
		interface for the IMAP4 protocol

	poplib -- David Ascher, Piers Lauder
		interface for the POP3 protocol

	smtplib -- Dragon De Monsyne
		interface for the SMTP protocol

- Some obsolete modules moved to a separate directory (Lib/lib-old)
which is *not* in the default module search path:

	Para
	addpack
	codehack
	fmt
	lockfile
	newdir
	ni
	rand
	tb

- New version of the PCRE code (Perl Compatible Regular Expressions --
the re module and the supporting pcre extension) by Andrew Kuchling.
Incompatible new feature in re.sub(): the handling of escapes in the
replacement string has changed.

- Interface change in the copy module: a __deepcopy__ method is now
called with the memo dictionary as an argument.

- Feature change in the tokenize module: differentiate between NEWLINE
token (an official newline) and NL token (a newline that the grammar
ignores).

- Several bugfixes to the urllib module.  It is now truly thread-safe,
and several bugs and a portability problem have been fixed.  New
features, all due to Sjoerd Mullender: When creating a temporary file,
it gives it an appropriate suffix.  Support the "data:" URL scheme.
The open() method uses the tempcache.

- New version of the xmllib module (this time with a test suite!) by
Sjoerd Mullender.

- Added debugging code to the telnetlib module, to be able to trace
the actual traffic.

- In the rfc822 module, added support for deleting a header (still no
support for adding headers, though).  Also fixed a bug where an
illegal address would cause a crash in getrouteaddr(), fixed a
sign reversal in mktime_tz(), and use the local timezone by default
(the latter two due to Bill van Melle).

- The normpath() function in the dospath and ntpath modules no longer
does case normalization -- for that, use the separate function
normcase() (which always existed); normcase() has been sped up and
fixed (it was the cause of a crash in Mark Hammond's installer in
certain locales).

- New command supported by the ftplib module: rmd(); also fixed some
minor bugs.

- The profile module now uses a different timer function by default -- 
time.clock() is generally better than os.times().  This makes it work
better on Windows NT, too.

- The tempfile module now recovers when os.getcwd() raises an
exception.

- Fixed some bugs in the random module; gauss() was subtly wrong, and
vonmisesvariate() should return a full circle.  Courtesy Mike Miller,
Lambert Meertens (gauss()), and Magnus Kessler (vonmisesvariate()).

- Better default seed in the whrandom module, courtesy Andrew Kuchling.

- Fix slow close() in shelve module.

- The Unix mailbox class in the mailbox module is now more robust when
a line begins with the string "From " but is definitely not the start
of a new message.  The pattern used can be changed by overriding a
method or class variable.

- Added a rmtree() function to the copy module.

- Fixed several typos in the pickle module.  Also fixed problems when
unpickling in restricted execution environments.

- Added docstrings and fixed a typo in the py_compile and compileall
modules.  At Mark Hammond's repeated request, py_compile now append a
newline to the source if it needs one.  Both modules support an extra
parameter to specify the purported source filename (to be used in
error messages).

- Some performance tweaks by Jeremy Hylton to the gzip module.

- Fixed a bug in the merge order of dictionaries in the ConfigParser
module.  Courtesy Barry Warsaw.

- In the multifile module, support the optional second parameter to
seek() when possible.

- Several fixes to the gopherlib module by Lars Marius Garshol.  Also, 
urlparse now correctly handles Gopher URLs with query strings.

- Fixed a tiny bug in format_exception() in the traceback module.
Also rewrite tb_lineno() to be compatible with JPython (and not
disturb the current exception!); by Jim Hugunin.

- The httplib module is more robust when servers send a short response 
-- courtesy Tim O'Malley.

Tkinter and friends
-------------------

- Various typos and bugs fixed.

- New module Tkdnd implements a drag-and-drop protocol (within one
application only).

- The event_*() widget methods have been restructured slightly -- they
no longer use the default root.

- The interfaces for the bind*() and unbind() widget methods have been
redesigned; the bind*() methods now return the name of the Tcl command 
created for the callback, and this can be passed as a optional
argument to unbind() in order to delete the command (normally, such
commands are automatically unbound when the widget is destroyed, but
for some applications this isn't enough).

- Variable objects now have trace methods to interface to Tcl's
variable tracing facilities.

- Image objects now have an optional keyword argument, 'master', to
specify a widget (tree) to which they belong.  The image_names() and
image_types() calls are now also widget methods.

- There's a new global call, Tkinter.NoDefaultRoot(), which disables
all use of the default root by the Tkinter library.  This is useful to
debug applications that are in the process of being converted from
relying on the default root to explicit specification of the root
widget.

- The 'exit' command is deleted from the Tcl interpreter, since it
provided a loophole by which one could (accidentally) exit the Python
interpreter without invoking any cleanup code.

- Tcl_Finalize() is now registered as a Python low-level exit handle,
so Tcl will be finalized when Python exits.

The Python/C API
----------------

- New function PyThreadState_GetDict() returns a per-thread dictionary
intended for storing thread-local global variables.

- New functions Py_ReprEnter() and Py_ReprLeave() use the per-thread
dictionary to allow recursive container types to detect recursion in
their repr(), str() and print implementations.

- New function PyObject_Not(x) calculates (not x) according to Python's 
standard rules (basically, it negates the outcome PyObject_IsTrue(x).

- New function _PyModule_Clear(), which clears a module's dictionary
carefully without removing the __builtins__ entry.  This is implied
when a module object is deallocated (this used to clear the dictionary
completely).

- New function PyImport_ExecCodeModuleEx(), which extends
PyImport_ExecCodeModule() by adding an extra parameter to pass it the
true file.

- New functions Py_GetPythonHome() and Py_SetPythonHome(), intended to
allow embedded applications to force a different value for PYTHONHOME.

- New global flag Py_FrozenFlag is set when this is a "frozen" Python
binary; it suppresses warnings about not being able to find the
standard library directories.

- New global flag Py_TabcheckFlag is incremented by the -t option and
causes the tokenizer to issue warnings or errors about inconsistent
mixing of tabs and spaces for indentation.

Miscellaneous minor changes and bug fixes
-----------------------------------------

- Improved the error message when an attribute of an attribute-less
object is requested -- include the name of the attribute and the type
of the object in the message.

- Sped up int(), long(), float() a bit.

- Fixed a bug in list.sort() that would occasionally dump core.

- Fixed a bug in PyNumber_Power() that caused numeric arrays to fail
when taken tothe real power.

- Fixed a number of bugs in the file reading code, at least one of
which could cause a core dump on NT, and one of which would
occasionally cause file.read() to return less than the full contents
of the file.

- Performance hack by Vladimir Marangozov for stack frame creation.

- Make sure setvbuf() isn't used unless HAVE_SETVBUF is defined.

Windows 95/NT
-------------

- The .lib files are now part of the distribution; they are collected
in the subdirectory "libs" of the installation directory.

- The extension modules (.pyd files) are now collected in a separate
subdirectory of the installation directory named "DLLs".

- The case of a module's filename must now match the case of the
module name as specified in the import statement.  This is an
experimental feature -- if it turns out to break in too many
situations, it will be removed (or disabled by default) in the future.
It can be disabled on a per-case basis by setting the environment
variable PYTHONCASEOK (to any value).


======================================================================


=====================================
==> Release 1.5 (January 3, 1998) <==
=====================================


From 1.5b2 to 1.5
=================

- Newly documentated module: BaseHTTPServer.py, thanks to Greg Stein.

- Added doc strings to string.py, stropmodule.c, structmodule.c,
thanks to Charles Waldman.

- Many nits fixed in the manuals, thanks to Fred Drake and many others
(especially Rob Hooft and Andrew Kuchling).  The HTML version now uses
HTML markup instead of inline GIF images for tables; only two images
are left (for obsure bits of math).  The index of the HTML version has
also been much improved.  Finally, it is once again possible to
generate an Emacs info file from the library manual (but I don't
commit to supporting this in future versions).

- New module: telnetlib.py (a simple telnet client library).

- New tool: Tools/versioncheck/, by Jack Jansen.

- Ported zlibmodule.c and bsddbmodule.c to NT; The project file for MS
DevStudio 5.0 now includes new subprojects to build the zlib and bsddb
extension modules.

- Many small changes again to Tkinter.py -- mostly bugfixes and adding
missing routines.  Thanks to Greg McFarlane for reporting a bunch of
problems and proofreading my fixes.

- The re module and its documentation are up to date with the latest
version released to the string-sig (Dec. 22).

- Stop test_grp.py from failing when the /etc/group file is empty
(yes, this happens!).

- Fix bug in integer conversion (mystrtoul.c) that caused
4294967296==0 to be true!

- The VC++ 4.2 project file should be complete again.

- In tempfile.py, use a better template on NT, and add a new optional
argument "suffix" with default "" to specify a specific extension for
the temporary filename (needed sometimes on NT but perhaps also handy
elsewhere).

- Fixed some bugs in the FAQ wizard, and converted it to use re
instead of regex.

- Fixed a mysteriously undetected error in dlmodule.c (it was using a
totally bogus routine name to raise an exception).

- Fixed bug in import.c which wasn't using the new "dos-8x3" name yet.

- Hopefully harmless changes to the build process to support shared
libraries on DG/UX.  This adds a target to create
libpython$(VERSION).so; however this target is *only* for DG/UX.

- Fixed a bug in the new format string error checking in getargs.c.

- A simple fix for infinite recursion when printing __builtins__:
reset '_' to None before printing and set it to the printed variable
*after* printing (and only when printing is successful).

- Fixed lib-tk/SimpleDialog.py to keep the dialog visible even if the
parent window is not (Skip Montanaro).

- Fixed the two most annoying problems with ftp URLs in
urllib.urlopen(); an empty file now correctly raises an error, and it
is no longer required to explicitly close the returned "file" object
before opening another ftp URL to the same host and directory.


======================================================================


From 1.5b1 to 1.5b2
===================

- Fixed a bug in cPickle.c that caused it to crash right away because
the version string had a different format.

- Changes in pickle.py and cPickle.c: when unpickling an instance of a
class that doesn't define the __getinitargs__() method, the __init__()
constructor is no longer called.  This makes a much larger group of
classes picklable by default, but may occasionally change semantics.
To force calling __init__() on unpickling, define a __getinitargs__()
method.  Other changes too, in particular cPickle now handles classes
defined in packages correctly.  The same change applies to copying
instances with copy.py.  The cPickle.c changes and some pickle.py
changes are courtesy Jim Fulton.

- Locale support in he "re" (Perl regular expressions) module.  Use 
the flag re.L (or re.LOCALE) to enable locale-specific matching
rules for \w and \b.  The in-line syntax for this flag is (?L).

- The built-in function isinstance(x, y) now also succeeds when y is
a type object and type(x) is y.

- repr() and str() of class and instance objects now reflect the
package/module in which the class is defined.

- Module "ni" has been removed.  (If you really need it, it's been
renamed to "ni1".  Let me know if this causes any problems for you.
Package authors are encouraged to write __init__.py files that
support both ni and 1.5 package support, so the same version can be
used with Python 1.4 as well as 1.5.)

- The thread module is now automatically included when threads are
configured.  (You must remove it from your existing Setup file,
since it is now in its own Setup.thread file.)

- New command line option "-x" to skip the first line of the script;
handy to make executable scripts on non-Unix platforms.

- In importdl.c, add the RTLD_GLOBAL to the dlopen() flags.  I
haven't checked how this affects things, but it should make symbols
in one shared library available to the next one.

- The Windows installer now installs in the "Program Files" folder on
the proper volume by default.

- The Windows configuration adds a new main program, "pythonw", and
registers a new extension, ".pyw" that invokes this.  This is a
pstandard Python interpreter that does not pop up a console window;
handy for pure Tkinter applications.  All output to the original
stdout and stderr is lost; reading from the original stdin yields
EOF.  Also, both python.exe and pythonw.exe now have a pretty icon
(a green snake in a box, courtesy Mark Hammond).

- Lots of improvements to emacs-mode.el again.  See Barry's web page:
http://www.python.org/ftp/emacs/pmdetails.html.

- Lots of improvements and additions to the library reference manual;
many by Fred Drake.

- Doc strings for the following modules: rfc822.py, posixpath.py,
ntpath.py, httplib.py.  Thanks to Mitch Chapman and Charles Waldman.

- Some more regression testing.

- An optional 4th (maxsplit) argument to strop.replace().

- Fixed handling of maxsplit in string.splitfields().

- Tweaked os.environ so it can be pickled and copied.

- The portability problems caused by indented preprocessor commands
and C++ style comments should be gone now.

- In random.py, added Pareto and Weibull distributions.

- The crypt module is now disabled in Modules/Setup.in by default; it
is rarely needed and causes errors on some systems where users often
don't know how to deal with those.

- Some improvements to the _tkinter build line suggested by Case Roole.

- A full suite of platform specific files for NetBSD 1.x, submitted by 
Anders Andersen.

- New Solaris specific header STROPTS.py.

- Moved a confusing occurrence of *shared* from the comments in
Modules/Setup.in (people would enable this one instead of the real
one, and get disappointing results).

- Changed the default mode for directories to be group-writable when
the installation process creates them.

- Check for pthread support in "-l_r" for FreeBSD/NetBSD, and support
shared libraries for both.

- Support FreeBSD and NetBSD in posixfile.py.

- Support for the "event" command, new in Tk 4.2.  By Case Roole.

- Add Tix_SafeInit() support to tkappinit.c.

- Various bugs fixed in "re.py" and "pcre.c".

- Fixed a bug (broken use of the syntax table) in the old "regexpr.c".

- In frozenmain.c, stdin is made unbuffered too when PYTHONUNBUFFERED
is set.

- Provide default blocksize for retrbinary in ftplib.py (Skip
Montanaro).

- In NT, pick the username up from different places in user.py (Jeff
Bauer).

- Patch to urlparse.urljoin() for ".." and "..#1", Marc Lemburg.

- Many small improvements to Jeff Rush' OS/2 support.

- ospath.py is gone; it's been obsolete for so many years now...

- The reference manual is now set up to prepare better HTML (still
using webmaker, alas).

- Add special handling to /Tools/freeze for Python modules that are
imported implicitly by the Python runtime: 'site' and 'exceptions'.

- Tools/faqwiz 0.8.3 -- add an option to suppress URL processing
inside <PRE>, by "Scott".

- Added ConfigParser.py, a generic parser for sectioned configuration
files.

- In _localemodule.c, LC_MESSAGES is not always defined; put it
between #ifdefs.

- Typo in resource.c: RUSAGE_CHILDERN -> RUSAGE_CHILDREN.

- Demo/scripts/newslist.py: Fix the way the version number is gotten
out of the RCS revision.

- PyArg_Parse[Tuple] now explicitly check for bad characters at the
end of the format string.

- Revamped PC/example_nt to support VC++ 5.x.

- <listobject>.sort() now uses a modified quicksort by Raymund Galvin,
after studying the GNU libg++ quicksort.  This should be much faster
if there are lots of duplicates, and otherwise at least as good.

- Added "uue" as an alias for "uuencode" to mimetools.py.  (Hm, the
uudecode bug where it complaints about trailing garbage is still there 
:-( ).

- pickle.py requires integers in text mode to be in decimal notation
(it used to accept octal and hex, even though it would only generate
decimal numbers).

- In string.atof(), don't fail when the "re" module is unavailable.
Plug the ensueing security leak by supplying an empty __builtins__
directory to eval().

- A bunch of small fixes and improvements to Tkinter.py.

- Fixed a buffer overrun in PC/getpathp.c.


======================================================================


From 1.5a4 to 1.5b1
===================

- The Windows NT/95 installer now includes full HTML of all manuals.
It also has a checkbox that lets you decide whether to install the
interpreter and library.  The WISE installer script for the installer
is included in the source tree as PC/python15.wse, and so are the
icons used for Python files.  The config.c file for the Windows build
is now complete with the pcre module.

- sys.ps1 and sys.ps2 can now arbitrary objects; their str() is
evaluated for the prompt.

- The reference manual is brought up to date (more or less -- it still
needs work, e.g. in the area of package import).

- The icons used by latex2html are now included in the Doc
subdirectory (mostly so that tarring up the HTML files can be fully
automated).  A simple index.html is also added to Doc (it only works
after you have successfully run latex2html).

- For all you would-be proselytizers out there: a new version of
Misc/BLURB describes Python more concisely, and Misc/comparisons
compares Python to several other languages.  Misc/BLURB.WINDOWS
contains a blurb specifically aimed at Windows programmers (by Mark
Hammond).

- A new version of the Python mode for Emacs is included as
Misc/python-mode.el.  There are too many new features to list here.
See http://www.python.org/ftp/emacs/pmdetails.html for more info.

- New module fileinput makes iterating over the lines of a list of
files easier.  (This still needs some more thinking to make it more
extensible.)

- There's full OS/2 support, courtesy Jeff Rush.  To build the OS/2
version, see PC/readme.txt and PC/os2vacpp.  This is for IBM's Visual
Age C++ compiler.  I expect that Jeff will also provide a binary
release for this platform.

- On Linux, the configure script now uses '-Xlinker -export-dynamic'
instead of '-rdynamic' to link the main program so that it exports its
symbols to shared libraries it loads dynamically.  I hope this doesn't
break on older Linux versions; it is needed for mklinux and appears to
work on Linux 2.0.30.

- Some Tkinter resstructuring: the geometry methods that apply to a
master are now properly usable on toplevel master widgets.  There's a
new (internal) widget class, BaseWidget.  New, longer "official" names
for the geometry manager methods have been added,
e.g. "grid_columnconfigure()" instead of "columnconfigure()".  The old
shorter names still work, and where there's ambiguity, pack wins over
place wins over grid.  Also, the bind_class method now returns its
value.

- New, RFC-822 conformant parsing of email addresses and address lists
in the rfc822 module, courtesy Ben Escoto.

- New, revamped tkappinit.c with support for popular packages (PIL,
TIX, BLT, TOGL).  For the last three, you need to execute the Tcl
command "load {} Tix" (or Blt, or Togl) to gain access to them.
The Modules/Setup line for the _tkinter module has been rewritten
using the cool line-breaking feature of most Bourne shells.

- New socket method connect_ex() returns the error code from connect()
instead of raising an exception on errors; this makes the logic
required for asynchronous connects simpler and more efficient.

- New "locale" module with (still experimental) interface to the
standard C library locale interface, courtesy Martin von Löwis.  This
does not repeat my mistake in 1.5a4 of always calling
setlocale(LC_ALL, "").  In fact, we've pretty much decided that
Python's standard numerical formatting operations should always use
the conventions for the C locale; the locale module contains utility
functions to format numbers according to the user specified locale.
(All this is accomplished by an explicit call to setlocale(LC_NUMERIC,
"C") after locale-changing calls.)  See the library manual. (Alas, the
promised changes to the "re" module for locale support have not been
materialized yet.  If you care, volunteer!)

- Memory leak plugged in Py_BuildValue when building a dictionary.

- Shared modules can now live inside packages (hierarchical module
namespaces).  No changes to the shared module itself are needed.

- Improved policy for __builtins__: this is a module in __main__ and a
dictionary everywhere else.

- Python no longer catches SIGHUP and SIGTERM by default.  This was
impossible to get right in the light of thread contexts.  If you want
your program to clean up when a signal happens, use the signal module
to set up your own signal handler.

- New Python/C API PyNumber_CoerceEx() does not return an exception
when no coercion is possible.  This is used to fix a problem where
comparing incompatible numbers for equality would raise an exception
rather than return false as in Python 1.4 -- it once again will return
false.

- The errno module is changed again -- the table of error messages
(errorstr) is removed.  Instead, you can use os.strerror().  This
removes redundance and a potential locale dependency.

- New module xmllib, to parse XML files.  By Sjoerd Mullender.

- New C API PyOS_AfterFork() is called after fork() in posixmodule.c.
It resets the signal module's notion of what the current process ID
and thread are, so that signal handlers will work after (and across)
calls to os.fork().

- Fixed most occurrences of fatal errors due to missing thread state.

- For vgrind (a flexible source pretty printer) fans, there's a simple
Python definition in Misc/vgrindefs, courtesy Neale Pickett.

- Fixed memory leak in exec statement.

- The test.pystone module has a new function, pystones(loops=LOOPS),
which returns a (benchtime, stones) tuple.  The main() function now
calls this and prints the report.

- Package directories now *require* the presence of an __init__.py (or
__init__.pyc) file before they are considered as packages.  This is
done to prevent accidental subdirectories with common names from
overriding modules with the same name.

- Fixed some strange exceptions in __del__ methods in library modules
(e.g. urllib).  This happens because the built-in names are already
deleted by the time __del__ is called.  The solution (a hack, but it
works) is to set some instance variables to 0 instead of None.

- The table of built-in module initializers is replaced by a pointer
variable.  This makes it possible to switch to a different table at
run time, e.g. when a collection of modules is loaded from a shared
library.  (No example code of how to do this is given, but it is
possible.)  The table is still there of course, its name prefixed with
an underscore and used to initialize the pointer.

- The warning about a thread still having a frame now only happens in
verbose mode.

- Change the signal finialization so that it also resets the signal
handlers.  After this has been called, our signal handlers are no
longer active!

- New version of tokenize.py (by Ka-Ping Yee) recognizes raw string
literals.  There's now also a test fort this module.

- The copy module now also uses __dict__.update(state) instead of
going through individual attribute assignments, for class instances
without a __setstate__ method.

- New module reconvert translates old-style (regex module) regular
expressions to new-style (re module, Perl-style) regular expressions.

- Most modules that used to use the regex module now use the re
module.  The grep module has a new pgrep() function which uses
Perl-style regular expressions.

- The (very old, backwards compatibility) regexp.py module has been
deleted.

- Restricted execution (rexec): added the pcre module (support for the
re module) to the list of trusted extension modules.

- New version of Jim Fulton's CObject object type, adds
PyCObject_FromVoidPtrAndDesc() and PyCObject_GetDesc() APIs.

- Some patches to Lee Busby's fpectl mods that accidentally didn't
make it into 1.5a4.

- In the string module, add an optional 4th argument to count(),
matching find() etc.

- Patch for the nntplib module by Charles Waldman to add optional user
and password arguments to NNTP.__init__(), for nntp servers that need
them.

- The str() function for class objects now returns
"modulename.classname" instead of returning the same as repr().

- The parsing of \xXX escapes no longer relies on sscanf().

- The "sharedmodules" subdirectory of the installation is renamed to
"lib-dynload".  (You may have to edit your Modules/Setup file to fix
this in an existing installation!)

- Fixed Don Beaudry's mess-up with the OPT test in the configure
script.  Certain SGI platforms will still issue a warning for each
compile; there's not much I can do about this since the compiler's
exit status doesn't indicate that I was using an obsolete option.

- Fixed Barry's mess-up with {}.get(), and added test cases for it.

- Shared libraries didn't quite work under AIX because of the change
in status of the GNU readline interface.  Fix due to by Vladimir
Marangozov.


======================================================================


From 1.5a3 to 1.5a4
===================

- faqwiz.py: version 0.8; Recognize https:// as URL; <html>...</html>
feature; better install instructions; removed faqmain.py (which was an
older version).

- nntplib.py: Fixed some bugs reported by Lars Wirzenius (to Debian)
about the treatment of lines starting with '.'.  Added a minimal test
function.

- struct module: ignore most whitespace in format strings.

- urllib.py: close the socket and temp file in URLopener.retrieve() so
that multiple retrievals using the same connection work.

- All standard exceptions are now classes by default; use -X to make
them strings (for backward compatibility only).

- There's a new standard exception hierarchy, defined in the standard
library module exceptions.py (which you never need to import
explicitly).  See
http://grail.cnri.reston.va.us/python/essays/stdexceptions.html for
more info.

- Three new C API functions:

  - int PyErr_GivenExceptionMatches(obj1, obj2)

    Returns 1 if obj1 and obj2 are the same object, or if obj1 is an
    instance of type obj2, or of a class derived from obj2

  - int PyErr_ExceptionMatches(obj)

    Higher level wrapper around PyErr_GivenExceptionMatches() which uses
    PyErr_Occurred() as obj1.  This will be the more commonly called
    function.

  - void PyErr_NormalizeException(typeptr, valptr, tbptr)

    Normalizes exceptions, and places the normalized values in the
    arguments.  If type is not a class, this does nothing.  If type is a
    class, then it makes sure that value is an instance of the class by:

    1. if instance is of the type, or a class derived from type, it does
       nothing.

    2. otherwise it instantiates the class, using the value as an
       argument.  If value is None, it uses an empty arg tuple, and if
       the value is a tuple, it uses just that.

- Another new C API function: PyErr_NewException() creates a new
exception class derived from Exception; when -X is given, it creates a
new string exception.

- core interpreter: remove the distinction between tuple and list
unpacking; allow an arbitrary sequence on the right hand side of any
unpack instruction.  (UNPACK_LIST and UNPACK_TUPLE now do the same
thing, which should really be called UNPACK_SEQUENCE.)

- classes: Allow assignments to an instance's __dict__ or __class__,
so you can change ivars (including shared ivars -- shock horror) and
change classes dynamically.  Also make the check on read-only
attributes of classes less draconic -- only the specials names
__dict__, __bases__, __name__ and __{get,set,del}attr__ can't be
assigned.

- Two new built-in functions: issubclass() and isinstance().  Both
take classes as their second arguments.  The former takes a class as
the first argument and returns true iff first is second, or is a
subclass of second.  The latter takes any object as the first argument
and returns true iff first is an instance of the second, or any
subclass of second.

- configure: Added configuration tests for presence of alarm(),
pause(), and getpwent().

- Doc/Makefile: changed latex2html targets.

- classes: Reverse the search order for the Don Beaudry hook so that
the first class with an applicable hook wins.  Makes more sense.

- Changed the checks made in Py_Initialize() and Py_Finalize().  It is
now legal to call these more than once.  The first call to
Py_Initialize() initializes, the first call to Py_Finalize()
finalizes.  There's also a new API, Py_IsInitalized() which checks
whether we are already initialized (in case you want to leave things
as they were).

- Completely disable the declarations for malloc(), realloc() and
free().  Any 90's C compiler has these in header files, and the tests
to decide whether to suppress the declarations kept failing on some
platforms.

- *Before* (instead of after) signalmodule.o is added, remove both
intrcheck.o and sigcheck.o.  This should get rid of warnings in ar or
ld on various systems.

- Added reop to PC/config.c

- configure: Decided to use -Aa -D_HPUX_SOURCE on HP-UX platforms.
Removed outdated HP-UX comments from README.  Added Cray T3E comments.

- Various renames of statically defined functions that had name
conflicts on some systems, e.g. strndup (GNU libc), join (Cray),
roundup (sys/types.h).

- urllib.py: Interpret three slashes in file: URL as local file (for
Netscape on Windows/Mac).

- copy.py: Make sure the objects returned by __getinitargs__() are
kept alive (in the memo) to avoid a certain kind of nasty crash.  (Not
easily reproducable because it requires a later call to
__getinitargs__() to return a tuple that happens to be allocated at
the same address.)

- Added definition of AR to toplevel Makefile.  Renamed @buildno temp
file to buildno1.

- Moved Include/assert.h to Parser/assert.h, which seems to be the
only place where it's needed.

- Tweaked the dictionary lookup code again for some more speed
(Vladimir Marangozov).

- NT build: Changed the way python15.lib is included in the other
projects.  Per Mark Hammond's suggestion, add it to the extra libs in
Settings instead of to the project's source files.

- regrtest.py: Change default verbosity so that there are only three
levels left: -q, default and -v.  In default mode, the name of each
test is now printed.  -v is the same as the old -vv.  -q is more quiet
than the old default mode.

- Removed the old FAQ from the distribution.  You now have to get it
from the web!

- Removed the PC/make_nt.in file from the distribution; it is no
longer needed.

- Changed the build sequence so that shared modules are built last.
This fixes things for AIX and doesn't hurt elsewhere.

- Improved test for GNU MP v1 in mpzmodule.c

- fileobject.c: ftell() on Linux discards all buffered data; changed
read() code to use lseek() instead to get the same effect

- configure.in, configure, importdl.c: NeXT sharedlib fixes

- tupleobject.c: PyTuple_SetItem asserts refcnt==1

- resource.c: Different strategy regarding whether to declare
getrusage() and getpagesize() -- #ifdef doesn't work, Linux has
conflicting decls in its headers.  Choice: only declare the return
type, not the argument prototype, and not on Linux.

- importdl.c, configure*: set sharedlib extensions properly for NeXT

- configure*, Makefile.in, Modules/Makefile.pre.in: AIX shared libraries
fixed; moved addition of PURIFY to LINKCC to configure

- reopmodule.c, regexmodule.c, regexpr.c, zlibmodule.c: needed casts
added to shup up various compilers.

- _tkinter.c: removed buggy mac #ifndef

- Doc: various Mac documentation changes, added docs for 'ic' module

- PC/make_nt.in: deleted

- test_time.py, test_strftime.py: tweaks to catch %Z (which may return
"")

- test_rotor.py: print b -> print `b`

- Tkinter.py: (tagOrId) -> (tagOrId,)

- Tkinter.py: the Tk class now also has a configure() method and
friends (they have been moved to the Misc class to accomplish this).

- dict.get(key[, default]) returns dict[key] if it exists, or default
if it doesn't.  The default defaults to None.  This is quicker for
some applications than using either has_key() or try:...except
KeyError:....

- Tools/webchecker/: some small changes to webchecker.py; added
websucker.py (a simple web site mirroring script).

- Dictionary objects now have a get() method (also in UserDict.py).
dict.get(key, default) returns dict[key] if it exists and default
otherwise; default defaults to None.

- Tools/scripts/logmerge.py: print the author, too.

- Changes to import: support for "import a.b.c" is now built in.  See
http://grail.cnri.reston.va.us/python/essays/packages.html
for more info.  Most important deviations from "ni.py": __init__.py is
executed in the package's namespace instead of as a submodule; and
there's no support for "__" or "__domain__".  Note that "ni.py" is not
changed to match this -- it is simply declared obsolete (while at the
same time, it is documented...:-( ).
Unfortunately, "ihooks.py" has not been upgraded (but see "knee.py"
for an example implementation of hierarchical module import written in
Python).

- More changes to import: the site.py module is now imported by
default when Python is initialized; use -S to disable it.  The site.py
module extends the path with several more directories: site-packages
inside the lib/python1.5/ directory, site-python in the lib/
directory, and pathnames mentioned in *.pth files found in either of
those directories.  See
http://grail.cnri.reston.va.us/python/essays/packages.html
for more info.

- Changes to standard library subdirectory names: those subdirectories
that are not packages have been renamed with a hypen in their name,
e.g. lib-tk, lib-stdwin, plat-win, plat-linux2, plat-sunos5, dos-8x3.
The test suite is now a package -- to run a test, you must now use
"import test.test_foo".

- A completely new re.py module is provided (thanks to Andrew
Kuchling, Tim Peters and Jeffrey Ollie) which uses Philip Hazel's
"pcre" re compiler and engine.  For a while, the "old" re.py (which
was new in 1.5a3!) will be kept around as re1.py.  The "old" regex
module and underlying parser and engine are still present -- while
regex is now officially obsolete, it will probably take several major
release cycles before it can be removed.

- The posix module now has a strerror() function which translates an
error code to a string.

- The emacs.py module (which was long obsolete) has been removed.

- The universal makefile Misc/Makefile.pre.in now features an
"install" target.  By default, installed shared libraries go into
$exec_prefix/lib/python$VERSION/site-packages/.

- The install-sh script is installed with the other configuration
specific files (in the config/ subdirectory).

- It turns out whatsound.py and sndhdr.py were identical modules.
Since there's also an imghdr.py file, I propose to make sndhdr.py the
official one.  For compatibility, whatsound.py imports * from
sndhdr.py.

- Class objects have a new attribute, __module__, giving the name of
the module in which they were declared.  This is useful for pickle and
for printing the full name of a class exception.

- Many extension modules no longer issue a fatal error when their
initialization fails; the importing code now checks whether an error
occurred during module initialization, and correctly propagates the
exception to the import statement.

- Most extension modules now raise class-based exceptions (except when
-X is used).

- Subtle changes to PyEval_{Save,Restore}Thread(): always swap the
thread state -- just don't manipulate the lock if it isn't there.

- Fixed a bug in Python/getopt.c that made it do the wrong thing when
an option was a single '-'.  Thanks to Andrew Kuchling.

- New module mimetypes.py will guess a MIME type from a filename's
extension.

- Windows: the DLL version is now settable via a resource rather than
being hardcoded.  This can be used for "branding" a binary Python
distribution.

- urllib.py is now threadsafe -- it now uses re instead of regex, and
sys.exc_info() instead of sys.exc_{type,value}.

- Many other library modules that used to use
sys.exc_{type,value,traceback} are now more thread-safe by virtue of
using sys.exc_info().

- The functions in popen2 have an optional buffer size parameter.
Also, the command argument can now be either a string (passed to the
shell) or a list of arguments (passed directly to execv).

- Alas, the thread support for _tkinter released with 1.5a3 didn't
work.  It's been rewritten.  The bad news is that it now requires a
modified version of a file in the standard Tcl distribution, which you
must compile with a -I option pointing to the standard Tcl source
tree.  For this reason, the thread support is disabled by default.

- The errno extension module adds two tables: errorcode maps errno
numbers to errno names (e.g. EINTR), and errorstr maps them to
message strings.  (The latter is redundant because the new call
posix.strerror() now does the same, but alla...)  (Marc-Andre Lemburg)

- The readline extension module now provides some interfaces to
internal readline routines that make it possible to write a completer
in Python.  An example completer, rlcompleter.py, is provided.

	When completing a simple identifier, it completes keywords,
	built-ins and globals in __main__; when completing
	NAME.NAME..., it evaluates (!) the expression up to the last
	dot and completes its attributes.

	It's very cool to do "import string" type "string.", hit the
	completion key (twice), and see the list of names defined by
	the string module!

	Tip: to use the tab key as the completion key, call

	    readline.parse_and_bind("tab: complete")

- The traceback.py module has a new function tb_lineno() by Marc-Andre
Lemburg which extracts the line number from the linenumber table in
the code object.  Apparently the traceback object doesn't contains the
right linenumber when -O is used.  Rather than guessing whether -O is
on or off, the module itself uses tb_lineno() unconditionally.

- Fixed Demo/tkinter/matt/canvas-moving-or-creating.py: change bind()
to tag_bind() so it works again.

- The pystone script is now a standard library module.  Example use:
"import test.pystone; test.pystone.main()".

- The import of the readline module in interactive mode is now also
attempted when -i is specified.  (Yes, I know, giving in to Marc-Andre
Lemburg, who asked for this. :-)

- rfc822.py: Entirely rewritten parseaddr() function by Sjoerd
Mullender, to be closer to the standard.  This fixes the getaddr()
method.  Unfortunately, getaddrlist() is as broken as ever, since it
splits on commas without regard for RFC 822 quoting conventions.

- pprint.py: correctly emit trailing "," in singleton tuples.

- _tkinter.c: export names for its type objects, TkappType and
TkttType.

- pickle.py: use __module__ when defined; fix a particularly hard to
reproduce bug that confuses the memo when temporary objects are
returned by custom pickling interfaces; and a semantic change: when
unpickling the instance variables of an instance, use
inst.__dict__.update(value) instead of a for loop with setattr() over
the value.keys().  This is more consistent (the pickling doesn't use
getattr() either but pickles inst.__dict__) and avoids problems with
instances that have a __setattr__ hook.  But it *is* a semantic change
(because the setattr hook is no longer used).  So beware!

- config.h is now installed (at last) in
$exec_prefix/include/python1.5/.  For most sites, this means that it
is actually in $prefix/include/python1.5/, with all the other Python
include files, since $prefix and $exec_prefix are the same by
default.

- The imp module now supports parts of the functionality to implement
import of hierarchical module names.  It now supports find_module()
and load_module() for all types of modules.  Docstrings have been
added for those functions in the built-in imp module that are still
relevant (some old interfaces are obsolete).  For a sample
implementation of hierarchical module import in Python, see the new
library module knee.py.

- The % operator on string objects now allows arbitrary nested parens
in a %(...)X style format.  (Brad Howes)

- Reverse the order in which Setup and Setup.local are passed to the
makesetup script.  This allows variable definitions in Setup.local to
override definitions in Setup.  (But you'll still have to edit Setup
if you want to disable modules that are enabled by default, or if such
modules need non-standard options.)

- Added PyImport_ImportModuleEx(name, globals, locals, fromlist); this
is like PyImport_ImporModule(name) but receives the globals and locals
dict and the fromlist arguments as well.  (The name is a char*; the
others are PyObject*s).

- The 'p' format in the struct extension module alloded to above is
new in 1.5a4.

- The types.py module now uses try-except in a few places to make it
more likely that it can be imported in restricted mode.  Some type
names are undefined in that case, e.g. CodeType (inaccessible),
FileType (not always accessible), and TracebackType and FrameType
(inaccessible).

- In urllib.py: added separate administration of temporary files
created y URLopener.retrieve() so cleanup() can properly remove them.
The old code removed everything in tempcache which was a bad idea if
the user had passed a non-temp file into it.  Also, in basejoin(),
interpret relative paths starting in "../".  This is necessary if the
server uses symbolic links.

- The Windows build procedure and project files are now based on
Microsoft Visual C++ 5.x.  The build now takes place in the PCbuild
directory.  It is much more robust, and properly builds separate Debug
and Release versions.  (The installer will be added shortly.)

- Added casts and changed some return types in regexpr.c to avoid
compiler warnings or errors on some platforms.

- The AIX build tools for shared libraries now supports VPATH.  (Donn
Cave)

- By default, disable the "portable" multimedia modules audioop,
imageop, and rgbimg, since they don't work on 64-bit platforms.

- Fixed a nasty bug in cStringIO.c when code was actually using the
close() method (the destructors would try to free certain fields a
second time).

- For those who think they need it, there's a "user.py" module.  This
is *not* imported by default, but can be imported to run user-specific
setup commands, ~/.pythonrc.py.

- Various speedups suggested by Fredrik Lundh, Marc-Andre Lemburg,
Vladimir Marangozov, and others.

- Added os.altsep; this is '/' on DOS/Windows, and None on systems
with a sane filename syntax.

- os.py: Write out the dynamic OS choice, to avoid exec statements.
Adding support for a new OS is now a bit more work, but I bet that
'dos' or 'nt' will cover most situations...

- The obsolete exception AccessError is now really gone.

- Tools/faqwiz/: New installation instructions show how to maintain
multiple FAQs.  Removed bootstrap script from end of faqwiz.py module.
Added instructions to bootstrap script, too.  Version bumped to 0.8.1.
Added <html>...</html> feature suggested by Skip Montanaro.  Added
leading text for Roulette, default to 'Hit Reload ...'.  Fix typo in
default SRCDIR.

- Documentation for the relatively new modules "keyword" and "symbol"
has been added (to the end of the section on the parser extension
module).

- In module bisect.py, but functions have two optional argument 'lo'
and 'hi' which allow you to specify a subsequence of the array to
operate on.

- In ftplib.py, changed most methods to return their status (even when
it is always "200 OK") rather than swallowing it.

- main() now calls setlocale(LC_ALL, ""), if setlocale() and
<locale.h> are defined.

- Changes to configure.in, the configure script, and both
Makefile.pre.in files, to support SGI's SGI_ABI platform selection
environment variable.


======================================================================


From 1.4 to 1.5a3
=================

Security
--------

- If you are using the setuid script C wrapper (Misc/setuid-prog.c),
please use the new version.  The old version has a huge security leak.

Miscellaneous
-------------

- Because of various (small) incompatible changes in the Python
bytecode interpreter, the magic number for .pyc files has changed
again.

- The default module search path is now much saner.  Both on Unix and
Windows, it is essentially derived from the path to the executable
(which can be overridden by setting the environment variable
$PYTHONHOME).  The value of $PYTHONPATH on Windows is now inserted in
front of the default path, like in Unix (instead of overriding the
default path).  On Windows, the directory containing the executable is
added to the end of the path.

- A new version of python-mode.el for Emacs has been included.  Also,
a new file ccpy-style.el has been added to configure Emacs cc-mode for
the preferred style in Python C sources.

- On Unix, when using sys.argv[0] to insert the script directory in
front of sys.path, expand a symbolic link.  You can now install a
program in a private directory and have a symbolic link to it in a
public bin directory, and it will put the private directory in the
module search path.  Note that the symlink is expanded in sys.path[0]
but not in sys.argv[0], so you can still tell the name by which you
were invoked.

- It is now recommended to use ``#!/usr/bin/env python'' instead of
``#!/usr/local/bin/python'' at the start of executable scripts, except
for CGI scripts.  It has been determined that the use of /usr/bin/env
is more portable than that of /usr/local/bin/python -- scripts almost
never have to be edited when the Python interpreter lives in a
non-standard place.  Note that this doesn't work for CGI scripts since
the python executable often doesn't live in the HTTP server's default
search path.

- The silly -s command line option and the corresponding
PYTHONSUPPRESS environment variable (and the Py_SuppressPrint global
flag in the Python/C API) are gone.

- Most problems on 64-bit platforms should now be fixed.  Andrew
Kuchling helped.  Some uncommon extension modules are still not
clean (image and audio ops?).

- Fixed a bug where multiple anonymous tuple arguments would be mixed up
when using the debugger or profiler (reported by Just van Rossum).
The simplest example is ``def f((a,b),(c,d)): print a,b,c,d''; this
would print the wrong value when run under the debugger or profiler.

- The hacks that the dictionary implementation used to speed up
repeated lookups of the same C string were removed; these were a
source of subtle problems and don't seem to serve much of a purpose
any longer.

- All traces of support for the long dead access statement have been
removed from the sources.

- Plugged the two-byte memory leak in the tokenizer when reading an
interactive EOF.

- There's a -O option to the interpreter that removes SET_LINENO
instructions and assert statements (see below); it uses and produces
.pyo files instead of .pyc files.  The speedup is only a few percent
in most cases.  The line numbers are still available in the .pyo file,
as a separate table (which is also available in .pyc files).  However,
the removal of the SET_LINENO instructions means that the debugger
(pdb) can't set breakpoints on lines in -O mode.  The traceback module
contains a function to extract a line number from the code object
referenced in a traceback object.  In the future it should be possible
to write external bytecode optimizers that create better optimized
.pyo files, and there should be more control over optimization;
consider the -O option a "teaser".  Without -O, the assert statement
actually generates code that first checks __debug__; if this variable
is false, the assertion is not checked.  __debug__ is a built-in
variable whose value is initialized to track the -O flag (it's true
iff -O is not specified).  With -O, no code is generated for assert
statements, nor for code of the form ``if __debug__: <something>''.
Sorry, no further constant folding happens.


Performance
-----------

- It's much faster (almost twice for pystone.py -- see
Tools/scripts).  See the entry on string interning below.

- Some speedup by using separate free lists for method objects (both
the C and the Python variety) and for floating point numbers.

- Big speedup by allocating frame objects with a single malloc() call.
The Python/C API for frames is changed (you shouldn't be using this
anyway).

- Significant speedup by inlining some common opcodes for common operand 
types (e.g.  i+i, i-i, and list[i]).  Fredrik Lundh.

- Small speedup by reordering the method tables of some common
objects (e.g. list.append is now first).

- Big optimization to the read() method of file objects.  A read()
without arguments now attempts to use fstat to allocate a buffer of
the right size; for pipes and sockets, it will fall back to doubling
the buffer size.  While that the improvement is real on all systems,
it is most dramatic on Windows.


Documentation
-------------

- Many new pieces of library documentation were contributed, mostly by
Andrew Kuchling.  Even cmath is now documented!  There's also a
chapter of the library manual, "libundoc.tex", which provides a
listing of all undocumented modules, plus their status (e.g. internal,
obsolete, or in need of documentation).  Also contributions by Sue
Williams, Skip Montanaro, and some module authors who succumbed to
pressure to document their own contributed modules :-).  Note that
printing the documentation now kills fewer trees -- the margins have
been reduced.

- I have started documenting the Python/C API. Unfortunately this project 
hasn't been completed yet.  It will be complete before the final release of 
Python 1.5, though.  At the moment, it's better to read the LaTeX source 
than to attempt to run it through LaTeX and print the resulting dvi file.

- The posix module (and hence os.py) now has doc strings!  Thanks to Neil 
Schemenauer.  I received a few other contributions of doc strings.  In most 
other places, doc strings are still wishful thinking...


Language changes
----------------

- Private variables with leading double underscore are now a permanent 
feature of the language.  (These were experimental in release 1.4.  I have 
favorable experience using them; I can't label them "experimental" 
forever.)

- There's new string literal syntax for "raw strings".  Prefixing a string 
literal with the letter r (or R) disables all escape processing in the 
string; for example, r'\n' is a two-character string consisting of a 
backslash followed by the letter n.  This combines with all forms of string 
quotes; it is actually useful for triple quoted doc strings which might 
contain references to \n or \t.  An embedded quote prefixed with a 
backslash does not terminate the string, but the backslash is still 
included in the string; for example, r'\'' is a two-character string 
consisting of a backslash and a quote.  (Raw strings are also 
affectionately known as Robin strings, after their inventor, Robin 
Friedrich.)

- There's a simple assert statement, and a new exception
AssertionError.  For example, ``assert foo > 0'' is equivalent to ``if
not foo > 0: raise AssertionError''.  Sorry, the text of the asserted
condition is not available; it would be too complicated to generate
code for this (since the code is generated from a parse tree).
However, the text is displayed as part of the traceback!

- The raise statement has a new feature: when using "raise SomeClass,
somevalue" where somevalue is not an instance of SomeClass, it
instantiates SomeClass(somevalue).  In 1.5a4, if somevalue is an
instance of a *derived* class of SomeClass, the exception class raised
is set to somevalue.__class__, and SomeClass is ignored after that.

- Duplicate keyword arguments are now detected at compile time;
f(a=1,a=2) is now a syntax error.


Changes to built-in features
----------------------------

- There's a new exception FloatingPointError (used only by Lee Busby's
patches to catch floating point exceptions, at the moment).

- The obsolete exception ConflictError (presumably used by the long
obsolete access statement) has been deleted.

- There's a new function sys.exc_info() which returns the tuple 
(sys.exc_type, sys.exc_value, sys.exc_traceback) in a thread-safe way.

- There's a new variable sys.executable, pointing to the executable file 
for the Python interpreter.

- The sort() methods for lists no longer uses the C library qsort(); I
wrote my own quicksort implementation, with lots of help (in the form
of a kind of competition) from Tim Peters.  This solves a bug in
dictionary comparisons on some Solaris versions when Python is built
with threads, and makes sorting lists even faster.

- The semantics of comparing two dictionaries have changed, to make
comparison of unequal dictionaries faster.  A shorter dictionary is
always considered smaller than a larger dictionary.  For dictionaries
of the same size, the smallest differing element determines the
outcome (which yields the same results as before in this case, without
explicit sorting).  Thanks to Aaron Watters for suggesting something
like this.

- The semantics of try-except have changed subtly so that calling a
function in an exception handler that itself raises and catches an
exception no longer overwrites the sys.exc_* variables.  This also
alleviates the problem that objects referenced in a stack frame that
caught an exception are kept alive until another exception is caught
-- the sys.exc_* variables are restored to their previous value when
returning from a function that caught an exception.

- There's a new "buffer" interface.  Certain objects (e.g. strings and
arrays) now support the "buffer" protocol.  Buffer objects are acceptable 
whenever formerly a string was required for a write operation; mutable 
buffer objects can be the target of a read operation using the call
f.readinto(buffer).  A cool feature is that regular expression matching now 
also work on array objects.  Contribution by Jack Jansen.  (Needs 
documentation.)

- String interning: dictionary lookups are faster when the lookup
string object is the same object as the key in the dictionary, not
just a string with the same value.  This is done by having a pool of
"interned" strings.  Most names generated by the interpreter are now
automatically interned, and there's a new built-in function intern(s)
that returns the interned version of a string.  Interned strings are
not a different object type, and interning is totally optional, but by
interning most keys a speedup of about 15% was obtained for the
pystone benchmark.

- Dictionary objects have several new methods; clear() and copy() have
the obvious semantics, while update(d) merges the contents of another
dictionary d into this one, overriding existing keys.  The dictionary
implementation file is now called dictobject.c rather than the
confusing mappingobject.c.

- The intrinsic function dir() is much smarter; it looks in __dict__,
__members__ and __methods__.

- The intrinsic functions int(), long() and float() can now take a
string argument and then do the same thing as string.atoi(),
string.atol(), and string.atof().  No second 'base' argument is
allowed, and complex() does not take a string (nobody cared enough).

- When a module is deleted, its globals are now deleted in two phases.
In the first phase, all variables whose name begins with exactly one
underscore are replaced by None; in the second phase, all variables
are deleted.  This makes it possible to have global objects whose
destructors depend on other globals.  The deletion order within each
phase is still random.

- It is no longer an error for a function to be called without a
global variable __builtins__ -- an empty directory will be provided
by default.

- Guido's corollary to the "Don Beaudry hook": it is now possible to
do metaprogramming by using an instance as a base class.  Not for the
faint of heart; and undocumented as yet, but basically if a base class
is an instance, its class will be instantiated to create the new
class.  Jim Fulton will love it -- it also works with instances of his
"extension classes", since it is triggered by the presence of a
__class__ attribute on the purported base class.  See
Demo/metaclasses/index.html for an explanation and see that directory
for examples.

- Another change is that the Don Beaudry hook is now invoked when
*any* base class is special.  (Up to 1.5a3, the *last* special base
class is used; in 1.5a4, the more rational choice of the *first*
special base class is used.)

- New optional parameter to the readlines() method of file objects.
This indicates the number of bytes to read (the actual number of bytes
read will be somewhat larger due to buffering reading until the end of
the line).  Some optimizations have also been made to speed it up (but
not as much as read()).

- Complex numbers no longer have the ".conj" pseudo attribute; use
z.conjugate() instead, or complex(z.real, -z.imag).  Complex numbers
now *do* support the __members__ and __methods__ special attributes.

- The complex() function now looks for a __complex__() method on class
instances before giving up.

- Long integers now support arbitrary shift counts, so you can now
write 1L<<1000000, memory permitting.  (Python 1.4 reports "outrageous
shift count for this.)

- The hex() and oct() functions have been changed so that for regular
integers, they never emit a minus sign.  For example, on a 32-bit
machine, oct(-1) now returns '037777777777' and hex(-1) returns
'0xffffffff'.  While this may seem inconsistent, it is much more
useful.  (For long integers, a minus sign is used as before, to fit
the result in memory :-)

- The hash() function computes better hashes for several data types,
including strings, floating point numbers, and complex numbers.


New extension modules
---------------------

- New extension modules cStringIO.c and cPickle.c, written by Jim
Fulton and other folks at Digital Creations.  These are much more
efficient than their Python counterparts StringIO.py and pickle.py,
but don't support subclassing.  cPickle.c clocks up to 1000 times
faster than pickle.py; cStringIO.c's improvement is less dramatic but
still significant.

- New extension module zlibmodule.c, interfacing to the free zlib
library (gzip compatible compression).  There's also a module gzip.py
which provides a higher level interface.  Written by Andrew Kuchling
and Jeremy Hylton.

- New module readline; see the "miscellaneous" section above.

- New Unix extension module resource.c, by Jeremy Hylton, provides
access to getrlimit(), getrusage(), setrusage(), getpagesize(), and
related symbolic constants.

- New extension puremodule.c, by Barry Warsaw, which interfaces to the
Purify(TM) C API.  See also the file Misc/PURIFY.README.  It is also
possible to enable Purify by simply setting the PURIFY Makefile
variable in the Modules/Setup file.


Changes in extension modules
----------------------------

- The struct extension module has several new features to control byte
order and word size.  It supports reading and writing IEEE floats even
on platforms where this is not the native format.  It uses uppercase
format codes for unsigned integers of various sizes (always using
Python long ints for 'I' and 'L'), 's' with a size prefix for strings,
and 'p' for "Pascal strings" (with a leading length byte, included in
the size; blame Hannu Krosing; new in 1.5a4).  A prefix '>' forces
big-endian data and '<' forces little-endian data; these also select
standard data sizes and disable automatic alignment (use pad bytes as
needed).

- The array module supports uppercase format codes for unsigned data
formats (like the struct module).

- The fcntl extension module now exports the needed symbolic
constants.  (Formerly these were in FCNTL.py which was not available
or correct for all platforms.)

- The extension modules dbm, gdbm and bsddb now check that the
database is still open before making any new calls.

- The dbhash module is no more.  Use bsddb instead.  (There's a third
party interface for the BSD 2.x code somewhere on the web; support for
bsddb will be deprecated.)

- The gdbm module now supports a sync() method.

- The socket module now has some new functions: getprotobyname(), and
the set {ntoh,hton}{s,l}().

- Various modules now export their type object: socket.SocketType,
array.ArrayType.

- The socket module's accept() method now returns unknown addresses as
a tuple rather than raising an exception.  (This can happen in
promiscuous mode.)  Theres' also a new function getprotobyname().

- The pthread support for the thread module now works on most platforms.

- STDWIN is now officially obsolete.  Support for it will eventually
be removed from the distribution.

- The binascii extension module is now hopefully fully debugged.
(XXX Oops -- Fredrik Lundh promised me a uuencode fix that I never
received.)

- audioop.c: added a ratecv() function; better handling of overflow in
add().

- posixmodule.c: now exports the O_* flags (O_APPEND etc.).  On
Windows, also O_TEXT and O_BINARY.  The 'error' variable (the
exception is raises) is renamed -- its string value is now "os.error",
so newbies don't believe they have to import posix (or nt) to catch
it when they see os.error reported as posix.error.  The execve()
function now accepts any mapping object for the environment.

- A new version of the al (audio library) module for SGI was
contributed by Sjoerd Mullender.

- The regex module has a new function get_syntax() which retrieves the
syntax setting set by set_syntax().  The code was also sanitized,
removing worries about unclean error handling.  See also below for its
successor, re.py.

- The "new" module (which creates new objects of various types) once
again has a fully functioning new.function() method.  Dangerous as
ever!  Also, new.code() has several new arguments.

- A problem has been fixed in the rotor module: on systems with signed
characters, rotor-encoded data was not portable when the key contained
8-bit characters.  Also, setkey() now requires its argument rather
than having broken code to default it.

- The sys.builtin_module_names variable is now a tuple.  Another new
variables in sys is sys.executable (the full path to the Python
binary, if known).

- The specs for time.strftime() have undergone some revisions.  It
appears that not all format characters are supported in the same way
on all platforms.  Rather than reimplement it, we note these
differences in the documentation, and emphasize the shared set of
features.  There's also a thorough test set (that occasionally finds
problems in the C library implementation, e.g. on some Linuxes),
thanks to Skip Montanaro.

- The nis module seems broken when used with NIS+; unfortunately
nobody knows how to fix it.  It should still work with old NIS.


New library modules
-------------------

- New (still experimental) Perl-style regular expression module,
re.py, which uses a new interface for matching as well as a new
syntax; the new interface avoids the thread-unsafety of the regex
interface.  This comes with a helper extension reopmodule.c and vastly
rewritten regexpr.c.  Most work on this was done by Jeffrey Ollie, Tim
Peters, and Andrew Kuchling.  See the documentation libre.tex.  In
1.5, the old regex module is still fully supported; in the future, it
will become obsolete.

- New module gzip.py; see zlib above.

- New module keyword.py exports knowledge about Python's built-in
keywords.  (New version by Ka-Ping Yee.)

- New module pprint.py (with documentation) which supports
pretty-printing of lists, tuples, & dictionaries recursively.  By Fred
Drake.

- New module code.py.  The function code.compile_command() can
determine whether an interactively entered command is complete or not,
distinguishing incomplete from invalid input.  (XXX Unfortunately,
this seems broken at this moment, and I don't have the time to fix
it.  It's probably better to add an explicit interface to the parser
for this.)

- There is now a library module xdrlib.py which can read and write the
XDR data format as used by Sun RPC, for example.  It uses the struct
module.


Changes in library modules
--------------------------

- Module codehack.py is now completely obsolete.

- The pickle.py module has been updated to make it compatible with the
new binary format that cPickle.c produces.  By default it produces the
old all-ASCII format compatible with the old pickle.py, still much
faster than pickle.py; it will read both formats automatically.  A few
other updates have been made.

- A new helper module, copy_reg.py, is provided to register extensions
to the pickling code.

- Revamped module tokenize.py is much more accurate and has an
interface that makes it a breeze to write code to colorize Python
source code.  Contributed by Ka-Ping Yee.

- In ihooks.py, ModuleLoader.load_module() now closes the file under
all circumstances.

- The tempfile.py module has a new class, TemporaryFile, which creates
an open temporary file that will be deleted automatically when
closed.  This works on Windows and MacOS as well as on Unix.  (Jim
Fulton.)

- Changes to the cgi.py module: Most imports are now done at the
top of the module, which provides a speedup when using ni (Jim
Fulton).  The problem with file upload to a Windows platform is solved
by using the new tempfile.TemporaryFile class; temporary files are now
always opened in binary mode (Jim Fulton).  The cgi.escape() function
now takes an optional flag argument that quotes '"' to '&quot;'.  It
is now possible to invoke cgi.py from a command line script, to test
cgi scripts more easily outside an http server.  There's an optional
limit to the size of uploads to POST (Skip Montanaro).  Added a
'strict_parsing' option to all parsing functions (Jim Fulton).  The
function parse_qs() now uses urllib.unquote() on the name as well as
the value of fields (Clarence Gardner).  The FieldStorage class now
has a __len__() method.

- httplib.py: the socket object is no longer closed; all HTTP/1.*
responses are now accepted; and it is now thread-safe (by not using
the regex module).

- BaseHTTPModule.py: treat all HTTP/1.* versions the same.

- The popen2.py module is now rewritten using a class, which makes
access to the standard error stream and the process id of the
subprocess possible.

- Added timezone support to the rfc822.py module, in the form of a
getdate_tz() method and a parsedate_tz() function; also a mktime_tz().
Also added recognition of some non-standard date formats, by Lars
Wirzenius, and RFC 850 dates (Chris Lawrence).

- mhlib.py: various enhancements, including almost compatible parsing
of message sequence specifiers without invoking a subprocess.  Also
added a createmessage() method by Lars Wirzenius.

- The StringIO.StringIO class now supports readline(nbytes).  (Lars 
Wirzenius.)  (Of course, you should be using cStringIO for performance.)

- UserDict.py supports the new dictionary methods as well.

- Improvements for whrandom.py by Tim Peters: use 32-bit arithmetic to
speed it up, and replace 0 seed values by 1 to avoid degeneration.
A bug was fixed in the test for invalid arguments.

- Module ftplib.py: added support for parsing a .netrc file (Fred
Drake).  Also added an ntransfercmd() method to the FTP class, which
allows access to the expected size of a transfer when available, and a
parse150() function to the module which parses the corresponding 150
response.

- urllib.py: the ftp cache is now limited to 10 entries.  Added
quote_plus() and unquote_plus() functions which are like quote() and
unquote() but also replace spaces with '+' or vice versa, for
encoding/decoding CGI form arguments.  Catch all errors from the ftp
module.  HTTP requests now add the Host: header line.  The proxy
variable names are now mapped to lower case, for Windows.  The
spliturl() function no longer erroneously throws away all data past
the first newline.  The basejoin() function now intereprets "../"
correctly.  I *believe* that the problems with "exception raised in
__del__" under certain circumstances have been fixed (mostly by
changes elsewher in the interpreter).

- In urlparse.py, there is a cache for results in urlparse.urlparse();
its size limit is set to 20.  Also, new URL schemes shttp, https, and
snews are "supported".

- shelve.py: use cPickle and cStringIO when available.  Also added
a sync() method, which calls the database's sync() method if there is
one.

- The mimetools.py module now uses the available Python modules for
decoding quoted-printable, uuencode and base64 formats, rather than
creating a subprocess.

- The python debugger (pdb.py, and its base class bdb.py) now support
conditional breakpoints.  See the docs.

- The modules base64.py, uu.py and quopri.py can now be used as simple
command line utilities.

- Various small fixes to the nntplib.py module that I can't bother to
document in detail.

- Sjoerd Mullender's mimify.py module now supports base64 encoding and 
includes functions to handle the funny encoding you sometimes see in mail 
headers.  It is now documented.

- mailbox.py: Added BabylMailbox.  Improved the way the mailbox is
gotten from the environment.

- Many more modules now correctly open files in binary mode when this
is necessary on non-Unix platforms.

- The copying functions in the undocumented module shutil.py are
smarter.

- The Writer classes in the formatter.py module now have a flush()
method.

- The sgmllib.py module accepts hyphens and periods in the middle of
attribute names.  While this is against the SGML standard, there is
some HTML out there that uses this...

- The interface for the Python bytecode disassembler module, dis.py,
has been enhanced quite a bit.  There's now one main function,
dis.dis(), which takes almost any kind of object (function, module,
class, instance, method, code object) and disassembles it; without
arguments it disassembles the last frame of the last traceback.  The
other functions have changed slightly, too.

- The imghdr.py module recognizes new image types: BMP, PNG.

- The string.py module has a new function replace(str, old, new,
[maxsplit]) which does substring replacements.  It is actually
implemented in C in the strop module.  The functions [r]find() an
[r]index() have an optional 4th argument indicating the end of the
substring to search, alsoo implemented by their strop counterparts.
(Remember, never import strop -- import string uses strop when
available with zero overhead.)

- The string.join() function now accepts any sequence argument, not
just lists and tuples.

- The string.maketrans() requires its first two arguments to be
present.  The old version didn't require them, but there's not much
point without them, and the documentation suggests that they are
required, so we fixed the code to match the documentation.

- The regsub.py module has a function clear_cache(), which clears its
internal cache of compiled regular expressions.  Also, the cache now
takes the current syntax setting into account.  (However, this module
is now obsolete -- use the sub() or subn() functions or methods in the
re module.)

- The undocumented module Complex.py has been removed, now that Python
has built-in complex numbers.  A similar module remains as
Demo/classes/Complex.py, as an example.


Changes to the build process
----------------------------

- The way GNU readline is configured is totally different.  The
--with-readline configure option is gone.  It is now an extension
module, which may be loaded dynamically.  You must enable it (and
specify the correct libraries to link with) in the Modules/Setup file.
Importing the module installs some hooks which enable command line
editing.  When the interpreter shell is invoked interactively, it
attempts to import the readline module; when this fails, the default
input mechanism is used.  The hook variables are PyOS_InputHook and
PyOS_ReadlineFunctionPointer.  (Code contributed by Lee Busby, with
ideas from William Magro.)

- New build procedure: a single library, libpython1.5.a, is now built,
which contains absolutely everything except for a one-line main()
program (which calls Py_Main(argc, argv) to start the interpreter
shell).  This makes life much simpler for applications that need to
embed Python.  The serial number of the build is now included in the
version string (sys.version).

- As far as I can tell, neither gcc -Wall nor the Microsoft compiler
emits a single warning any more when compiling Python.

- A number of new Makefile variables have been added for special
situations, e.g. LDLAST is appended to the link command.  These are
used by editing the Makefile or passing them on the make command
line.

- A set of patches from Lee Busby has been integrated that make it
possible to catch floating point exceptions.  Use the configure option
--with-fpectl to enable the patches; the extension modules fpectl and
fpetest provide control to enable/disable and test the feature,
respectively.

- The support for shared libraries under AIX is now simpler and more
robust.  Thanks to Vladimir Marangozov for revamping his own patches!

- The Modules/makesetup script now reads a file Setup.local as well as
a file Setup.  Most changes to the Setup script can be done by editing
Setup.local instead, which makes it easier to carry a particular setup
over from one release to the next.

- The Modules/makesetup script now copies any "include" lines it
encounters verbatim into the output Makefile.  It also recognizes .cxx
and .cpp as C++ source files.

- The configure script is smarter about C compiler options; e.g. with
gcc it uses -O2 and -g when possible, and on some other platforms it
uses -Olimit 1500 to avoid a warning from the optimizer about the main
loop in ceval.c (which has more than 1000 basic blocks).

- The configure script now detects whether malloc(0) returns a NULL
pointer or a valid block (of length zero).  This avoids the nonsense
of always adding one byte to all malloc() arguments on most platforms.

- The configure script has a new option, --with-dec-threads, to enable
DEC threads on DEC Alpha platforms.  Also, --with-threads is now an
alias for --with-thread (this was the Most Common Typo in configure
arguments).

- Many changes in Doc/Makefile; amongst others, latex2html is now used
to generate HTML from all latex documents.


Change to the Python/C API
--------------------------

- Because some interfaces have changed, the PYTHON_API macro has been
bumped.  Most extensions built for the old API version will still run,
but I can't guarantee this.  Python prints a warning message on
version mismatches; it dumps core when the version mismatch causes a
serious problem :-)

- I've completed the Grand Renaming, with the help of Roger Masse and
Barry Warsaw.  This makes reading or debugging the code much easier.
Many other unrelated code reorganizations have also been carried out.
The allobjects.h header file is gone; instead, you would have to
include Python.h followed by rename2.h.  But you're better off running
Tools/scripts/fixcid.py -s Misc/RENAME on your source, so you can omit
the rename2.h; it will disappear in the next release.

- Various and sundry small bugs in the "abstract" interfaces have been
fixed.  Thanks to all the (involuntary) testers of the Python 1.4
version!  Some new functions have been added, e.g. PySequence_List(o),
equivalent to list(o) in Python.

- New API functions PyLong_FromUnsignedLong() and
PyLong_AsUnsignedLong().

- The API functions in the file cgensupport.c are no longer
supported.  This file has been moved to Modules and is only ever
compiled when the SGI specific 'gl' module is built.

- PyObject_Compare() can now raise an exception.  Check with
PyErr_Occurred().  The comparison function in an object type may also
raise an exception.

- The slice interface uses an upper bound of INT_MAX when no explicit
upper bound is given (e.x. for a[1:]).  It used to ask the object for
its length and do the calculations.

- Support for multiple independent interpreters.  See Doc/api.tex,
functions Py_NewInterpreter() and Py_EndInterpreter().  Since the
documentation is incomplete, also see the new Demo/pysvr example
(which shows how to use these in a threaded application) and the
source code.

- There is now a Py_Finalize() function which "de-initializes"
Python.  It is possible to completely restart the interpreter
repeatedly by calling Py_Finalize() followed by Py_Initialize().  A
change of functionality in Py_Initialize() means that it is now a
fatal error to call it while the interpreter is already initialized.
The old, half-hearted Py_Cleanup() routine is gone.  Use of Py_Exit()
is deprecated (it is nothing more than Py_Finalize() followed by
exit()).

- There are no known memory leaks left.  While Py_Finalize() doesn't
free *all* allocated memory (some of it is hard to track down),
repeated calls to Py_Finalize() and Py_Initialize() do not create
unaccessible heap blocks.

- There is now explicit per-thread state.  (Inspired by, but not the
same as, Greg Stein's free threading patches.)

- There is now better support for threading C applications.  There are
now explicit APIs to manipulate the interpreter lock.  Read the source
or the Demo/pysvr example; the new functions are
PyEval_{Acquire,Release}{Lock,Thread}().

- The test macro DEBUG has changed to Py_DEBUG, to avoid interference
with other libraries' DEBUG macros.  Likewise for any other test
macros that didn't yet start with Py_.

- New wrappers around malloc() and friends: Py_Malloc() etc. call
malloc() and call PyErr_NoMemory() when it fails; PyMem_Malloc() call
just malloc().  Use of these wrappers could be essential if multiple
memory allocators exist (e.g. when using certain DLL setups under
Windows).  (Idea by Jim Fulton.)

- New C API PyImport_Import() which uses whatever __import__() hook
that is installed for the current execution environment.  By Jim
Fulton.

- It is now possible for an extension module's init function to fail
non-fatally, by calling one of the PyErr_* functions and returning.

- The PyInt_AS_LONG() and PyFloat_AS_DOUBLE() macros now cast their
argument to the proper type, like the similar PyString macros already
did.  (Suggestion by Marc-Andre Lemburg.)  Similar for PyList_GET_SIZE
and PyList_GET_ITEM.

- Some of the Py_Get* function, like Py_GetVersion() (but not yet
Py_GetPath()) are now declared as returning a const char *.  (More
should follow.)

- Changed the run-time library to check for exceptions after object
comparisons.  PyObject_Compare() can now return an exception; use
PyErr_Occurred() to check (there is *no* special return value).

- PyFile_WriteString() and Py_Flushline() now return error indicators
instead of clearing exceptions.  This fixes an obscure bug where using
these would clear a pending exception, discovered by Just van Rossum.

- There's a new function, PyArg_ParseTupleAndKeywords(), which parses
an argument list including keyword arguments.  Contributed by Geoff
Philbrick.

- PyArg_GetInt() is gone.

- It's no longer necessary to include graminit.h when calling one of
the extended parser API functions.  The three public grammar start
symbols are now in Python.h as Py_single_input, Py_file_input, and
Py_eval_input.

- The CObject interface has a new function,
PyCObject_Import(module, name).  It calls PyCObject_AsVoidPtr()
on the object referenced by "module.name".


Tkinter
-------

- On popular demand, _tkinter once again installs a hook for readline
that processes certain Tk events while waiting for the user to type
(using PyOS_InputHook).

- A patch by Craig McPheeters plugs the most obnoxious memory leaks,
caused by command definitions referencing widget objects beyond their
lifetime.

- New standard dialog modules: tkColorChooser.py, tkCommonDialog.py,
tkMessageBox.py, tkFileDialog.py, tkSimpleDialog.py These interface
with the new Tk dialog scripts, and provide more "native platform"
style file selection dialog boxes on some platforms.  Contributed by
Fredrik Lundh.

- Tkinter.py: when the first Tk object is destroyed, it sets the
hiddel global _default_root to None, so that when another Tk object is
created it becomes the new default root.  Other miscellaneous
changes and fixes.

- The Image class now has a configure method.

- Added a bunch of new winfo options to Tkinter.py; we should now be
up to date with Tk 4.2.  The new winfo options supported are:
mananger, pointerx, pointerxy, pointery, server, viewable, visualid,
visualsavailable.

- The broken bind() method on Canvas objects defined in the Canvas.py
module has been fixed.  The CanvasItem and Group classes now also have
an unbind() method.

- The problem with Tkinter.py falling back to trying to import
"tkinter" when "_tkinter" is not found has been fixed -- it no longer
tries "tkinter", ever.  This makes diagnosing the problem "_tkinter
not configured" much easier and will hopefully reduce the newsgroup
traffic on this topic.

- The ScrolledText module once again supports the 'cnf' parameter, to
be compatible with the examples in Mark Lutz' book (I know, I know,
too late...)

- The _tkinter.c extension module has been revamped.  It now support
Tk versions 4.1 through 8.0; support for 4.0 has been dropped.  It
works well under Windows and Mac (with the latest Tk ports to those
platforms).  It also supports threading -- it is safe for one
(Python-created) thread to be blocked in _tkinter.mainloop() while
other threads modify widgets.  To make the changes visible, those
threads must use update_idletasks()method.  (The patch for threading
in 1.5a3 was broken; in 1.5a4, it is back in a different version,
which requires access to the Tcl sources to get it to work -- hence it
is disabled by default.)

- A bug in _tkinter.c has been fixed, where Split() with a string
containing an unmatched '"' could cause an exception or core dump.

- Unfortunately, on Windows and Mac, Tk 8.0 no longer supports
CreateFileHandler, so _tkinter.createfilehandler is not available on
those platforms when using Tk 8.0 or later.  I will have to rethink
how to interface with Tcl's lower-level event mechanism, or with its
channels (which are like Python's file-like objects).  Jack Jansen has
provided a fix for the Mac, so createfilehandler *is* actually
supported there; maybe I can adapt his fix for Windows.


Tools and Demos
---------------

- A new regression test suite is provided, which tests most of the
standard and built-in modules.  The regression test is run by invoking
the script Lib/test/regrtest.py.  Barry Warsaw wrote the test harnass;
he and Roger Masse contributed most of the new tests.

- New tool: faqwiz -- the CGI script that is used to maintain the
Python FAQ (http://grail.cnri.reston.va.us/cgi-bin/faqw.py).  In
Tools/faqwiz.

- New tool: webchecker -- a simple extensible web robot that, when
aimed at a web server, checks that server for dead links.  Available
are a command line utility as well as a Tkinter based GUI version.  In
Tools/webchecker.  A simplified version of this program is dissected
in my article in O'Reilly's WWW Journal, the issue on Scripting
Languages (Vol 2, No 2); Scripting the Web with Python (pp 97-120).
Includes a parser for robots.txt files by Skip Montanaro.

- New small tools: cvsfiles.py (prints a list of all files under CVS
n a particular directory tree), treesync.py (a rather Guido-specific
script to synchronize two source trees, one on Windows NT, the other
one on Unix under CVS but accessible from the NT box), and logmerge.py
(sort a collection of RCS or CVS logs by date).  In Tools/scripts.

- The freeze script now also works under Windows (NT).  Another
feature allows the -p option to be pointed at the Python source tree
instead of the installation prefix.  This was loosely based on part of
xfreeze by Sam Rushing and Bill Tutt.

- New examples (Demo/extend) that show how to use the generic
extension makefile (Misc/Makefile.pre.in).

- Tools/scripts/h2py.py now supports C++ comments.

- Tools/scripts/pystone.py script is upgraded to version 1.1; there
was a bug in version 1.0 (distributed with Python 1.4) that leaked
memory.  Also, in 1.1, the LOOPS variable is incremented to 10000.

- Demo/classes/Rat.py completely rewritten by Sjoerd Mullender.


Windows (NT and 95)
-------------------

- New project files for Developer Studio (Visual C++) 5.0 for Windows
NT (the old VC++ 4.2 Makefile is also still supported, but will
eventually be withdrawn due to its bulkiness).

- See the note on the new module search path in the "Miscellaneous" section 
above.

- Support for Win32s (the 32-bit Windows API under Windows 3.1) is
basically withdrawn.  If it still works for you, you're lucky.

- There's a new extension module, msvcrt.c, which provides various 
low-level operations defined in the Microsoft Visual C++ Runtime Library.  
These include locking(), setmode(), get_osfhandle(), set_osfhandle(), and 
console I/O functions like kbhit(), getch() and putch().

- The -u option not only sets the standard I/O streams to unbuffered
status, but also sets them in binary mode.  (This can also be done
using msvcrt.setmode(), by the way.)

- The, sys.prefix and sys.exec_prefix variables point to the directory 
where Python is installed, or to the top of the source tree, if it was run 
from there.

- The various os.path modules (posixpath, ntpath, macpath) now support
passing more than two arguments to the join() function, so
os.path.join(a, b, c) is the same as os.path.join(a, os.path.join(b,
c)).

- The ntpath module (normally used as os.path) supports ~ to $HOME 
expansion in expanduser().

- The freeze tool now works on Windows.

- See also the Tkinter category for a sad note on
_tkinter.createfilehandler().

- The truncate() method for file objects now works on Windows.

- Py_Initialize() is no longer called when the DLL is loaded.  You
must call it yourself.

- The time module's clock() function now has good precision through
the use of the Win32 API QueryPerformanceCounter().

- Mark Hammond will release Python 1.5 versions of PythonWin and his
other Windows specific code: the win32api extensions, COM/ActiveX
support, and the MFC interface.


Mac
---

- As always, the Macintosh port will be done by Jack Jansen.  He will
make a separate announcement for the Mac specific source code and the
binary distribution(s) when these are ready.


======================================================================


=====================================
==> Release 1.4 (October 25 1996) <==
=====================================

(Starting in reverse chronological order:)

- Changed disclaimer notice.

- Added SHELL=/bin/sh to Misc/Makefile.pre.in -- some Make versions
default to the user's login shell.

- In Lib/tkinter/Tkinter.py, removed bogus binding of <Delete> in Text
widget, and bogus bspace() function.

- In Lib/cgi.py, bumped __version__ to 2.0 and restored a truncated
paragraph.

- Fixed the NT Makefile (PC/vc40.mak) for VC 4.0 to set /MD for all
subprojects, and to remove the (broken) experimental NumPy
subprojects.

- In Lib/py_compile.py, cast mtime to long() so it will work on Mac
(where os.stat() returns mtimes as floats.)
- Set self.rfile unbuffered (like self.wfile) in SocketServer.py, to
fix POST in CGIHTTPServer.py.

- Version 2.83 of Misc/python-mode.el for Emacs is included.

- In Modules/regexmodule.c, fixed symcomp() to correctly handle a new
group starting immediately after a group tag.

- In Lib/SocketServer.py, changed the mode for rfile to unbuffered.

- In Objects/stringobject.c, fixed the compare function to do the
first char comparison in unsigned mode, for consistency with the way
other characters are compared by memcmp().

- In Lib/tkinter/Tkinter.py, fixed Scale.get() to support floats.

- In Lib/urllib.py, fix another case where openedurl wasn't set.

(XXX Sorry, the rest is in totally random order.  No time to fix it.)

- SyntaxError exceptions detected during code generation
(e.g. assignment to an expression) now include a line number.

- Don't leave trailing / or \ in script directory inserted in front of
sys.path.

- Added a note to Tools/scripts/classfix.py abouts its historical
importance.

- Added Misc/Makefile.pre.in, a universal Makefile for extensions
built outside the distribution.

- Rewritten Misc/faq2html.py, by Ka-Ping Yee.

- Install shared modules with mode 555 (needed for performance on some
platforms).

- Some changes to standard library modules to avoid calling append()
with more than one argument -- while supported, this should be
outlawed, and I don't want to set a bad example.

- bdb.py (and hence pdb.py) supports calling run() with a code object
instead of a code string.

- Fixed an embarrassing bug cgi.py which prevented correct uploading
of binary files from Netscape (which doesn't distinguish between
binary and text files).  Also added dormant logging support, which
makes it easier to debug the cgi module itself.

- Added default writer to constructor of NullFormatter class.

- Use binary mode for socket.makefile() calls in ftplib.py.

- The ihooks module no longer "installs" itself upon import -- this
was an experimental feature that helped ironing out some bugs but that
slowed down code that imported it without the need to install it
(e.g. the rexec module).  Also close the file in some cases and add
the __file__ attribute to loaded modules.

- The test program for mailbox.py is now more useful.

- Added getparamnames() to Message class in mimetools.py -- it returns
the names of parameters to the content-type header.

- Fixed a typo in ni that broke the loop stripping "__." from names.

- Fix sys.path[0] for scripts run via pdb.py's new main program.

- profile.py can now also run a script, like pdb.

- Fix a small bug in pyclbr -- don't add names starting with _ when
emulating from ... import *.

- Fixed a series of embarrassing typos in rexec's handling of standard
I/O redirection.  Added some more "safe" built-in modules: cmath,
errno, operator.

- Fixed embarrassing typo in shelve.py.

- Added SliceType and EllipsisType to types.py.

- In urllib.py, added handling for error 301 (same as 302); added
geturl() method to get the URL after redirection.

- Fixed embarrassing typo in xdrlib.py.  Also fixed typo in Setup.in
for _xdrmodule.c and removed redundant #include from _xdrmodule.c.

- Fixed bsddbmodule.c to add binary mode indicator on platforms that
have it.  This should make it working on Windows NT.

- Changed last uses of #ifdef NT to #ifdef MS_WINDOWS or MS_WIN32,
whatever applies.  Also rationalized some other tests for various MS
platforms.

- Added the sources for the NT installer script used for Python
1.4beta3.  Not tested with this release, but better than nothing.

- A compromise in pickle's defenses against Trojan horses: a
user-defined function is now okay where a class is expected.  A
built-in function is not okay, to prevent pickling something that
will execute os.system("rm -f *") when unpickling.

- dis.py will print the name of local variables referenced by local
load/store/delete instructions.

- Improved portability of SimpleHTTPServer module to non-Unix
platform.

- The thread.h interface adds an extra argument to down_sema().  This
only affects other C code that uses thread.c; the Python thread module
doesn't use semaphores (which aren't provided on all platforms where
Python threads are supported).  Note: on NT, this change is not
implemented.

- Fixed some typos in abstract.h; corrected signature of
PyNumber_Coerce, added PyMapping_DelItem.  Also fixed a bug in
abstract.c's PyObject_CallMethod().

- apply(classname, (), {}) now works even if the class has no
__init__() method.

- Implemented complex remainder and divmod() (these would dump core!).
Conversion of complex numbers to int, long int or float now raises an
exception, since there is no meaningful way to do it without losing
information.

- Fixed bug in built-in complex() function which gave the wrong result
for two real arguments.

- Change the hash algorithm for strings -- the multiplier is now
1000003 instead of 3, which gives better spread for short strings.

- New default path for Windows NT, the registry structure now supports
default paths for different install packages.  (Mark Hammond -- the
next PythonWin release will use this.)

- Added more symbols to the python_nt.def file.

- When using GNU readline, set rl_readline_name to "python".

- The Ellipses built-in name has been renamed to Ellipsis -- this is
the correct singular form.  Thanks to Ka-Ping Yee, who saved us from
eternal embarrassment.

- Bumped the PYTHON_API_VERSION to 1006, due to the Ellipses ->
Ellipsis name change.

- Updated the library reference manual.  Added documentation of
restricted mode (rexec, Bastion) and the formatter module (for use
with the htmllib module).  Fixed the documentation of htmllib
(finally).

- The reference manual is now maintained in FrameMaker.

- Upgraded scripts Doc/partparse.py and Doc/texi2html.py.

- Slight improvements to Doc/Makefile.

- Added fcntl.lockf(). This should be used for Unix file locking
instead of the posixfile module; lockf() is more portable.

- The getopt module now supports long option names, thanks to Lars
Wizenius.

- Plenty of changes to Tkinter and Canvas, mostly due to Fred Drake
and Nils Fischbeck.

- Use more bits of time.time() in whrandom's default seed().

- Performance hack for regex module's regs attribute.

- Don't close already closed socket in socket module.

- Correctly handle separators containing embedded nulls in
strop.split, strop.find and strop.rfind.  Also added more detail to
error message for strop.atoi and friends.

- Moved fallback definition for hypot() to Python/hypot.c.

- Added fallback definition for strdup, in Python/strdup.c.

- Fixed some bugs where a function would return 0 to indicate an error
where it should return -1.

- Test for error returned by time.localtime(), and rationalized its MS
tests.

- Added Modules/Setup.local file, which is processed after Setup.

- Corrected bug in toplevel Makefile.in -- execution of regen script
would not use the right PATH and PYTHONPATH.

- Various and sundry NeXT configuration changes (sigh).

- Support systems where libreadline needs neither termcap nor curses.

- Improved ld_so_aix script and python.exp file (for AIX).

- More stringent test for working <stdarg.h> in configure script.

- Removed Demo/www subdirectory -- it was totally out of date.

- Improved demos and docs for Fred Drake's parser module; fixed one
typo in the module itself.


=========================================
==> Release 1.4beta3 (August 26 1996) <==
=========================================


(XXX This is less readable that it should.  I promise to restructure
it for the final 1.4 release.)


What's new in 1.4beta3 (since beta2)?
-------------------------------------

- Name mangling to implement a simple form of class-private variables.
A name of the form "__spam" can't easily be used outside the class.
(This was added in 1.4beta3, but left out of the 1.4beta3 release
message.)

- In urllib.urlopen(): HTTP URLs containing user:passwd@host are now
handled correctly when using a proxy server.

- In ntpath.normpath(): don't truncate to 8+3 format.

- In mimetools.choose_boundary(): don't die when getuid() or getpid()
aren't defined.

- Module urllib: some optimizations to (un)quoting.

- New module MimeWriter for writing MIME documents.

- More changes to formatter module.

- The freeze script works once again and is much more robust (using
sys.prefix etc.).  It also supports a -o option to specify an
output directory.

- New module whichdb recognizes dbm, gdbm and bsddb/dbhash files.

- The Doc/Makefile targets have been reorganized somewhat to remove the 
insistence on always generating PostScript.

- The texinfo to html filter (Doc/texi2html.py) has been improved somewhat.

- "errors.h" has been renamed to "pyerrors.h" to resolve a long-standing 
name conflict on the Mac.

- Linking a module compiled with a different setting for Py_TRACE_REFS now 
generates a linker error rather than a core dump.

- The cgi module has a new convenience function print_exception(), which 
formats a python exception using HTML.  It also fixes a bug in the 
compatibility code and adds a dubious feature which makes it possible to 
have two query strings, one in the URL and one in the POST data.

- A subtle change in the unpickling of class instances makes it possible 
to unpickle in restricted execution mode, where the __dict__ attribute is 
not available (but setattr() is).

- Documentation for os.path.splitext() (== posixpath.splitext()) has been 
cleared up.  It splits at the *last* dot.

- posixfile locking is now also correctly supported on AIX.

- The tempfile module once again honors an initial setting of tmpdir.  It 
now works on Windows, too.

- The traceback module has some new functions to extract, format and print 
the active stack.

- Some translation functions in the urllib module have been made a little 
less sluggish.

- The addtag_* methods for Canvas widgets in Tkinter as well as in the 
separate Canvas class have been fixed so they actually do something 
meaningful.

- A tiny _test() function has been added to Tkinter.py.

- A generic Makefile for dynamically loaded modules is provided in the Misc 
subdirectory (Misc/gMakefile).

- A new version of python-mode.el for Emacs is provided.  See
http://www.python.org/ftp/emacs/pmdetails.html for details.  The
separate file pyimenu.el is no longer needed, imenu support is folded
into python-mode.el.

- The configure script can finally correctly find the readline library in a 
non-standard location.  The LDFLAGS variable is passed on the Makefiles 
from the configure script.

- Shared libraries are now installed as programs (i.e. with executable 
permission).  This is required on HP-UX and won't hurt on other systems.

- The objc.c module is no longer part of the distribution.  Objective-C 
support may become available as contributed software on the ftp site.

- The sybase module is no longer part of the distribution.  A much
improved sybase module is available as contributed software from the
ftp site.

- _tkinter is now compatible with Tcl 7.5 / Tk 4.1 patch1 on Windows and 
Mac (don't use unpatched Tcl/Tk!).  The default line in the Setup.in file 
now links with Tcl 7.5 / Tk 4.1 rather than 7.4/4.0.

- In Setup, you can now write "*shared*" instead of "*noconfig*", and you 
can use *.so and *.sl as shared libraries.

- Some more fidgeting for AIX shared libraries.

- The mpz module is now compatible with GMP 2.x.  (Not tested by me.)
(Note -- a complete replacement by Niels Mo"ller, called gpmodule, is
available from the contrib directory on the ftp site.)

- A warning is written to sys.stderr when a __del__ method raises an 
exception (formerly, such exceptions were completely ignored).

- The configure script now defines HAVE_OLD_CPP if the C preprocessor is 
incapable of ANSI style token concatenation and stringification.

- All source files (except a few platform specific modules) are once again 
compatible with K&R C compilers as well as ANSI compilers.  In particular,
ANSI-isms have been removed or made conditional in complexobject.c, 
getargs.c and operator.c.

- The abstract object API has three new functions, PyObject_DelItem, 
PySequence_DelItem, and PySequence_DelSlice.

- The operator module has new functions delitem and delslice, and the 
functions "or" and "and" are renamed to "or_" and "and_" (since "or" and 
"and" are reserved words).  ("__or__" and "__and__" are unchanged.)

- The environment module is no longer supported; putenv() is now a function 
in posixmodule (also under NT).

- Error in filter(<function>, "") has been fixed.

- Unrecognized keyword arguments raise TypeError, not KeyError.

- Better portability, fewer bugs and memory leaks, fewer compiler warnings, 
some more documentation.

- Bug in float power boundary case (0.0 to the negative integer power) 
fixed.

- The test of negative number to the float power has been moved from the 
built-in pow() functin to floatobject.c (so complex numbers can yield the 
correct result).

- The bug introduced in beta2 where shared libraries loaded (using 
dlopen()) from the current directory would fail, has been fixed.

- Modules imported as shared libraries now also have a __file__ attribute, 
giving the filename from which they were loaded.  The only modules without 
a __file__ attribute now are built-in modules.

- On the Mac, dynamically loaded modules can end in either ".slb" or 
".<platform>.slb" where <platform> is either "CFM68K" or "ppc".  The ".slb" 
extension should only be used for "fat" binaries.

- C API addition: marshal.c now supports 
PyMarshal_WriteObjectToString(object).

- C API addition: getargs.c now supports
PyArg_ParseTupleAndKeywords(args, kwdict, format, kwnames, ...)
to parse keyword arguments.

- The PC versioning scheme (sys.winver) has changed once again.  the 
version number is now "<digit>.<digit>.<digit>.<apiversion>", where the 
first three <digit>s are the Python version (e.g. "1.4.0" for Python 1.4, 
"1.4.1" for Python 1.4.1 -- the beta level is not included) and 
<apiversion> is the four-digit PYTHON_API_VERSION (currently 1005).

- h2py.py accepts whitespace before the # in CPP directives

- On Solaris 2.5, it should now be possible to use either Posix threads or 
Solaris threads (XXX: how do you select which is used???).  (Note: the 
Python pthreads interface doesn't fully support semaphores yet -- anyone 
care to fix this?)

- Thread support should now work on AIX, using either DCE threads or 
pthreads.

- New file Demo/sockets/unicast.py

- Working Mac port, with CFM68K support, with Tk 4.1 support (though not 
both) (XXX)

- New project setup for PC port, now compatible with PythonWin, with 
_tkinter and NumPy support (XXX)

- New module site.py (XXX)

- New module xdrlib.py and optional support module _xdrmodule.c (XXX)

- parser module adapted to new grammar, complete w/ Doc & Demo (XXX)

- regen script fixed (XXX)

- new machdep subdirectories Lib/{aix3,aix4,next3_3,freebsd2,linux2} (XXX)

- testall now also tests math module (XXX)

- string.atoi c.s. now raise an exception for an empty input string.

- At last, it is no longer necessary to define HAVE_CONFIG_H in order to 
have config.h included at various places.

- Unrecognized keyword arguments now raise TypeError rather than KeyError.

- The makesetup script recognizes files with extension .so or .sl as
(shared) libraries.

- 'access' is no longer a reserved word, and all code related to its 
implementation is gone (or at least #ifdef'ed out).  This should make 
Python a little speedier too!

- Performance enhancements suggested by Sjoerd Mullender.  This includes 
the introduction of two new optional function pointers in type object, 
getattro and setattro, which are like getattr and setattr but take a 
string object instead of a C string pointer.

- New operations in string module: lstrip(s) and rstrip(s) strip whitespace 
only on the left or only on the right, A new optional third argument to 
split() specifies the maximum number of separators honored (so 
splitfields(s, sep, n) returns a list of at most n+1 elements).  (Since 
1.3, splitfields(s, None) is totally equivalent to split(s).)
string.capwords() has an optional second argument specifying the 
separator (which is passed to split()).

- regsub.split() has the same addition as string.split().  regsub.splitx(s, 
sep, maxsep) implements the functionality that was regsub.split(s, 1) in 
1.4beta2 (return a list containing the delimiters as well as the words).

- Final touch for AIX loading, rewritten Misc/AIX-NOTES.

- In Modules/_tkinter.c, when using Tk 4.1 or higher, use className
argument to _tkinter.create() to set Tcl's argv0 variable, so X
resources use the right resource class again.

- Add #undef fabs to Modules/mathmodule.c for macintosh.

- Added some macro renames for AIX in Modules/operator.c.

- Removed spurious 'E' from Doc/liberrno.tex.

- Got rid of some cruft in Misc/ (dlMakefile, pyimenu.el); added new
Misc/gMakefile and new version of Misc/python-mode.el.

- Fixed typo in Lib/ntpath.py (islink has "return false" which gives a
NameError).

- Added missing "from types import *" to Lib/tkinter/Canvas.py.

- Added hint about using default args for __init__ to pickle docs.

- Corrected typo in Inclide/abstract.h: PySequence_Lenth ->
PySequence_Length.

- Some improvements to Doc/texi2html.py.

- In Python/import.c, Cast unsigned char * in struct _frozen to char *
in calls to rds_object().

- In doc/ref4.tex, added note about scope of lambda bodies.

What's new in 1.4beta2 (since beta1)?
-------------------------------------

- Portability bug in the md5.h header solved.

- The PC build procedure now really works, and sets sys.platform to a
meaningful value (a few things were botched in beta 1).  Lib/dos_8x3
is now a standard part of the distribution (alas).

- More improvements to the installation procedure.  Typing "make install" 
now inserts the version number in the pathnames of almost everything 
installed, and creates the machine dependent modules (FCNTL.py etc.) if not 
supplied by the distribution.  (XXX There's still a problem with the latter 
because the "regen" script requires that Python is installed.  Some manual 
intervention may still be required.) (This has been fixed in 1.4beta3.)

- New modules: errno, operator (XXX).

- Changes for use with Numerical Python: built-in function slice() and
Ellipses object, and corresponding syntax:

	x[lo:hi:stride]		==	x[slice(lo, hi, stride)]
	x[a, ..., z]		==	x[(a, Ellipses, z)]

- New documentation for errno and cgi modules.

- The directory containing the script passed to the interpreter is
inserted in from of sys.path; "." is no longer a default path
component.

- Optional third string argument to string.translate() specifies
characters to delete.  New function string.maketrans() creates a
translation table for translate() or for regex.compile().

- Module posix (and hence module os under Unix) now supports putenv().
Moreover, module os is enhanced so that if putenv() is supported,
assignments to os.environ entries make the appropriate putenv() call.
(XXX the putenv() implementation can leak a small amount of memory per
call.)

- pdb.py can now be invoked from the command line to debug a script:
python pdb.py <script> <arg> ...

- Much improved parseaddr() in rfc822.

- In cgi.py, you can now pass an alternative value for environ to
nearly all functions.

- You can now assign to instance variables whose name begins and ends
with '__'.

- New version of Fred Drake's parser module and associates (token,
symbol, AST).

- New PYTHON_API_VERSION value and .pyc file magic number (again!).

- The "complex" internal structure type is now called "Py_complex" to
avoid name conflicts.

- Numerous small bugs fixed.

- Slight pickle speedups.

- Some slight speedups suggested by Sjoerd (more coming in 1.4 final).

- NeXT portability mods by Bill Bumgarner integrated.

- Modules regexmodule.c, bsddbmodule.c and xxmodule.c have been
converted to new naming style.


What's new in 1.4beta1 (since 1.3)?
-----------------------------------

- Added sys.platform and sys.exec_platform for Bill Janssen.

- Installation has been completely overhauled.  "make install" now installs 
everything, not just the python binary.  Installation uses the install-sh 
script (borrowed from X11) to install each file.

- New functions in the posix module: mkfifo, plock, remove (== unlink),
and ftruncate.  More functions are also available under NT.

- New function in the fcntl module: flock.

- Shared library support for FreeBSD.

- The --with-readline option can now be used without a DIRECTORY argument, 
for systems where libreadline.* is in one of the standard places.  It is 
also possible for it to be a shared library.

- The extension tkinter has been renamed to _tkinter, to avoid confusion 
with Tkinter.py oncase insensitive file systems.  It now supports Tk 4.1 as 
well as 4.0.

- Author's change of address from CWI in Amsterdam, The Netherlands, to 
CNRI in Reston, VA, USA.

- The math.hypot() function is now always available (if it isn't found in 
the C math library, Python provides its own implementation).

- The latex documentation is now compatible with latex2e, thanks to David 
Ascher.

- The expression x**y is now equivalent to pow(x, y).

- The indexing expression x[a, b, c] is now equivalent to x[(a, b, c)].

- Complex numbers are now supported.  Imaginary constants are written with 
a 'j' or 'J' prefix, general complex numbers can be formed by adding a real 
part to an imaginary part, like 3+4j.  Complex numbers are always stored in 
floating point form, so this is equivalent to 3.0+4.0j.  It is also 
possible to create complex numbers with the new built-in function 
complex(re, [im]).  For the footprint-conscious, complex number support can 
be disabled by defining the symbol WITHOUT_COMPLEX.

- New built-in function list() is the long-awaited counterpart of tuple().

- There's a new "cmath" module which provides the same functions as the 
"math" library but with complex arguments and results.  (There are very 
good reasons why math.sqrt(-1) still raises an exception -- you have to use 
cmath.sqrt(-1) to get 1j for an answer.)

- The Python.h header file (which is really the same as allobjects.h except 
it disables support for old style names) now includes several more files, 
so you have to have fewer #include statements in the average extension.

- The NDEBUG symbol is no longer used.  Code that used to be dependent on 
the presence of NDEBUG is now present on the absence of DEBUG.  TRACE_REFS 
and REF_DEBUG have been renamed to Py_TRACE_REFS and Py_REF_DEBUG, 
respectively.  At long last, the source actually compiles and links without 
errors when this symbol is defined.

- Several symbols that didn't follow the new naming scheme have been 
renamed (usually by adding to rename2.h) to use a Py or _Py prefix.  There 
are no external symbols left without a Py or _Py prefix, not even those 
defined by sources that were incorporated from elsewhere (regexpr.c, 
md5c.c).  (Macros are a different story...)

- There are now typedefs for the structures defined in config.c and 
frozen.c.

- New PYTHON_API_VERSION value and .pyc file magic number.

- New module Bastion.  (XXX)

- Improved performance of StringIO module.

- UserList module now supports + and * operators.

- The binhex and binascii modules now actually work.

- The cgi module has been almost totally rewritten and documented.
It now supports file upload and a new data type to handle forms more 
flexibly.

- The formatter module (for use with htmllib) has been overhauled (again).

- The ftplib module now supports passive mode and has doc strings.

- In (ideally) all places where binary files are read or written, the file 
is now correctly opened in binary mode ('rb' or 'wb') so the code will work 
on Mac or PC.

- Dummy versions of os.path.expandvars() and expanduser() are now provided 
on non-Unix platforms.

- Module urllib now has two new functions url2pathname and pathname2url 
which turn local filenames into "file:..." URLs using the same rules as 
Netscape (why be different).  it also supports urlretrieve() with a 
pathname parameter, and honors the proxy environment variables (http_proxy 
etc.).  The URL parsing has been improved somewhat, too.

- Micro improvements to urlparse.  Added urlparse.urldefrag() which 
removes a trailing ``#fragment'' if any.

- The mailbox module now supports MH style message delimiters as well.

- The mhlib module contains some new functionality: setcontext() to set the 
current folder and parsesequence() to parse a sequence as commonly passed 
to MH commands (e.g. 1-10 or last:5).

- New module mimify for conversion to and from MIME format of email 
messages.

- Module ni now automatically installs itself when first imported -- this 
is against the normal rule that modules should define classes and functions 
but not invoke them, but appears more useful in the case that two 
different, independent modules want to use ni's features.

- Some small performance enhancements in module pickle.

- Small interface change to the profile.run*() family of functions -- more 
sensible handling of return values.

- The officially registered Mac creator for Python files is 'Pyth'.  This 
replaces 'PYTH' which was used before but never registered.

- Added regsub.capwords().  (XXX)

- Added string.capwords(), string.capitalize() and string.translate().  
(XXX)

- Fixed an interface bug in the rexec module: it was impossible to pass a 
hooks instance to the RExec class.  rexec now also supports the dynamic 
loading of modules from shared libraries.  Some other interfaces have been 
added too.

- Module rfc822 now caches the headers in a dictionary for more efficient 
lookup.

- The sgmllib module now understands a limited number of SGML "shorthands" 
like <A/.../ for <A>...</A>.  (It's not clear that this was a good idea...)

- The tempfile module actually tries a number of different places to find a 
usable temporary directory.  (This was prompted by certain Linux 
installations that appear to be missing a /usr/tmp directory.) [A bug in 
the implementation that would ignore a pre-existing tmpdir global has been 
fixed in beta3.]

- Much improved and enhanved FileDialog module for Tkinter.

- Many small changes to Tkinter, to bring it more in line with Tk 4.0 (as 
well as Tk 4.1).

- New socket interfaces include ntohs(), ntohl(), htons(), htonl(), and 
s.dup().  Sockets now work correctly on Windows.  On Windows, the built-in 
extension is called _socket and a wrapper module win/socket.py provides 
"makefile()" and "dup()" functionality.  On Windows, the select module 
works only with socket objects.

- Bugs in bsddb module fixed (e.g. missing default argument values).

- The curses extension now includes <ncurses.h> when available.

- The gdbm module now supports opening databases in "fast" mode by 
specifying 'f' as the second character or the mode string.

- new variables sys.prefix and sys.exec_prefix pass corresponding 
configuration options / Makefile variables to the Python programmer.

- The ``new'' module now supports creating new user-defined classes as well 
as instances thereof.

- The soundex module now sports get_soundex() to get the soundex value for an 
arbitrary string (formerly it would only do soundex-based string 
comparison) as well as doc strings.

- New object type "cobject" to safely wrap void pointers for passing them 
between various extension modules.

- More efficient computation of float**smallint.

- The mysterious bug whereby "x.x" (two occurrences of the same 
one-character name) typed from the commandline would sometimes fail 
mysteriously.

- The initialization of the readline function can now be invoked by a C 
extension through PyOS_ReadlineInit().

- There's now an externally visible pointer PyImport_FrozenModules which 
can be changed by an embedding application.

- The argument parsing functions now support a new format character 'D' to 
specify complex numbers.

- Various memory leaks plugged and bugs fixed.

- Improved support for posix threads (now that real implementations are 
beginning to apepar).  Still no fully functioning semaphores.

- Some various and sundry improvements and new entries in the Tools 
directory.


=====================================
==> Release 1.3 (13 October 1995) <==
=====================================

Major change
============

Two words: Keyword Arguments.  See the first section of Chapter 12 of
the Tutorial.

(The rest of this file is textually the same as the remaining sections
of that chapter.)


Changes to the WWW and Internet tools
=====================================

The "htmllib" module has been rewritten in an incompatible fashion.
The new version is considerably more complete (HTML 2.0 except forms,
but including all ISO-8859-1 entity definitions), and easy to use.
Small changes to "sgmllib" have also been made, to better match the
tokenization of HTML as recognized by other web tools.

A new module "formatter" has been added, for use with the new
"htmllib" module.

The "urllib"and "httplib" modules have been changed somewhat to allow
overriding unknown URL types and to support authentication.  They now
use "mimetools.Message" instead of "rfc822.Message" to parse headers.
The "endrequest()" method has been removed from the HTTP class since
it breaks the interaction with some servers.

The "rfc822.Message" class has been changed to allow a flag to be
passed in that says that the file is unseekable.

The "ftplib" module has been fixed to be (hopefully) more robust on
Linux.

Several new operations that are optionally supported by servers have
been added to "nntplib": "xover", "xgtitle", "xpath" and "date".

Other Language Changes
======================

The "raise" statement now takes an optional argument which specifies
the traceback to be used when printing the exception's stack trace.
This must be a traceback object, such as found in "sys.exc_traceback".
When omitted or given as "None", the old behavior (to generate a stack
trace entry for the current stack frame) is used.

The tokenizer is now more tolerant of alien whitespace.  Control-L in
the leading whitespace of a line resets the column number to zero,
while Control-R just before the end of the line is ignored.

Changes to Built-in Operations
==============================

For file objects, "f.read(0)" and "f.readline(0)" now return an empty
string rather than reading an unlimited number of bytes.  For the
latter, omit the argument altogether or pass a negative value.

A new system variable, "sys.platform", has been added.  It specifies
the current platform, e.g. "sunos5" or "linux1".

The built-in functions "input()" and "raw_input()" now use the GNU
readline library when it has been configured (formerly, only
interactive input to the interpreter itself was read using GNU
readline).  The GNU readline library provides elaborate line editing
and history.  The Python debugger ("pdb") is the first beneficiary of
this change.

Two new built-in functions, "globals()" and "locals()", provide access
to dictionaries containming current global and local variables,
respectively.  (These augment rather than replace "vars()", which
returns the current local variables when called without an argument,
and a module's global variables when called with an argument of type
module.)

The built-in function "compile()" now takes a third possible value for
the kind of code to be compiled: specifying "'single'" generates code
for a single interactive statement, which prints the output of
expression statements that evaluate to something else than "None".

Library Changes
===============

There are new module "ni" and "ihooks" that support importing modules
with hierarchical names such as "A.B.C".  This is enabled by writing
"import ni; ni.ni()" at the very top of the main program.  These
modules are amply documented in the Python source.

The module "rexec" has been rewritten (incompatibly) to define a class
and to use "ihooks".

The "string.split()" and "string.splitfields()" functions are now the
same function (the presence or absence of the second argument
determines which operation is invoked); similar for "string.join()"
and "string.joinfields()".

The "Tkinter" module and its helper "Dialog" have been revamped to use
keyword arguments.  Tk 4.0 is now the standard.  A new module
"FileDialog" has been added which implements standard file selection
dialogs.

The optional built-in modules "dbm" and "gdbm" are more coordinated
--- their "open()" functions now take the same values for their "flag"
argument, and the "flag" and "mode" argument have default values (to
open the database for reading only, and to create the database with
mode "0666" minuse the umask, respectively).  The memory leaks have
finally been fixed.

A new dbm-like module, "bsddb", has been added, which uses the BSD DB
package's hash method.

A portable (though slow) dbm-clone, implemented in Python, has been
added for systems where none of the above is provided.  It is aptly
dubbed "dumbdbm".

The module "anydbm" provides a unified interface to "bsddb", "gdbm",
"dbm", and "dumbdbm", choosing the first one available.

A new extension module, "binascii", provides a variety of operations
for conversion of text-encoded binary data.

There are three new or rewritten companion modules implemented in
Python that can encode and decode the most common such formats: "uu"
(uuencode), "base64" and "binhex".

A module to handle the MIME encoding quoted-printable has also been
added: "quopri".

The parser module (which provides an interface to the Python parser's
abstract syntax trees) has been rewritten (incompatibly) by Fred
Drake.  It now lets you change the parse tree and compile the result!

The \code{syslog} module has been upgraded and documented.

Other Changes
=============

The dynamic module loader recognizes the fact that different filenames
point to the same shared library and loads the library only once, so
you can have a single shared library that defines multiple modules.
(SunOS / SVR4 style shared libraries only.)

Jim Fulton's ``abstract object interface'' has been incorporated into
the run-time API.  For more detailes, read the files
"Include/abstract.h" and "Objects/abstract.c".

The Macintosh version is much more robust now.

Numerous things I have forgotten or that are so obscure no-one will
notice them anyway :-)


===================================
==> Release 1.2 (13 April 1995) <==
===================================

- Changes to Misc/python-mode.el:
  - Wrapping and indentation within triple quote strings should work
    properly now.
  - `Standard' bug reporting mechanism (use C-c C-b)
  - py-mark-block was moved to C-c C-m
  - C-c C-v shows you the python-mode version
  - a basic python-font-lock-keywords has been added for Emacs 19
    font-lock colorizations.
  - proper interaction with pending-del and del-sel modes.
  - New py-electric-colon (:) command for improved outdenting.  Also
    py-indent-line (TAB) should handle outdented lines better.
  - New commands py-outdent-left (C-c C-l) and py-indent-right (C-c C-r)

- The Library Reference has been restructured, and many new and
existing modules are now documented, in particular the debugger and
the profiler, as well as the persistency and the WWW/Internet support
modules.

- All known bugs have been fixed.  For example the pow(2,2,3L) bug on
Linux has been fixed.  Also the re-entrancy problems with __del__ have
been fixed.

- All known memory leaks have been fixed.

- Phase 2 of the Great Renaming has been executed.  The header files
now use the new names (PyObject instead of object, etc.).  The linker
also sees the new names.  Most source files still use the old names,
by virtue of the rename2.h header file.  If you include Python.h, you
only see the new names.  Dynamically linked modules have to be
recompiled.  (Phase 3, fixing the rest of the sources, will be
executed gradually with the release later versions.)

- The hooks for implementing "safe-python" (better called "restricted
execution") are in place.  Specifically, the import statement is
implemented by calling the built-in function __import__, and the
built-in names used in a particular scope are taken from the
dictionary __builtins__ in that scope's global dictionary.  See also
the new (unsupported, undocumented) module rexec.py.

- The import statement now supports the syntax "import a.b.c" and
"from a.b.c import name".  No officially supported implementation
exists, but one can be prototyped by replacing the built-in __import__
function.  A proposal by Ken Manheimer is provided as newimp.py.

- All machinery used by the import statement (or the built-in
__import__ function) is now exposed through the new built-in module
"imp" (see the library reference manual).  All dynamic loading
machinery is moved to the new file importdl.c.

- Persistent storage is supported through the use of the modules
"pickle" and "shelve" (implemented in Python).  There's also a "copy"
module implementing deepcopy and normal (shallow) copy operations.
See the library reference manual.

- Documentation strings for many objects types are accessible through
the __doc__ attribute.  Modules, classes and functions support special
syntax to initialize the __doc__ attribute: if the first statement
consists of just a string literal, that string literal becomes the
value of the __doc__ attribute.  The default __doc__ attribute is
None.  Documentation strings are also supported for built-in
functions, types and modules; however this feature hasn't been widely
used yet.  See the 'new' module for an example.  (Basically, the type
object's tp_doc field contains the doc string for the type, and the
4th member of the methodlist structure contains the doc string for the
method.)

- The __coerce__ and __cmp__ methods for user-defined classes once
again work as expected.  As an example, there's a new standard class
Complex in the library.

- The functions posix.popen() and posix.fdopen() now have an optional
third argument to specify the buffer size, and default their second
(mode) argument to 'r' -- in analogy to the built-in open() function.
The same applies to posixfile.open() and the socket method makefile().

- The thread.exit_thread() function now raises SystemExit so that
'finally' clauses are honored and a memory leak is plugged.

- Improved X11 and Motif support, by Sjoerd Mullender.  This extension
is being maintained and distributed separately.

- Improved support for the Apple Macintosh, in part by Jack Jansen,
e.g. interfaces to (a few) resource mananger functions, get/set file
type and creator, gestalt, sound manager, speech manager, MacTCP, comm
toolbox, and the think C console library.  This is being maintained
and distributed separately.

- Improved version for Windows NT, by Mark Hammond.  This is being
maintained and distributed separately.

- Used autoconf 2.0 to generate the configure script.  Adapted
configure.in to use the new features in autoconf 2.0.

- It now builds on the NeXT without intervention, even on the 3.3
Sparc pre-release.

- Characters passed to isspace() and friends are masked to nonnegative
values.

- Correctly compute pow(-3.0, 3).

- Fix portability problems with getopt (configure now checks for a
non-GNU getopt).

- Don't add frozenmain.o to libPython.a.

- Exceptions can now be classes.  ALl built-in exceptions are still
string objects, but this will change in the future.

- The socket module exports a long list of socket related symbols.
(More built-in modules will export their symbolic constants instead of
relying on a separately generated Python module.)

- When a module object is deleted, it clears out its own dictionary.
This fixes a circularity in the references between functions and
their global dictionary.

- Changed the error handling by [new]getargs() e.g. for "O&".

- Dynamic loading of modules using shared libraries is supported for
several new platforms.

- Support "O&", "[...]" and "{...}" in mkvalue().

- Extension to findmethod(): findmethodinchain() (where a chain is a
linked list of methodlist arrays).  The calling interface for
findmethod() has changed: it now gets a pointer to the (static!)
methodlist structure rather than just to the function name -- this
saves copying flags etc. into the (short-lived) method object.

- The callable() function is now public.

- Object types can define a few new operations by setting function
pointers in the type object structure: tp_call defines how an object
is called, and tp_str defines how an object's str() is computed.


===================================
==> Release 1.1.1 (10 Nov 1994) <==
===================================

This is a pure bugfix release again.  See the ChangeLog file for details.

One exception: a few new features were added to tkinter.


=================================
==> Release 1.1 (11 Oct 1994) <==
=================================

This release adds several new features, improved configuration and
portability, and fixes more bugs than I can list here (including some
memory leaks).

The source compiles and runs out of the box on more platforms than
ever -- including Windows NT.  Makefiles or projects for a variety of
non-UNIX platforms are provided.

APOLOGY: some new features are badly documented or not at all.  I had
the choice -- postpone the new release indefinitely, or release it
now, with working code but some undocumented areas.  The problem with
postponing the release is that people continue to suffer from existing
bugs, and send me patches based on the previous release -- which I
can't apply directly because my own source has changed.  Also, some
new modules (like signal) have been ready for release for quite some
time, and people are anxiously waiting for them.  In the case of
signal, the interface is simple enough to figure out without
documentation (if you're anxious enough :-).  In this case it was not
simple to release the module on its own, since it relies on many small
patches elsewhere in the source.

For most new Python modules, the source code contains comments that
explain how to use them.  Documentation for the Tk interface, written
by Matt Conway, is available as tkinter-doc.tar.gz from the Python
home and mirror ftp sites (see Misc/FAQ for ftp addresses).  For the
new operator overloading facilities, have a look at Demo/classes:
Complex.py and Rat.py show how to implement a numeric type without and
with __coerce__ method.  Also have a look at the end of the Tutorial
document (Doc/tut.tex).  If you're still confused: use the newsgroup
or mailing list.


New language features:

    - More flexible operator overloading for user-defined classes
    (INCOMPATIBLE WITH PREVIOUS VERSIONS!)  See end of tutorial.

    - Classes can define methods named __getattr__, __setattr__ and
    __delattr__ to trap attribute accesses.  See end of tutorial.

    - Classes can define method __call__ so instances can be called
    directly.  See end of tutorial.


New support facilities:

    - The Makefiles (for the base interpreter as well as for extensions)
    now support creating dynamically loadable modules if the platform
    supports shared libraries.

    - Passing the interpreter a .pyc file as script argument will execute
    the code in that file.  (On the Mac such files can be double-clicked!)

    - New Freeze script, to create independently distributable "binaries"
    of Python programs -- look in Demo/freeze

    - Improved h2py script (in Demo/scripts) follows #includes and
    supports macros with one argument

    - New module compileall generates .pyc files for all modules in a
    directory (tree) without also executing them

    - Threads should work on more platforms


New built-in modules:

    - tkinter (support for Tcl's Tk widget set) is now part of the base
    distribution

    - signal allows catching or ignoring UNIX signals (unfortunately still
    undocumented -- any taker?)

    - termios provides portable access to POSIX tty settings

    - curses provides an interface to the System V curses library

    - syslog provides an interface to the (BSD?) syslog daemon

    - 'new' provides interfaces to create new built-in object types
    (e.g. modules and functions)

    - sybase provides an interface to SYBASE database


New/obsolete built-in methods:

    - callable(x) tests whether x can be called

    - sockets now have a setblocking() method

    - sockets no longer have an allowbroadcast() method

    - socket methods send() and sendto() return byte count


New standard library modules:

    - types.py defines standard names for built-in types, e.g. StringType

    - urlparse.py parses URLs according to the latest Internet draft

    - uu.py does uuencode/uudecode (not the fastest in the world, but
    quicker than installing uuencode on a non-UNIX machine :-)

    - New, faster and more powerful profile module.py

    - mhlib.py provides interface to MH folders and messages


New facilities for extension writers (unfortunately still
undocumented):

    - newgetargs() supports optional arguments and improved error messages

    - O!, O& O? formats for getargs allow more versatile type checking of
    non-standard types

    - can register pending asynchronous callback, to be called the next
    time the Python VM begins a new instruction (Py_AddPendingCall)

    - can register cleanup routines to be called when Python exits
    (Py_AtExit)

    - makesetup script understands C++ files in Setup file (use file.C
    or file.cc)

    - Make variable OPT is passed on to sub-Makefiles

    - An init<module>() routine may signal an error by not entering
    the module in the module table and raising an exception instead

    - For long module names, instead of foobarbletchmodule.c you can
    use foobarbletch.c

    - getintvalue() and getfloatvalue() try to convert any object
    instead of requiring an "intobject" or "floatobject"

    - All the [new]getargs() formats that retrieve an integer value
    will now also work if a float is passed

    - C function listtuple() converts list to tuple, fast

    - You should now call sigcheck() instead of intrcheck();
    sigcheck() also sets an exception when it returns nonzero


====================================
==> Release 1.0.3 (14 July 1994) <==
====================================

This release consists entirely of bug fixes to the C sources; see the
head of ../ChangeLog for a complete list.  Most important bugs fixed:

- Sometimes the format operator (string%expr) would drop the last
character of the format string

- Tokenizer looped when last line did not end in \n

- Bug when triple-quoted string ended in quote plus newline

- Typo in socketmodule (listen) (== instead of =)

- typing vars() at the >>> prompt would cause recursive output


==================================
==> Release 1.0.2 (4 May 1994) <==
==================================

Overview of the most visible changes.  Bug fixes are not listed.  See
also ChangeLog.

Tokens
------

* String literals follow Standard C rules: they may be continued on
the next line using a backslash; adjacent literals are concatenated
at compile time.

* A new kind of string literals, surrounded by triple quotes (""" or
'''), can be continued on the next line without a backslash.

Syntax
------

* Function arguments may have a default value, e.g. def f(a, b=1);
defaults are evaluated at function definition time.  This also applies
to lambda.

* The try-except statement has an optional else clause, which is
executed when no exception occurs in the try clause.

Interpreter
-----------

* The result of a statement-level expression is no longer printed,
except_ for expressions entered interactively.  Consequently, the -k
command line option is gone.

* The result of the last printed interactive expression is assigned to
the variable '_'.

* Access to implicit global variables has been speeded up by removing
an always-failing dictionary lookup in the dictionary of local
variables (mod suggested by Steve Makewski and Tim Peters).

* There is a new command line option, -u, to force stdout and stderr
to be unbuffered.

* Incorporated Steve Majewski's mods to import.c for dynamic loading
under AIX.

* Fewer chances of dumping core when trying to reload or re-import
static built-in, dynamically loaded built-in, or frozen modules.

* Loops over sequences now don't ask for the sequence's length when
they start, but try to access items 0, 1, 2, and so on until they hit
an IndexError.  This makes it possible to create classes that generate
infinite or indefinite sequences a la Steve Majewski.  This affects
for loops, the (not) in operator, and the built-in functions filter(),
map(), max(), min(), reduce().

Changed Built-in operations
---------------------------

* The '%' operator on strings (printf-style formatting) supports a new
feature (adapted from a patch by Donald Beaudry) to allow
'%(<key>)<format>' % {...} to take values from a dictionary by name
instead of from a tuple by position (see also the new function
vars()).

* The '%s' formatting operator is changed to accept any type and
convert it to a string using str().

* Dictionaries with more than 20,000 entries can now be created
(thanks to Steve Kirsch).

New Built-in Functions
----------------------

* vars() returns a dictionary containing the local variables; vars(m)
returns a dictionary containing the variables of module m.  Note:
dir(x) is now equivalent to vars(x).keys().

Changed Built-in Functions
--------------------------

* open() has an optional third argument to specify the buffer size: 0
for unbuffered, 1 for line buffered, >1 for explicit buffer size, <0
for default.

* open()'s second argument is now optional; it defaults to "r".

* apply() now checks that its second argument is indeed a tuple.

New Built-in Modules
--------------------

Changed Built-in Modules
------------------------

The thread module no longer supports exit_prog().

New Python Modules
------------------

* Module addpack contains a standard interface to modify sys.path to
find optional packages (groups of related modules).

* Module urllib contains a number of functions to access
World-Wide-Web files specified by their URL.

* Module httplib implements the client side of the HTTP protocol used
by World-Wide-Web servers.

* Module gopherlib implements the client side of the Gopher protocol.

* Module mailbox (by Jack Jansen) contains a parser for UNIX and MMDF
style mailbox files.

* Module random contains various random distributions, e.g. gauss().

* Module lockfile locks and unlocks open files using fcntl (inspired
by a similar module by Andy Bensky).

* Module ntpath (by Jaap Vermeulen) implements path operations for
Windows/NT.

* Module test_thread (in Lib/test) contains a small test set for the
thread module.

Changed Python Modules
----------------------

* The string module's expandvars() function is now documented and is
implemented in Python (using regular expressions) instead of forking
off a shell process.

* Module rfc822 now supports accessing the header fields using the
mapping/dictionary interface, e.g. h['subject'].

* Module pdb now makes it possible to set a break on a function
(syntax: break <expression>, where <expression> yields a function
object).

Changed Demos
-------------

* The Demo/scripts/freeze.py script is working again (thanks to Jaap
Vermeulen).

New Demos
---------

* Demo/threads/Generator.py is a proposed interface for restartable
functions a la Tim Peters.

* Demo/scripts/newslist.py, by Quentin Stafford-Fraser, generates a
directory full of HTML pages which between them contain links to all
the newsgroups available on your server.

* Demo/dns contains a DNS (Domain Name Server) client.

* Demo/lutz contains miscellaneous demos by Mark Lutz (e.g. psh.py, a
nice enhanced Python shell!!!).

* Demo/turing contains a Turing machine by Amrit Prem.

Documentation
-------------

* Documented new language features mentioned above (but not all new
modules).

* Added a chapter to the Tutorial describing recent additions to
Python.

* Clarified some sentences in the reference manual,
e.g. break/continue, local/global scope, slice assignment.

Source Structure
----------------

* Moved Include/tokenizer.h to Parser/tokenizer.h.

* Added Python/getopt.c for systems that don't have it.

Emacs mode
----------

* Indentation of continuated lines is done more intelligently;
consequently the variable py-continuation-offset is gone.


========================================
==> Release 1.0.1 (15 February 1994) <==
========================================

* Many portability fixes should make it painless to build Python on
several new platforms, e.g. NeXT, SEQUENT, WATCOM, DOS, and Windows.

* Fixed test for <stdarg.h> -- this broke on some platforms.

* Fixed test for shared library dynalic loading -- this broke on SunOS
4.x using the GNU loader.

* Changed order and number of SVR4 networking libraries (it is now
-lsocket -linet -lnsl, if these libraries exist).

* Installing the build intermediate stages with "make libainstall" now
also installs config.c.in, Setup and makesetup, which are used by the
new Extensions mechanism.

* Improved README file contains more hints and new troubleshooting
section.

* The built-in module strop now defines fast versions of three more
functions of the standard string module: atoi(), atol() and atof().
The strop versions of atoi() and atol() support an optional second
argument to specify the base (default 10).  NOTE: you don't have to
explicitly import strop to use the faster versions -- the string
module contains code to let versions from stop override the default
versions.

* There is now a working Lib/dospath.py for those who use Python under
DOS (or Windows).  Thanks, Jaap!

* There is now a working Modules/dosmodule.c for DOS (or Windows)
system calls.

* Lib.os.py has been reorganized (making it ready for more operating
systems).

* Lib/ospath.py is now obsolete (use os.path instead).

* Many fixes to the tutorial to make it match Python 1.0.  Thanks,
Tim!

* Fixed Doc/Makefile, Doc/README and various scripts there.

* Added missing description of fdopen to Doc/libposix.tex.

* Made cleanup() global, for the benefit of embedded applications.

* Added parsing of addresses and dates to Lib/rfc822.py.

* Small fixes to Lib/aifc.py, Lib/sunau.py, Lib/tzparse.py to make
them usable at all.

* New module Lib/wave.py reads RIFF (*.wav) audio files.

* Module Lib/filewin.py moved to Lib/stdwin/filewin.py where it
belongs.

* New options and comments for Modules/makesetup (used by new
Extension mechanism).

* Misc/HYPE contains text of announcement of 1.0.0 in comp.lang.misc
and elsewhere.

* Fixed coredump in filter(None, 'abcdefg').


=======================================
==> Release 1.0.0 (26 January 1994) <==
=======================================

As is traditional, so many things have changed that I can't pretend to
be complete in these release notes, but I'll try anyway :-)

Note that the very last section is labeled "remaining bugs".


Source organization and build process
-------------------------------------

* The sources have finally been split: instead of a single src
subdirectory there are now separate directories Include, Parser,
Grammar, Objects, Python and Modules.  Other directories also start
with a capital letter: Misc, Doc, Lib, Demo.

* A few extensions (notably Amoeba and X support) have been moved to a
separate subtree Extensions, which is no longer in the core
distribution, but separately ftp'able as extensions.tar.Z.  (The
distribution contains a placeholder Ext-dummy with a description of
the Extensions subtree as well as the most recent versions of the
scripts used there.)

* A few large specialized demos (SGI video and www) have been
moved to a separate subdirectory Demo2, which is no longer in the core
distribution, but separately ftp'able as demo2.tar.Z.

* Parts of the standard library have been moved to subdirectories:
there are now standard subdirectories stdwin, test, sgi and sun4.

* The configuration process has radically changed: I now use GNU
autoconf.  This makes it much easier to build on new Unix flavors, as
well as fully supporting VPATH (if your Make has it).  The scripts
Configure.py and Addmodule.sh are no longer needed.  Many source files
have been adapted in order to work with the symbols that the configure
script generated by autoconf defines (or not); the resulting source is
much more portable to different C compilers and operating systems,
even non Unix systems (a Mac port was done in an afternoon).  See the
toplevel README file for a description of the new build process.

* GNU readline (a slightly newer version) is now a subdirectory of the
Python toplevel.  It is still not automatically configured (being
totally autoconf-unaware :-).  One problem has been solved: typing
Control-C to a readline prompt will now work.  The distribution no
longer contains a "super-level" directory (above the python toplevel
directory), and dl, dl-dld and GNU dld are no longer part of the
Python distribution (you can still ftp them from
ftp.cwi.nl:/pub/dynload).

* The DOS functions have been taken out of posixmodule.c and moved
into a separate file dosmodule.c.

* There's now a separate file version.c which contains nothing but
the version number.

* The actual main program is now contained in config.c (unless NO_MAIN
is defined); pythonmain.c now contains a function realmain() which is
called from config.c's main().

* All files needed to use the built-in module md5 are now contained in
the distribution.  The module has been cleaned up considerably.


Documentation
-------------

* The library manual has been split into many more small latex files,
so it is easier to edit Doc/lib.tex file to create a custom library
manual, describing only those modules supported on your system.  (This
is not automated though.)

* A fourth manual has been added, titled "Extending and Embedding the
Python Interpreter" (Doc/ext.tex), which collects information about
the interpreter which was previously spread over several files in the
misc subdirectory.

* The entire documentation is now also available on-line for those who
have a WWW browser (e.g. NCSA Mosaic).  Point your browser to the URL
"http://www.cwi.nl/~guido/Python.html".


Syntax
------

* Strings may now be enclosed in double quotes as well as in single
quotes.  There is no difference in interpretation.  The repr() of
string objects will use double quotes if the string contains a single
quote and no double quotes.  Thanks to Amrit Prem for these changes!

* There is a new keyword 'exec'.  This replaces the exec() built-in
function.  If a function contains an exec statement, local variable
optimization is not performed for that particular function, thus
making assignment to local variables in exec statements less
confusing.  (As a consequence, os.exec and python.exec have been
renamed to execv.)

* There is a new keyword 'lambda'.  An expression of the form

	lambda <parameters> : <expression>

yields an anonymous function.  This is really only syntactic sugar;
you can just as well define a local function using

	def some_temporary_name(<parameters>): return <expression>

Lambda expressions are particularly useful in combination with map(),
filter() and reduce(), described below.  Thanks to Amrit Prem for
submitting this code (as well as map(), filter(), reduce() and
xrange())!


Built-in functions
------------------

* The built-in module containing the built-in functions is called
__builtin__ instead of builtin.

* New built-in functions map(), filter() and reduce() perform standard
functional programming operations (though not lazily):

- map(f, seq) returns a new sequence whose items are the items from
seq with f() applied to them.

- filter(f, seq) returns a subsequence of seq consisting of those
items for which f() is true.

- reduce(f, seq, initial) returns a value computed as follows:
	acc = initial
	for item in seq: acc = f(acc, item)
	return acc

* New function xrange() creates a "range object".  Its arguments are
the same as those of range(), and when used in a for loop a range
objects also behaves identical.  The advantage of xrange() over
range() is that its representation (if the range contains many
elements) is much more compact than that of range().  The disadvantage
is that the result cannot be used to initialize a list object or for
the "Python idiom" [RED, GREEN, BLUE] = range(3).  On some modern
architectures, benchmarks have shown that "for i in range(...): ..."
actually executes *faster* than "for i in xrange(...): ...", but on
memory starved machines like PCs running DOS range(100000) may be just
too big to be represented at all...

* Built-in function exec() has been replaced by the exec statement --
see above.


The interpreter
---------------

* Syntax errors are now not printed to stderr by the parser, but
rather the offending line and other relevant information are packed up
in the SyntaxError exception argument.  When the main loop catches a
SyntaxError exception it will print the error in the same format as
previously, but at the proper position in the stack traceback.

* You can now set a maximum to the number of traceback entries
printed by assigning to sys.tracebacklimit.  The default is 1000.

* The version number in .pyc files has changed yet again.

* It is now possible to have a .pyc file without a corresponding .py
file.  (Warning: this may break existing installations if you have an
old .pyc file lingering around somewhere on your module search path
without a corresponding .py file, when there is a .py file for a
module of the same name further down the path -- the new interpreter
will find the first .pyc file and complain about it, while the old
interpreter would ignore it and use the .py file further down.)

* The list sys.builtin_module_names is now sorted and also contains
the names of a few hardwired built-in modules (sys, __main__ and
__builtin__).

* A module can now find its own name by accessing the global variable
__name__.  Assigning to this variable essentially renames the module
(it should also be stored under a different key in sys.modules).
A neat hack follows from this: a module that wants to execute a main
program when called as a script no longer needs to compare
sys.argv[0]; it can simply do "if __name__ == '__main__': main()".

* When an object is printed by the print statement, its implementation
of str() is used.  This means that classes can define __str__(self) to
direct how their instances are printed.  This is different from
__repr__(self), which should define an unambigous string
representation of the instance.  (If __str__() is not defined, it
defaults to __repr__().)

* Functions and code objects can now be compared meaningfully.

* On systems supporting SunOS or SVR4 style shared libraries, dynamic
loading of modules using shared libraries is automatically configured.
Thanks to Bill Jansen and Denis Severson for contributing this change!


Built-in objects
----------------

* File objects have acquired a new method writelines() which is the
reverse of readlines().  (It does not actually write lines, just a
list of strings, but the symmetry makes the choice of name OK.)


Built-in modules
----------------

* Socket objects no longer support the avail() method.  Use the select
module instead, or use this function to replace it:

	def avail(f):
		import select
		return f in select.select([f], [], [], 0)[0]

* Initialization of stdwin is done differently.  It actually modifies
sys.argv (taking out the options the X version of stdwin recognizes)
the first time it is imported.

* A new built-in module parser provides a rudimentary interface to the
python parser.  Corresponding standard library modules token and symbol
defines the numeric values of tokens and non-terminal symbols.

* The posix module has aquired new functions setuid(), setgid(),
execve(), and exec() has been renamed to execv().

* The array module is extended with 8-byte object swaps, the 'i'
format character, and a reverse() method.  The read() and write()
methods are renamed to fromfile() and tofile().

* The rotor module has freed of portability bugs.  This introduces a
backward compatibility problem: strings encoded with the old rotor
module can't be decoded by the new version.

* For select.select(), a timeout (4th) argument of None means the same
as leaving the timeout argument out.

* Module strop (and hence standard library module string) has aquired
a new function: rindex().  Thanks to Amrit Prem!

* Module regex defines a new function symcomp() which uses an extended
regular expression syntax: parenthesized subexpressions may be labeled
using the form "\(<labelname>...\)", and the group() method can return
sub-expressions by name.  Thanks to Tracy Tims for these changes!

* Multiple threads are now supported on Solaris 2.  Thanks to Sjoerd
Mullender!


Standard library modules
------------------------

* The library is now split in several subdirectories: all stuff using
stdwin is in Lib/stdwin, all SGI specific (or SGI Indigo or GL) stuff
is in Lib/sgi, all Sun Sparc specific stuff is in Lib/sun4, and all
test modules are in Lib/test.  The default module search path will
include all relevant subdirectories by default.

* Module os now knows about trying to import dos.  It defines
functions execl(), execle(), execlp() and execvp().

* New module dospath (should be attacked by a DOS hacker though).

* All modules defining classes now define __init__() constructors
instead of init() methods.  THIS IS AN INCOMPATIBLE CHANGE!

* Some minor changes and bugfixes module ftplib (mostly Steve
Majewski's suggestions); the debug() method is renamed to
set_debuglevel().

* Some new test modules (not run automatically by testall though):
test_audioop, test_md5, test_rgbimg, test_select.

* Module string now defines rindex() and rfind() in analogy of index()
and find().  It also defines atof() and atol() (and corresponding
exceptions) in analogy to atoi().

* Added help() functions to modules profile and pdb.

* The wdb debugger (now in Lib/stdwin) now shows class or instance
variables on a double click.  Thanks to Sjoerd Mullender!

* The (undocumented) module lambda has gone -- you couldn't import it
any more, and it was basically more a demo than a library module...


Multimedia extensions
---------------------

* The optional built-in modules audioop and imageop are now standard
parts of the interpreter.  Thanks to Sjoerd Mullender and Jack Jansen
for contributing this code!

* There's a new operation in audioop: minmax().

* There's a new built-in module called rgbimg which supports portable
efficient reading of SGI RCG image files.  Thanks also to Paul
Haeberli for the original code!  (Who will contribute a GIF reader?)

* The module aifc is gone -- you should now always use aifc, which has
received a facelift.

* There's a new module sunau., for reading Sun (and NeXT) audio files.

* There's a new module audiodev which provides a uniform interface to
(SGI Indigo and Sun Sparc) audio hardware.

* There's a new module sndhdr which recognizes various sound files by
looking in their header and checking for various magic words.


Optimizations
-------------

* Most optimizations below can be configured by compile-time flags.
Thanks to Sjoerd Mullender for submitting these optimizations!

* Small integers (default -1..99) are shared -- i.e. if two different
functions compute the same value it is possible (but not
guaranteed!!!) that they return the same *object*.  Python programs
can detect this but should *never* rely on it.

* Empty tuples (which all compare equal) are shared in the same
manner.

* Tuples of size up to 20 (default) are put in separate free lists
when deallocated.

* There is a compile-time option to cache a string's hash function,
but this appeared to have a negligeable effect, and as it costs 4
bytes per string it is disabled by default.


Embedding Python
----------------

* The initialization interface has been simplified somewhat.  You now
only call "initall()" to initialize the interpreter.

* The previously announced renaming of externally visible identifiers
has not been carried out.  It will happen in a later release.  Sorry.


Miscellaneous bugs that have been fixed
---------------------------------------

* All known portability bugs.

* Version 0.9.9 dumped core in <listobject>.sort() which has been
fixed.  Thanks to Jaap Vermeulen for fixing this and posting the fix
on the mailing list while I was away!

* Core dump on a format string ending in '%', e.g. in the expression
'%' % None.

* The array module yielded a bogus result for concatenation (a+b would
yield a+a).

* Some serious memory leaks in strop.split() and strop.splitfields().

* Several problems with the nis module.

* Subtle problem when copying a class method from another class
through assignment (the method could not be called).


Remaining bugs
--------------

* One problem with 64-bit machines remains -- since .pyc files are
portable and use only 4 bytes to represent an integer object, 64-bit
integer literals are silently truncated when written into a .pyc file.
Work-around: use eval('123456789101112').

* The freeze script doesn't work any more.  A new and more portable
one can probably be cooked up using tricks from Extensions/mkext.py.

* The dos support hasn't been tested yet.  (Really Soon Now we should
have a PC with a working C compiler!)


===================================
==> Release 0.9.9 (29 Jul 1993) <==
===================================

I *believe* these are the main user-visible changes in this release,
but there may be others.  SGI users may scan the {src,lib}/ChangeLog
files for improvements of some SGI specific modules, e.g. aifc and
cl.  Developers of extension modules should also read src/ChangeLog.


Naming of C symbols used by the Python interpreter
--------------------------------------------------

* This is the last release using the current naming conventions.  New
naming conventions are explained in the file misc/NAMING.
Summarizing, all externally visible symbols get (at least) a "Py"
prefix, and most functions are renamed to the standard form
PyModule_FunctionName.

* Writers of extensions are urged to start using the new naming
conventions.  The next release will use the new naming conventions
throughout (it will also have a different source directory
structure).

* As a result of the preliminary work for the great renaming, many
functions that were accidentally global have been made static.


BETA X11 support
----------------

* There are now modules interfacing to the X11 Toolkit Intrinsics, the
Athena widgets, and the Motif 1.1 widget set.  These are not yet
documented except through the examples and README file in the demo/x11
directory.  It is expected that this interface will be replaced by a
more powerful and correct one in the future, which may or may not be
backward compatible.  In other words, this part of the code is at most
BETA level software!  (Note: the rest of Python is rock solid as ever!)

* I understand that the above may be a bit of a disappointment,
however my current schedule does not allow me to change this situation
before putting the release out of the door.  By releasing it
undocumented and buggy, at least some of the (working!) demo programs,
like itr (my Internet Talk Radio browser) become available to a larger
audience.

* There are also modules interfacing to SGI's "Glx" widget (a GL
window wrapped in a widget) and to NCSA's "HTML" widget (which can
format HyperText Markup Language, the document format used by the
World Wide Web).

* I've experienced some problems when building the X11 support.  In
particular, the Xm and Xaw widget sets don't go together, and it
appears that using X11R5 is better than using X11R4.  Also the threads
module and its link time options may spoil things.  My own strategy is
to build two Python binaries: one for use with X11 and one without
it, which can contain a richer set of built-in modules.  Don't even
*think* of loading the X11 modules dynamically...


Environmental changes
---------------------

* Compiled files (*.pyc files) created by this Python version are
incompatible with those created by the previous version.  Both
versions detect this and silently create a correct version, but it
means that it is not a good idea to use the same library directory for
an old and a new interpreter, since they will start to "fight" over
the *.pyc files...

* When a stack trace is printed, the exception is printed last instead
of first.  This means that if the beginning of the stack trace
scrolled out of your window you can still see what exception caused
it.

* Sometimes interrupting a Python operation does not work because it
hangs in a blocking system call.  You can now kill the interpreter by
interrupting it three times.  The second time you interrupt it, a
message will be printed telling you that the third interrupt will kill
the interpreter.  The "sys.exitfunc" feature still makes limited
clean-up possible in this case.


Changes to the command line interface
-------------------------------------

* The python usage message is now much more informative.

* New option -i enters interactive mode after executing a script --
useful for debugging.

* New option -k raises an exception when an expression statement
yields a value other than None.

* For each option there is now also a corresponding environment
variable.


Using Python as an embedded language
------------------------------------

* The distribution now contains (some) documentation on the use of
Python as an "embedded language" in other applications, as well as a
simple example.  See the file misc/EMBEDDING and the directory embed/.


Speed improvements
------------------

* Function local variables are now generally stored in an array and
accessed using an integer indexing operation, instead of through a
dictionary lookup.  (This compensates the somewhat slower dictionary
lookup caused by the generalization of the dictionary module.)


Changes to the syntax
---------------------

* Continuation lines can now *sometimes* be written without a
backslash: if the continuation is contained within nesting (), [] or
{} brackets the \ may be omitted.  There's a much improved
python-mode.el in the misc directory which knows about this as well.

* You can no longer use an empty set of parentheses to define a class
without base classes.  That is, you no longer write this:

	class Foo(): # syntax error
		...

You must write this instead:

	class Foo:
		...

This was already the preferred syntax in release 0.9.8 but many
people seemed not to have picked it up.  There's a Python script that
fixes old code: demo/scripts/classfix.py.

* There's a new reserved word: "access".  The syntax and semantics are
still subject of research and debate (as well as undocumented), but
the parser knows about the keyword so you must not use it as a
variable, function, or attribute name.


Changes to the semantics of the language proper
-----------------------------------------------

* The following compatibility hack is removed: if a function was
defined with two or more arguments, and called with a single argument
that was a tuple with just as many arguments, the items of this tuple
would be used as the arguments.  This is no longer supported.


Changes to the semantics of classes and instances
-------------------------------------------------

* Class variables are now also accessible as instance variables for
reading (assignment creates an instance variable which overrides the
class variable of the same name though).

* If a class attribute is a user-defined function, a new kind of
object is returned: an "unbound method".  This contains a pointer to
the class and can only be called with a first argument which is a
member of that class (or a derived class).

* If a class defines a method __init__(self, arg1, ...) then this
method is called when a class instance is created by the classname()
construct.  Arguments passed to classname() are passed to the
__init__() method.  The __init__() methods of base classes are not
automatically called; the derived __init__() method must call these if
necessary (this was done so the derived __init__() method can choose
the call order and arguments for the base __init__() methods).

* If a class defines a method __del__(self) then this method is called
when an instance of the class is about to be destroyed.  This makes it
possible to implement clean-up of external resources attached to the
instance.  As with __init__(), the __del__() methods of base classes
are not automatically called.  If __del__ manages to store a reference
to the object somewhere, its destruction is postponed; when the object
is again about to be destroyed its __del__() method will be called
again.

* Classes may define a method __hash__(self) to allow their instances
to be used as dictionary keys.  This must return a 32-bit integer.


Minor improvements
------------------

* Function and class objects now know their name (the name given in
the 'def' or 'class' statement that created them).

* Class instances now know their class name.


Additions to built-in operations
--------------------------------

* The % operator with a string left argument implements formatting
similar to sprintf() in C.  The right argument is either a single
value or a tuple of values.  All features of Standard C sprintf() are
supported except %p.

* Dictionaries now support almost any key type, instead of just
strings.  (The key type must be an immutable type or must be a class
instance where the class defines a method __hash__(), in order to
avoid losing track of keys whose value may change.)

* Built-in methods are now compared properly: when comparing x.meth1
and y.meth2, if x is equal to y and the methods are defined by the
same function, x.meth1 compares equal to y.meth2.


Additions to built-in functions
-------------------------------

* str(x) returns a string version of its argument.  If the argument is
a string it is returned unchanged, otherwise it returns `x`.

* repr(x) returns the same as `x`.  (Some users found it easier to
have this as a function.)

* round(x) returns the floating point number x rounded to an whole
number, represented as a floating point number.  round(x, n) returns x
rounded to n digits.

* hasattr(x, name) returns true when x has an attribute with the given
name.

* hash(x) returns a hash code (32-bit integer) of an arbitrary
immutable object's value.

* id(x) returns a unique identifier (32-bit integer) of an arbitrary
object.

* compile() compiles a string to a Python code object.

* exec() and eval() now support execution of code objects.


Changes to the documented part of the library (standard modules)
----------------------------------------------------------------

* os.path.normpath() (a.k.a. posixpath.normpath()) has been fixed so
the border case '/foo/..' returns '/' instead of ''.

* A new function string.find() is added with similar semantics to
string.index(); however when it does not find the given substring it
returns -1 instead of raising string.index_error.


Changes to built-in modules
---------------------------

* New optional module 'array' implements operations on sequences of
integers or floating point numbers of a particular size.  This is
useful to manipulate large numerical arrays or to read and write
binary files consisting of numerical data.

* Regular expression objects created by module regex now support a new
method named group(), which returns one or more \(...\) groups by number.
The number of groups is increased from 10 to 100.

* Function compile() in module regex now supports an optional mapping
argument; a variable casefold is added to the module which can be used
as a standard uppercase to lowercase mapping.

* Module time now supports many routines that are defined in the
Standard C time interface (<time.h>): gmtime(), localtime(),
asctime(), ctime(), mktime(), as well as these variables (taken from
System V): timezone, altzone, daylight and tzname.  (The corresponding
functions in the undocumented module calendar have been removed; the
undocumented and unfinished module tzparse is now obsolete and will
disappear in a future release.)

* Module strop (the fast built-in version of standard module string)
now uses C's definition of whitespace instead of fixing it to space,
tab and newline; in practice this usually means that vertical tab,
form feed and return are now also considered whitespace.  It exports
the string of characters that are considered whitespace as well as the
characters that are considered lowercase or uppercase.

* Module sys now defines the variable builtin_module_names, a list of
names of modules built into the current interpreter (including not
yet imported, but excluding two special modules that always have to be
defined -- sys and builtin).

* Objects created by module sunaudiodev now also support flush() and
close() methods.

* Socket objects created by module socket now support an optional
flags argument for their methods sendto() and recvfrom().

* Module marshal now supports dumping to and loading from strings,
through the functions dumps() and loads().

* Module stdwin now supports some new functionality.  You may have to
ftp the latest version: ftp.cwi.nl:/pub/stdwin/stdwinforviews.tar.Z.)


Bugs fixed
----------

* Fixed comparison of negative long integers.

* The tokenizer no longer botches input lines longer than BUFSIZ.

* Fixed several severe memory leaks in module select.

* Fixed memory leaks in modules socket and sv.

* Fixed memory leak in divmod() for long integers.

* Problems with definition of floatsleep() on Suns fixed.

* Many portability bugs fixed (and undoubtedly new ones added :-).


Changes to the build procedure
------------------------------

* The Makefile supports some new targets: "make default" and "make
all".  Both are by normally equivalent to "make python".

* The Makefile no longer uses $> since it's not supported by all
versions of Make.

* The header files now all contain #ifdef constructs designed to make
it safe to include the same header file twice, as well as support for
inclusion from C++ programs (automatic extern "C" { ... } added).


Freezing Python scripts
-----------------------

* There is now some support for "freezing" a Python script as a
stand-alone executable binary file.  See the script
demo/scripts/freeze.py.  It will require some site-specific tailoring
of the script to get this working, but is quite worthwhile if you write
Python code for other who may not have built and installed Python.


MS-DOS
------

* A new MS-DOS port has been done, using MSC 6.0 (I believe).  Thanks,
Marcel van der Peijl!  This requires fewer compatibility hacks in
posixmodule.c.  The executable is not yet available but will be soon
(check the mailing list).

* The default PYTHONPATH has changed.


Changes for developers of extension modules
-------------------------------------------

* Read src/ChangeLog for full details.


SGI specific changes
--------------------

* Read src/ChangeLog for full details.


==================================
==> Release 0.9.8 (9 Jan 1993) <==
==================================

I claim no completeness here, but I've tried my best to scan the log
files throughout my source tree for interesting bits of news.  A more
complete account of the changes is to be found in the various
ChangeLog files. See also "News for release 0.9.7beta" below if you're
still using release 0.9.6, and the file HISTORY if you have an even
older release.

	--Guido


Changes to the language proper
------------------------------

There's only one big change: the conformance checking for function
argument lists (of user-defined functions only) is stricter.  Earlier,
you could get away with the following:

	(a) define a function of one argument and call it with any
	    number of arguments; if the actual argument count wasn't
	    one, the function would receive a tuple containing the
	    arguments (an empty tuple if there were none).

	(b) define a function of two arguments, and call it with more
	    than two arguments; if there were more than two arguments,
	    the second argument would be passed as a tuple containing
	    the second and further actual arguments.

(Note that an argument (formal or actual) that is a tuple is counted as
one; these rules don't apply inside such tuples, only at the top level
of the argument list.)

Case (a) was needed to accommodate variable-length argument lists;
there is now an explicit "varargs" feature (precede the last argument
with a '*').  Case (b) was needed for compatibility with old class
definitions: up to release 0.9.4 a method with more than one argument
had to be declared as "def meth(self, (arg1, arg2, ...)): ...".
Version 0.9.6 provide better ways to handle both casees, bot provided
backward compatibility; version 0.9.8 retracts the compatibility hacks
since they also cause confusing behavior if a function is called with
the wrong number of arguments.

There's a script that helps converting classes that still rely on (b),
provided their methods' first argument is called "self":
demo/scripts/methfix.py.

If this change breaks lots of code you have developed locally, try
#defining COMPAT_HACKS in ceval.c.

(There's a third compatibility hack, which is the reverse of (a): if a
function is defined with two or more arguments, and called with a
single argument that is a tuple with just as many arguments, the items
of this tuple will be used as the arguments.  Although this can (and
should!) be done using the built-in function apply() instead, it isn't
withdrawn yet.)


One minor change: comparing instance methods works like expected, so
that if x is an instance of a user-defined class and has a method m,
then (x.m==x.m) yields 1.


The following was already present in 0.9.7beta, but not explicitly
mentioned in the NEWS file: user-defined classes can now define types
that behave in almost allrespects like numbers.  See
demo/classes/Rat.py for a simple example.


Changes to the build process
----------------------------

The Configure.py script and the Makefile has been made somewhat more
bullet-proof, after reports of (minor) trouble on certain platforms.

There is now a script to patch Makefile and config.c to add a new
optional built-in module: Addmodule.sh.  Read the script before using!

Useing Addmodule.sh, all optional modules can now be configured at
compile time using Configure.py, so there are no modules left that
require dynamic loading.

The Makefile has been fixed to make it easier to use with the VPATH
feature of some Make versions (e.g. SunOS).


Changes affecting portability
-----------------------------

Several minor portability problems have been solved, e.g. "malloc.h"
has been renamed to "mymalloc.h", "strdup.c" is no longer used, and
the system now tolerates malloc(0) returning 0.

For dynamic loading on the SGI, Jack Jansen's dl 1.6 is now
distributed with Python.  This solves several minor problems, in
particular scripts invoked using #! can now use dynamic loading.


Changes to the interpreter interface
------------------------------------

On popular demand, there's finally a "profile" feature for interactive
use of the interpreter.  If the environment variable $PYTHONSTARTUP is
set to the name of an existing file, Python statements in this file
are executed when the interpreter is started in interactive mode.

There is a new clean-up mechanism, complementing try...finally: if you
assign a function object to sys.exitfunc, it will be called when
Python exits or receives a SIGTERM or SIGHUP signal.

The interpreter is now generally assumed to live in
/usr/local/bin/python (as opposed to /usr/local/python).  The script
demo/scripts/fixps.py will update old scripts in place (you can easily
modify it to do other similar changes).

Most I/O that uses sys.stdin/stdout/stderr will now use any object
assigned to those names as long as the object supports readline() or
write() methods.

The parser stack has been increased to 500 to accommodate more
complicated expressions (7 levels used to be the practical maximum,
it's now about 38).

The limit on the size of the *run-time* stack has completely been
removed -- this means that tuple or list displays can contain any
number of elements (formerly more than 50 would crash the
interpreter). 


Changes to existing built-in functions and methods
--------------------------------------------------

The built-in functions int(), long(), float(), oct() and hex() now
also apply to class instalces that define corresponding methods
(__int__ etc.).


New built-in functions
----------------------

The new functions str() and repr() convert any object to a string.
The function repr(x) is in all respects equivalent to `x` -- some
people prefer a function for this.  The function str(x) does the same
except if x is already a string -- then it returns x unchanged
(repr(x) adds quotes and escapes "funny" characters as octal escapes).

The new function cmp(x, y) returns -1 if x<y, 0 if x==y, 1 if x>y.


Changes to general built-in modules
-----------------------------------

The time module's functions are more general: time() returns a
floating point number and sleep() accepts one.  Their accuracies
depends on the precision of the system clock.  Millisleep is no longer
needed (although it still exists for now), but millitimer is still
needed since on some systems wall clock time is only available with
seconds precision, while a source of more precise time exists that
isn't synchronized with the wall clock.  (On UNIX systems that support
the BSD gettimeofday() function, time.time() is as time.millitimer().)

The string representation of a file object now includes an address:
'<file 'filename', mode 'r' at #######>' where ###### is a hex number
(the object's address) to make it unique.

New functions added to posix: nice(), setpgrp(), and if your system
supports them: setsid(), setpgid(), tcgetpgrp(), tcsetpgrp().

Improvements to the socket module: socket objects have new methods
getpeername() and getsockname(), and the {get,set}sockopt methods can
now get/set any kind of option using strings built with the new struct
module.  And there's a new function fromfd() which creates a socket
object given a file descriptor (useful for servers started by inetd,
which have a socket connected to stdin and stdout).


Changes to SGI-specific built-in modules
----------------------------------------

The FORMS library interface (fl) now requires FORMS 2.1a.  Some new
functions have been added and some bugs have been fixed.

Additions to al (audio library interface): added getname(),
getdefault() and getminmax().

The gl modules doesn't call "foreground()" when initialized (this
caused some problems) like it dit in 0.9.7beta (but not before).
There's a new gl function 'gversion() which returns a version string.

The interface to sv (Indigo video interface) has totally changed.
(Sorry, still no documentation, but see the examples in
demo/sgi/{sv,video}.)


Changes to standard library modules
-----------------------------------

Most functions in module string are now much faster: they're actually
implemented in C.  The module containing the C versions is called
"strop" but you should still import "string" since strop doesn't
provide all the interfaces defined in string (and strop may be renamed
to string when it is complete in a future release).

string.index() now accepts an optional third argument giving an index
where to start searching in the first argument, so you can find second
and further occurrences (this is similar to the regular expression
functions in regex).

The definition of what string.splitfields(anything, '') should return
is changed for the last time: it returns a singleton list containing
its whole first argument unchanged.  This is compatible with
regsub.split() which also ignores empty delimiter matches.

posixpath, macpath: added dirname() and normpath() (and basename() to
macpath).

The mainloop module (for use with stdwin) can now demultiplex input
from other sources, as long as they can be polled with select().


New built-in modules
--------------------

Module struct defines functions to pack/unpack values to/from strings
representing binary values in native byte order.

Module strop implements C versions of many functions from string (see
above).

Optional module fcntl defines interfaces to fcntl() and ioctl() --
UNIX only.  (Not yet properly documented -- see however src/fcntl.doc.)

Optional module mpz defines an interface to an altaernative long
integer implementation, the GNU MPZ library.

Optional module md5 uses the GNU MPZ library to calculate MD5
signatures of strings.

There are also optional new modules specific to SGI machines: imageop
defines some simple operations to images represented as strings; sv
interfaces to the Indigo video board; cl interfaces to the (yet
unreleased) compression library.


New standard library modules
----------------------------

(Unfortunately the following modules are not all documented; read the
sources to find out more about them!)

autotest: run testall without showing any output unless it differs
from the expected output

bisect: use bisection to insert or find an item in a sorted list

colorsys: defines conversions between various color systems (e.g. RGB
<-> YUV)

nntplib: a client interface to NNTP servers

pipes: utility to construct pipeline from templates, e.g. for
conversion from one file format to another using several utilities.

regsub: contains three functions that are more or less compatible with
awk functions of the same name: sub() and gsub() do string
substitution, split() splits a string using a regular expression to
define how separators are define.

test_types: test operations on the built-in types of Python

toaiff: convert various audio file formats to AIFF format

tzparse: parse the TZ environment parameter (this may be less general
than it could be, let me know if you fix it).

(Note that the obsolete module "path" no longer exists.)


New SGI-specific library modules
--------------------------------

CL: constants for use with the built-in compression library interface (cl)

Queue: a multi-producer, multi-consumer queue class implemented for
use with the built-in thread module

SOCKET: constants for use with built-in module socket, e.g. to set/get
socket options.  This is SGI-specific because the constants to be
passed are system-dependent.  You can generate a version for your own
system by running the script demo/scripts/h2py.py with
/usr/include/sys/socket.h as input.

cddb: interface to the database used by the CD player

torgb: convert various image file types to rgb format (requires pbmplus)


New demos
---------

There's an experimental interface to define Sun RPC clients and
servers in demo/rpc.

There's a collection of interfaces to WWW, WAIS and Gopher (both
Python classes and program providing a user interface) in demo/www.
This includes a program texi2html.py which converts texinfo files to
HTML files (the format used hy WWW).

The ibrowse demo has moved from demo/stdwin/ibrowse to demo/ibrowse.

For SGI systems, there's a whole collection of programs and classes
that make use of the Indigo video board in demo/sgi/{sv,video}.  This
represents a significant amount of work that we're giving away!

There are demos "rsa" and "md5test" that exercise the mpz and md5
modules, respectively.  The rsa demo is a complete implementation of
the RSA public-key cryptosystem!

A bunch of games and examples submitted by Stoffel Erasmus have been
included in demo/stoffel.

There are miscellaneous new files in some existing demo
subdirectories: classes/bitvec.py, scripts/{fixps,methfix}.py,
sgi/al/cmpaf.py, sockets/{mcast,gopher}.py.

There are also many minor changes to existing files, but I'm too lazy
to run a diff and note the differences -- you can do this yourself if
you save the old distribution's demos.  One highlight: the
stdwin/python.py demo is much improved!


Changes to the documentation
----------------------------

The LaTeX source for the library uses different macros to enable it to
be converted to texinfo, and from there to INFO or HTML format so it
can be browsed as a hypertext.  The net result is that you can now
read the Python library documentation in Emacs info mode!


Changes to the source code that affect C extension writers
----------------------------------------------------------

The function strdup() no longer exists (it was used only in one places
and is somewhat of a portability problem since some systems have the
same function in their C library.

The functions NEW() and RENEW() allocate one spare byte to guard
against a NULL return from malloc(0) being taken for an error, but
this should not be relied upon.


=========================
==> Release 0.9.7beta <==
=========================


Changes to the language proper
------------------------------

User-defined classes can now implement operations invoked through
special syntax, such as x[i] or `x` by defining methods named
__getitem__(self, i) or __repr__(self), etc.


Changes to the build process
----------------------------

Instead of extensive manual editing of the Makefile to select
compile-time options, you can now run a Configure.py script.
The Makefile as distributed builds a minimal interpreter sufficient to
run Configure.py.  See also misc/BUILD

The Makefile now includes more "utility" targets, e.g. install and
tags/TAGS

Using the provided strtod.c and strtol.c are now separate options, as
on the Sun the provided strtod.c dumps core :-(

The regex module is now an option chosen by the Makefile, since some
(old) C compilers choke on regexpr.c


Changes affecting portability
-----------------------------

You need STDWIN version 0.9.7 (released 30 June 1992) for the stdwin
interface

Dynamic loading is now supported for Sun (and other non-COFF systems)
throug dld-3.2.3, as well as for SGI (a new version of Jack Jansen's
DL is out, 1.4)

The system-dependent code for the use of the select() system call is
moved to one file: myselect.h

Thanks to Jaap Vermeulen, the code should now port cleanly to the
SEQUENT


Changes to the interpreter interface
------------------------------------

The interpretation of $PYTHONPATH in the environment is different: it
is inserted in front of the default path instead of overriding it


Changes to existing built-in functions and methods
--------------------------------------------------

List objects now support an optional argument to their sort() method,
which is a comparison function similar to qsort(3) in C

File objects now have a method fileno(), used by the new select module
(see below)


New built-in function
---------------------

coerce(x, y): take two numbers and return a tuple containing them
both converted to a common type


Changes to built-in modules
---------------------------

sys: fixed core dumps in settrace() and setprofile()

socket: added socket methods setsockopt() and getsockopt(); and
fileno(), used by the new select module (see below)

stdwin: added fileno() == connectionnumber(), in support of new module
select (see below)

posix: added get{eg,eu,g,u}id(); waitpid() is now a separate function.

gl: added qgetfd()

fl: added several new functions, fixed several obscure bugs, adapted
to FORMS 2.1


Changes to standard modules
---------------------------

posixpath: changed implementation of ismount()

string: atoi() no longer mistakes leading zero for octal number

...


New built-in modules
--------------------

Modules marked "dynamic only" are not configured at compile time but
can be loaded dynamically.  You need to turn on the DL or DLD option in
the Makefile for support dynamic loading of modules (this requires
external code).

select: interfaces to the BSD select() system call

dbm: interfaces to the (new) dbm library (dynamic only)

nis: interfaces to some NIS functions (aka yellow pages)

thread: limited form of multiple threads (sgi only)

audioop: operations useful for audio programs, e.g. u-LAW and ADPCM
coding (dynamic only)

cd: interface to Indigo SCSI CDROM player audio library (sgi only)

jpeg: read files in JPEG format (dynamic only, sgi only; needs
external code)

imgfile: read SGI image files (dynamic only, sgi only)

sunaudiodev: interface to sun's /dev/audio (dynamic only, sun only)

sv: interface to Indigo video library (sgi only)

pc: a minimal set of MS-DOS interfaces (MS-DOS only)

rotor: encryption, by Lance Ellinghouse (dynamic only)


New standard modules
--------------------

Not all these modules are documented.  Read the source:
lib/<modulename>.py.  Sometimes a file lib/<modulename>.doc contains
additional documentation.

imghdr: recognizes image file headers

sndhdr: recognizes sound file headers

profile: print run-time statistics of Python code

readcd, cdplayer: companion modules for built-in module cd (sgi only)

emacs: interface to Emacs using py-connect.el (see below).

SOCKET: symbolic constant definitions for socket options

SUNAUDIODEV: symbolic constant definitions for sunaudiodef (sun only)

SV: symbolic constat definitions for sv (sgi only)

CD: symbolic constat definitions for cd (sgi only)


New demos
---------

scripts/pp.py: execute Python as a filter with a Perl-like command
line interface

classes/: examples using the new class features

threads/: examples using the new thread module

sgi/cd/: examples using the new cd module


Changes to the documentation
----------------------------

The last-minute syntax changes of release 0.9.6 are now reflected
everywhere in the manuals

The reference manual has a new section (3.2) on implementing new kinds
of numbers, sequences or mappings with user classes

Classes are now treated extensively in the tutorial (chapter 9)

Slightly restructured the system-dependent chapters of the library
manual

The file misc/EXTENDING incorporates documentation for mkvalue() and
a new section on error handling

The files misc/CLASSES and misc/ERRORS are no longer necessary

The doc/Makefile now creates PostScript files automatically


Miscellaneous changes
---------------------

Incorporated Tim Peters' changes to python-mode.el, it's now version
1.06

A python/Emacs bridge (provided by Terrence M. Brannon) lets a Python
program running in an Emacs buffer execute Emacs lisp code.  The
necessary Python code is in lib/emacs.py.  The Emacs code is
misc/py-connect.el (it needs some external Emacs lisp code)


Changes to the source code that affect C extension writers
----------------------------------------------------------

New service function mkvalue() to construct a Python object from C
values according to a "format" string a la getargs()

Most functions from pythonmain.c moved to new pythonrun.c which is
in libpython.a.  This should make embedded versions of Python easier

ceval.h is split in eval.h (which needs compile.h and only declares
eval_code) and ceval.h (which doesn't need compile.hand declares the
rest)

ceval.h defines macros BGN_SAVE / END_SAVE for use with threads (to
improve the parallellism of multi-threaded programs by letting other
Python code run when a blocking system call or something similar is
made)

In structmember.[ch], new member types BYTE, CHAR and unsigned
variants have been added

New file xxmodule.c is a template for new extension modules.


==================================
==> Release 0.9.6 (6 Apr 1992) <==
==================================

Misc news in 0.9.6:
- Restructured the misc subdirectory
- Reference manual completed, library manual much extended (with indexes!)
- the GNU Readline library is now distributed standard with Python
- the script "../demo/scripts/classfix.py" fixes Python modules using old
  class syntax
- Emacs python-mode.el (was python.el) vastly improved (thanks, Tim!)
- Because of the GNU copyleft business I am not using the GNU regular
  expression implementation but a free re-implementation by Tatu Ylonen
  that recently appeared in comp.sources.misc (Bravo, Tatu!)

New features in 0.9.6:
- stricter try stmt syntax: cannot mix except and finally clauses on 1 try
- New module 'os' supplants modules 'mac' and 'posix' for most cases;
  module 'path' is replaced by 'os.path'
- os.path.split() return value differs from that of old path.split()
- sys.exc_type, sys.exc_value, sys.exc_traceback are set to the exception
  currently being handled
- sys.last_type, sys.last_value, sys.last_traceback remember last unhandled
  exception
- New function string.expandtabs() expands tabs in a string
- Added times() interface to posix (user & sys time of process & children)
- Added uname() interface to posix (returns OS type, hostname, etc.)
- New built-in function execfile() is like exec() but from a file
- Functions exec() and eval() are less picky about whitespace/newlines
- New built-in functions getattr() and setattr() access arbitrary attributes
- More generic argument handling in built-in functions (see "./EXTENDING")
- Dynamic loading of modules written in C or C++ (see "./DYNLOAD")
- Division and modulo for long and plain integers with negative operands
  have changed; a/b is now floor(float(a)/float(b)) and a%b is defined
  as a-(a/b)*b.  So now the outcome of divmod(a,b) is the same as
  (a/b, a%b) for integers.  For floats, % is also changed, but of course
  / is unchanged, and divmod(x,y) does not yield (x/y, x%y)...
- A function with explicit variable-length argument list can be declared
  like this: def f(*args): ...; or even like this: def f(a, b, *rest): ...
- Code tracing and profiling features have been added, and two source
  code debuggers are provided in the library (pdb.py, tty-oriented,
  and wdb, window-oriented); you can now step through Python programs!
  See sys.settrace() and sys.setprofile(), and "../lib/pdb.doc"
- '==' is now the only equality operator; "../demo/scripts/eqfix.py" is
  a script that fixes old Python modules
- Plain integer right shift now uses sign extension
- Long integer shift/mask operations now simulate 2's complement
  to give more useful results for negative operands
- Changed/added range checks for long/plain integer shifts
- Options found after "-c command" are now passed to the command in sys.argv
  (note subtle incompatiblity with "python -c command -- -options"!)
- Module stdwin is better protected against touching objects after they've
  been closed; menus can now also be closed explicitly
- Stdwin now uses its own exception (stdwin.error)

New features in 0.9.5 (released as Macintosh application only, 2 Jan 1992):
- dictionary objects can now be compared properly; e.g., {}=={} is true
- new exception SystemExit causes termination if not caught;
  it is raised by sys.exit() so that 'finally' clauses can clean up,
  and it may even be caught.  It does work interactively!
- new module "regex" implements GNU Emacs style regular expressions;
  module "regexp" is rewritten in Python for backward compatibility
- formal parameter lists may contain trailing commas

Bugs fixed in 0.9.6:
- assigning to or deleting a list item with a negative index dumped core
- divmod(-10L,5L) returned (-3L, 5L) instead of (-2L, 0L)

Bugs fixed in 0.9.5:
- masking operations involving negative long integers gave wrong results


===================================
==> Release 0.9.4 (24 Dec 1991) <==
===================================

- new function argument handling (see below)
- built-in apply(func, args) means func(args[0], args[1], ...)
- new, more refined exceptions
- new exception string values (NameError = 'NameError' etc.)
- better checking for math exceptions
- for sequences (string/tuple/list), x[-i] is now equivalent to x[len(x)-i]
- fixed list assignment bug: "a[1:1] = a" now works correctly
- new class syntax, without extraneous parentheses
- new 'global' statement to assign global variables from within a function


New class syntax
----------------

You can now declare a base class as follows:

	class B:			# Was: class B():
		def some_method(self): ...
		...

and a derived class thusly:

	class D(B):			# Was: class D() = B():
		def another_method(self, arg): ...

Multiple inheritance looks like this:

	class M(B, D):			# Was: class M() = B(), D():
		def this_or_that_method(self, arg): ...

The old syntax is still accepted by Python 0.9.4, but will disappear
in Python 1.0 (to be posted to comp.sources).


New 'global' statement
----------------------

Every now and then you have a global variable in a module that you
want to change from within a function in that module -- say, a count
of calls to a function, or an option flag, etc.  Until now this was
not directly possible.  While several kludges are known that
circumvent the problem, and often the need for a global variable can
be avoided by rewriting the module as a class, this does not always
lead to clearer code.

The 'global' statement solves this dilemma.  Its occurrence in a
function body means that, for the duration of that function, the
names listed there refer to global variables.  For instance:

	total = 0.0
	count = 0

	def add_to_total(amount):
		global total, count
		total = total + amount
		count = count + 1

'global' must be repeated in each function where it is needed.  The
names listed in a 'global' statement must not be used in the function
before the statement is reached.

Remember that you don't need to use 'global' if you only want to *use*
a global variable in a function; nor do you need ot for assignments to
parts of global variables (e.g., list or dictionary items or
attributes of class instances).  This has not changed; in fact
assignment to part of a global variable was the standard workaround.


New exceptions
--------------

Several new exceptions have been defined, to distinguish more clearly
between different types of errors.

name			meaning					was

AttributeError		reference to non-existing attribute	NameError
IOError			unexpected I/O error			RuntimeError
ImportError		import of non-existing module or name	NameError
IndexError		invalid string, tuple or list index	RuntimeError
KeyError		key not in dictionary			RuntimeError
OverflowError		numeric overflow			RuntimeError
SyntaxError		invalid syntax				RuntimeError
ValueError		invalid argument value			RuntimeError
ZeroDivisionError	division by zero			RuntimeError

The string value of each exception is now its name -- this makes it
easier to experimentally find out which operations raise which
exceptions; e.g.:

	>>> KeyboardInterrupt
	'KeyboardInterrupt'
	>>>


New argument passing semantics
------------------------------

Off-line discussions with Steve Majewski and Daniel LaLiberte have
convinced me that Python's parameter mechanism could be changed in a
way that made both of them happy (I hope), kept me happy, fixed a
number of outstanding problems, and, given some backward compatibility
provisions, would only break a very small amount of existing code --
probably all mine anyway.  In fact I suspect that most Python users
will hardly notice the difference.  And yet it has cost me at least
one sleepless night to decide to make the change...

Philosophically, the change is quite radical (to me, anyway): a
function is no longer called with either zero or one argument, which
is a tuple if there appear to be more arguments.  Every function now
has an argument list containing 0, 1 or more arguments.  This list is
always implemented as a tuple, and it is a (run-time) error if a
function is called with a different number of arguments than expected.

What's the difference? you may ask.  The answer is, very little unless
you want to write variadic functions -- functions that may be called
with a variable number of arguments.  Formerly, you could write a
function that accepted one or more arguments with little trouble, but
writing a function that could be called with either 0 or 1 argument
(or more) was next to impossible.  This is now a piece of cake: you
can simply declare an argument that receives the entire argument
tuple, and check its length -- it will be of size 0 if there are no
arguments.

Another anomaly of the old system was the way multi-argument methods
(in classes) had to be declared, e.g.:

	class Point():
		def init(self, (x, y, color)): ...
		def setcolor(self, color): ...
		dev moveto(self, (x, y)): ...
		def draw(self): ...

Using the new scheme there is no need to enclose the method arguments
in an extra set of parentheses, so the above class could become:

	class Point:
		def init(self, x, y, color): ...
		def setcolor(self, color): ...
		dev moveto(self, x, y): ...
		def draw(self): ...

That is, the equivalence rule between methods and functions has
changed so that now p.moveto(x,y) is equivalent to Point.moveto(p,x,y)
while formerly it was equivalent to Point.moveto(p,(x,y)).

A special backward compatibility rule makes that the old version also
still works: whenever a function with exactly two arguments (at the top
level) is called with more than two arguments, the second and further
arguments are packed into a tuple and passed as the second argument.
This rule is invoked independently of whether the function is actually a
method, so there is a slight chance that some erroneous calls of
functions expecting two arguments with more than that number of
arguments go undetected at first -- when the function tries to use the
second argument it may find it is a tuple instead of what was expected.
Note that this rule will be removed from future versions of the
language; it is a backward compatibility provision *only*.

Two other rules and a new built-in function handle conversion between
tuples and argument lists:

Rule (a): when a function with more than one argument is called with a
single argument that is a tuple of the right size, the tuple's items
are used as arguments.

Rule (b): when a function with exactly one argument receives no
arguments or more than one, that one argument will receive a tuple
containing the arguments (the tuple will be empty if there were no
arguments).


A new built-in function, apply(), was added to support functions that
need to call other functions with a constructed argument list.  The call

	apply(function, tuple)

is equivalent to

	function(tuple[0], tuple[1], ..., tuple[len(tuple)-1])


While no new argument syntax was added in this phase, it would now be
quite sensible to add explicit syntax to Python for default argument
values (as in C++ or Modula-3), or a "rest" argument to receive the
remaining arguments of a variable-length argument list.


========================================================
==> Release 0.9.3 (never made available outside CWI) <==
========================================================

- string sys.version shows current version (also printed on interactive entry)
- more detailed exceptions, e.g., IOError, ZeroDivisionError, etc.
- 'global' statement to declare module-global variables assigned in functions.
- new class declaration syntax: class C(Base1, Base2, ...): suite
  (the old syntax is still accepted -- be sure to convert your classes now!)
- C shifting and masking operators: << >> ~ & ^ | (for ints and longs).
- C comparison operators: == != (the old = and <> remain valid).
- floating point numbers may now start with a period (e.g., .14).
- definition of integer division tightened (always truncates towards zero).
- new builtins hex(x), oct(x) return hex/octal string from (long) integer.
- new list method l.count(x) returns the number of occurrences of x in l.
- new SGI module: al (Indigo and 4D/35 audio library).
- the FORMS interface (modules fl and FL) now uses FORMS 2.0
- module gl: added lrect{read,write}, rectzoom and pixmode;
  added (non-GL) functions (un)packrect.
- new socket method: s.allowbroadcast(flag).
- many objects support __dict__, __methods__ or __members__.
- dir() lists anything that has __dict__.
- class attributes are no longer read-only.
- classes support __bases__, instances support __class__ (and __dict__).
- divmod() now also works for floats.
- fixed obscure bug in eval('1            ').


===================================
==> Release 0.9.2 (Autumn 1991) <==
===================================

Highlights
----------

- tutorial now (almost) complete; library reference reorganized
- new syntax: continue statement; semicolons; dictionary constructors;
  restrictions on blank lines in source files removed
- dramatically improved module load time through precompiled modules
- arbitrary precision integers: compute 2 to the power 1000 and more...
- arithmetic operators now accept mixed type operands, e.g., 3.14/4
- more operations on list: remove, index, reverse; repetition
- improved/new file operations: readlines, seek, tell, flush, ...
- process management added to the posix module: fork/exec/wait/kill etc.
- BSD socket operations (with example servers and clients!)
- many new STDWIN features (color, fonts, polygons, ...)
- new SGI modules: font manager and FORMS library interface


Extended list of changes in 0.9.2
---------------------------------

Here is a summary of the most important user-visible changes in 0.9.2,
in somewhat arbitrary order.  Changes in later versions are listed in
the "highlights" section above.


1. Changes to the interpreter proper

- Simple statements can now be separated by semicolons.
  If you write "if t: s1; s2", both s1 and s2 are executed
  conditionally.
- The 'continue' statement was added, with semantics as in C.
- Dictionary displays are now allowed on input: {key: value, ...}.
- Blank lines and lines bearing only a comment no longer need to
  be indented properly.  (A completely empty line still ends a multi-
  line statement interactively.)
- Mixed arithmetic is supported, 1 compares equal to 1.0, etc.
- Option "-c command" to execute statements from the command line
- Compiled versions of modules are cached in ".pyc" files, giving a
  dramatic improvement of start-up time
- Other, smaller speed improvements, e.g., extracting characters from
  strings, looking up single-character keys, and looking up global
  variables
- Interrupting a print operation raises KeyboardInterrupt instead of
  only cancelling the print operation
- Fixed various portability problems (it now passes gcc with only
  warnings -- more Standard C compatibility will be provided in later
  versions)
- Source is prepared for porting to MS-DOS
- Numeric constants are now checked for overflow (this requires
  standard-conforming strtol() and strtod() functions; a correct
  strtol() implementation is provided, but the strtod() provided
  relies on atof() for everything, including error checking


2. Changes to the built-in types, functions and modules

- New module socket: interface to BSD socket primitives
- New modules pwd and grp: access the UNIX password and group databases
- (SGI only:) New module "fm" interfaces to the SGI IRIX Font Manager
- (SGI only:) New module "fl" interfaces to Mark Overmars' FORMS library
- New numeric type: long integer, for unlimited precision
	- integer constants suffixed with 'L' or 'l' are long integers
	- new built-in function long(x) converts int or float to long
	- int() and float() now also convert from long integers
- New built-in function:
	- pow(x, y) returns x to the power y
- New operation and methods for lists:
	- l*n returns a new list consisting of n concatenated copies of l
	- l.remove(x) removes the first occurrence of the value x from l
	- l.index(x) returns the index of the first occurrence of x in l
	- l.reverse() reverses l in place
- New operation for tuples:
	- t*n returns a tuple consisting of n concatenated copies of t
- Improved file handling:
	- f.readline() no longer restricts the line length, is faster,
	  and isn't confused by null bytes; same for raw_input()
	- f.read() without arguments reads the entire (rest of the) file
	- mixing of print and sys.stdout.write() has different effect
- New methods for files:
	- f.readlines() returns a list containing the lines of the file,
	  as read with f.readline()
	- f.flush(), f.tell(), f.seek() call their stdio counterparts
	- f.isatty() tests for "tty-ness"
- New posix functions:
	- _exit(), exec(), fork(), getpid(), getppid(), kill(), wait()
	- popen() returns a file object connected to a pipe
	- utime() replaces utimes() (the latter is not a POSIX name)
- New stdwin features, including:
	- font handling
	- color drawing
	- scroll bars made optional
	- polygons
	- filled and xor shapes
	- text editing objects now have a 'settext' method


3. Changes to the standard library

- Name change: the functions path.cat and macpath.cat are now called
  path.join and macpath.join
- Added new modules: formatter, mutex, persist, sched, mainloop
- Added some modules and functionality to the "widget set" (which is
  still under development, so please bear with me):
	DirList, FormSplit, TextEdit, WindowSched
- Fixed module testall to work non-interactively
- Module string:
	- added functions join() and joinfields()
	- fixed center() to work correct and make it "transitive"
- Obsolete modules were removed: util, minmax
- Some modules were moved to the demo directory


4. Changes to the demonstration programs

- Added new useful scipts: byteyears, eptags, fact, from, lfact,
  objgraph, pdeps, pi, primes, ptags, which
- Added a bunch of socket demos
- Doubled the speed of ptags
- Added new stdwin demos: microedit, miniedit
- Added a windowing interface to the Python interpreter: python (most
  useful on the Mac)
- Added a browser for Emacs info files: demo/stdwin/ibrowse
  (yes, I plan to put all STDWIN and Python documentation in texinfo
  form in the future)


5. Other changes to the distribution

- An Emacs Lisp file "python.el" is provided to facilitate editing
  Python programs in GNU Emacs (slightly improved since posted to
  gnu.emacs.sources)
- Some info on writing an extension in C is provided
- Some info on building Python on non-UNIX platforms is provided


=====================================
==> Release 0.9.1 (February 1991) <==
=====================================

- Micro changes only
- Added file "patchlevel.h"


=====================================
==> Release 0.9.0 (February 1991) <==
=====================================

Original posting to alt.sources.
