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 management 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 an 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 directory if its name matches the module name (e.g.
  "__init__.py") and raise an 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 an 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 an 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 an 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 an 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 an 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 management 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
  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 management protocol 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 an ``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 management 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 an 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 management protocol 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 management 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 losing 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 management 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 management 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
  an ``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 an 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 management 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 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 an 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 an 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
  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 an 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 parameter 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 an 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 finalization 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() function 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.
