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. ====================================================================== ======================================= ==> 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://starship.python.net/crew/amk/python/writing/new-python/. 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 neccessary, and then use normpath()). * configure.in, configure, config.h.in, acconfig.h: For BeOS PowerPC. Chris Herborth. Mon Apr 5 21:54:14 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Modules/timemodule.c: Jonathan Giddy notes, and Chris Lawrence agrees, that some comments on #else/#endif are wrong, and that #if HAVE_TM_ZONE should be #ifdef. * Misc/ACKS: Bunch of new contributors, including 9 who contributed to the Docs, reported by Fred. Mon Apr 5 18:37:59 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/gzip.py: Oops, missed mode parameter to open(). * Lib/gzip.py: Made the default mode 'rb' instead of 'r', for better cross-platform support. (Based on comment on the documentation by Bernhard Reiter <bernhard@csd.uwm.edu>). Fri Apr 2 22:18:25 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Tools/scripts/dutree.py: For reasons I dare not explain, this script should always execute main() when imported (in other words, it is not usable as a module). Thu Apr 1 15:32:30 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/test_cpickle.py: Jonathan Giddy write: In test_cpickle.py, the module os got imported, but the line to remove the temp file has gone missing. Tue Mar 30 20:17:31 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/BaseHTTPServer.py: Per Cederqvist writes: If you send something like "PUT / HTTP/1.0" to something derived from BaseHTTPServer that doesn't define do_PUT, you will get a response that begins like this: HTTP/1.0 501 Unsupported method ('do_PUT') Server: SimpleHTTP/0.3 Python/1.5 Date: Tue, 30 Mar 1999 18:53:53 GMT The server should complain about 'PUT' instead of 'do_PUT'. This patch should fix the problem. Mon Mar 29 20:33:21 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/smtplib.py: Patch by Per Cederqvist, who writes: """ - It needlessly used the makefile() method for each response that is read from the SMTP server. - If the remote SMTP server closes the connection unexpectedly the code raised an IndexError. It now raises an SMTPServerDisconnected exception instead. - The code now checks that all lines in a multiline response actually contains an error code. """ The Dragon approves. Mon Mar 29 20:25:40 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/compileall.py: When run as a script, report failures in the exit code as well. Patch largely based on changes by Andrew Dalke, as discussed in the distutils-sig. Mon Mar 29 20:23:41 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urllib.py: Hack so that if a 302 or 301 redirect contains a relative URL, the right thing "just happens" (basejoin() with old URL). * Modules/cPickle.c: Protection against picling to/from closed (real) file. The problem was reported by Moshe Zadka. * Lib/test/test_cpickle.py: Test protection against picling to/from closed (real) file. * Modules/timemodule.c: Chris Lawrence writes: """ The GNU folks, in their infinite wisdom, have decided not to implement altzone in libc6; this would not be horrible, except that timezone (which is implemented) includes the current DST setting (i.e. timezone for Central is 18000 in summer and 21600 in winter). So Python's timezone and altzone variables aren't set correctly during DST. Here's a patch relative to 1.5.2b2 that (a) makes timezone and altzone show the "right" thing on Linux (by using the tm_gmtoff stuff available in BSD, which is how the GLIBC manual claims things should be done) and (b) should cope with the southern hemisphere. In pursuit of (b), I also took the liberty of renaming the "summer" and "winter" variables to "july" and "jan". This patch should also make certain time calculations on Linux actually work right (like the tz-aware functions in the rfc822 module). (It's hard to find DST that's currently being used in the southern hemisphere; I tested using Africa/Windhoek.) """ * Lib/test/output/test_gzip: Jonathan Giddy discovered this file was missing. * Modules/shamodule.c: Avoid warnings from AIX compiler. Reported by Vladimir (AIX is my middlename) Marangozov, patch coded by Greg Stein. * Tools/idle/ScriptBinding.py, Tools/idle/PyShell.py: At Tim Peters' recommendation, add a dummy flush() method to PseudoFile. Sun Mar 28 17:55:32 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Tools/scripts/ndiff.py: Tim Peters writes: I should have waited overnight <wink/sigh>. Nothing wrong with the one I sent, but I couldn't resist going on to add new -r1 / -r2 cmdline options for recreating the original files from ndiff's output. That's attached, if you're game! Us Windows guys don't usually have a sed sitting around <wink>. Sat Mar 27 13:34:01 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Tools/scripts/ndiff.py: Tim Peters writes: Attached is a cleaned-up version of ndiff (added useful module docstring, now echo'ed in case of cmd line mistake); added -q option to suppress initial file identification lines; + other minor cleanups, & a slightly faster match engine. Fri Mar 26 22:36:00 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Tools/scripts/dutree.py: During display, if EPIPE is raised, it's probably because a pager was killed. Discard the error in that case, but propogate it otherwise. Fri Mar 26 16:20:45 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/output/test_userlist, Lib/test/test_userlist.py: Test suite for UserList. * Lib/UserList.py: Use isinstance() where appropriate. Reformatted with 4-space indent. Fri Mar 26 16:11:40 1999 Barry Warsaw <bwarsaw@eric.cnri.reston.va.us> * Tools/pynche/PyncheWidget.py: Helpwin.__init__(): The text widget should get focus. * Tools/pynche/pyColorChooser.py: Removed unnecessary import `from PyncheWidget import PyncheWidget' Fri Mar 26 15:32:05 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/output/test_userdict, Lib/test/test_userdict.py: Test suite for UserDict * Lib/UserDict.py: Improved a bunch of things. The constructor now takes an optional dictionary. Use isinstance() where appropriate. Thu Mar 25 22:38:49 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/output/test_pickle, Lib/test/output/test_cpickle, Lib/test/test_pickle.py, Lib/test/test_cpickle.py: Basic regr tests for pickle/cPickle * Lib/pickle.py: Don't use "exec" in find_class(). It's slow, unnecessary, and (as AMK points out) it doesn't work in JPython Applets. Thu Mar 25 21:50:27 1999 Andrew Kuchling <akuchlin@eric.cnri.reston.va.us> * Lib/test/test_gzip.py: Added a simple test suite for gzip. It simply opens a temp file, writes a chunk of compressed data, closes it, writes another chunk, and reads the contents back to verify that they are the same. * Lib/gzip.py: Based on a suggestion from bruce@hams.com, make a trivial change to allow using the 'a' flag as a mode for opening a GzipFile. gzip files, surprisingly enough, can be concatenated and then decompressed; the effect is to concatenate the two chunks of data. If we support it on writing, it should also be supported on reading. This *wasn't* trivial, and required rearranging the code in the reading path, particularly the _read() method. Raise IOError instead of RuntimeError in two cases, 'Not a gzipped file' and 'Unknown compression method' Thu Mar 25 21:25:01 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/test_b1.py: Add tests for float() and complex() with string args (Nick/Stephanie Lockwood). Thu Mar 25 21:21:08 1999 Andrew Kuchling <akuchlin@eric.cnri.reston.va.us> * Modules/zlibmodule.c: Add an .unused_data attribute to decompressor objects. If .unused_data is not an empty string, this means that you have arrived at the end of the stream of compressed data, and the contents of .unused_data are whatever follows the compressed stream. Thu Mar 25 21:16:07 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Python/bltinmodule.c: Patch by Nick and Stephanie Lockwood to implement complex() with a string argument. This closes TODO item 2.19. Wed Mar 24 19:09:00 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Tools/webchecker/wcnew.py: Added Samuel Bayer's new webchecker. Unfortunately his code breaks wcgui.py in a way that's not easy to fix. I expect that this is a temporary situation -- eventually Sam's changes will be merged back in. (The changes add a -t option to specify exceptions to the -x option, and explicit checking for #foo style fragment ids.) * Objects/dictobject.c: Vladimir Marangozov contributed updated comments. * Objects/bufferobject.c: Folded long lines. * Lib/test/output/test_sha, Lib/test/test_sha.py: Added Jeremy's test code for the sha module. * Modules/shamodule.c, Modules/Setup.in: Added Greg Stein and Andrew Kuchling's sha module. Fix comments about zlib version and URL. * Lib/test/test_bsddb.py: Remove the temp file when we're done. * Include/pythread.h: Conform to standard boilerplate. * configure.in, configure, BeOS/linkmodule, BeOS/ar-fake: Chris Herborth: the new compiler in R4.1 needs some new options to work... * Modules/socketmodule.c: Implement two suggestions by Jonathan Giddy: (1) in AIX, clear the data struct before calling gethostby{name,addr}_r(); (2) ignore the 3/5/6 args determinations made by the configure script and switch on platform identifiers instead: AIX, OSF have 3 args Sun, SGI have 5 args Linux has 6 args On all other platforms, undef HAVE_GETHOSTBYNAME_R altogether. * Modules/socketmodule.c: Vladimir Marangozov implements the AIX 3-arg gethostbyname_r code. * Lib/mailbox.py: Add readlines() to _Subfile class. Not clear who would need it, but Chris Lawrence sent me a broken version; this one is a tad simpler and more conforming to the standard. Tue Mar 23 23:05:34 1999 Jeremy Hylton <jhylton@eric.cnri.reston.va.us> * Lib/gzip.py: use struct instead of bit-manipulate in Python Tue Mar 23 19:00:55 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Modules/Makefile.pre.in: Add $(EXE) to various occurrences of python so it will work on Cygwin with egcs (after setting EXE=.exe). Patch by Norman Vine. * configure, configure.in: Ack! It never defined HAVE_GETHOSTBYNAME_R so that code was never tested! Mon Mar 22 22:25:39 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Include/thread.h: Adding thread.h -- unused but for b/w compatibility. As requested by Bill Janssen. * configure.in, configure: Add code to test for all sorts of gethostbyname_r variants, donated by David Arnold. * config.h.in, acconfig.h: Add symbols for gethostbyname_r variants (sigh). * Modules/socketmodule.c: Clean up pass for the previous patches. - Use HAVE_GETHOSTBYNAME_R_6_ARG instead of testing for Linux and glibc2. - If gethostbyname takes 3 args, undefine HAVE_GETHOSTBYNAME_R -- don't know what code should be used. - New symbol USE_GETHOSTBYNAME_LOCK defined iff the lock should be used. - Modify the gethostbyaddr() code to also hold on to the lock until after it is safe to release, overlapping with the Python lock. (Note: I think that it could in theory be possible that Python code executed while gethostbyname_lock is held could attempt to reacquire the lock -- e.g. in a signal handler or destructor. I will simply say "don't do that then.") * Modules/socketmodule.c: Jonathan Giddy writes: Here's a patch to fix the race condition, which wasn't fixed by Rob's patch. It holds the gethostbyname lock until the results are copied out, which means that this lock and the Python global lock are held at the same time. This shouldn't be a problem as long as the gethostbyname lock is always acquired when the global lock is not held. Mon Mar 22 19:25:30 1999 Andrew Kuchling <akuchlin@eric.cnri.reston.va.us> * Modules/zlibmodule.c: Fixed the flush() method of compression objects; the test for the end of loop was incorrect, and failed when the flushmode != Z_FINISH. Logic cleaned up and commented. * Lib/test/test_zlib.py: Added simple test for the flush() method of compression objects, trying the different flush values Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH. Mon Mar 22 15:28:08 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/shlex.py: Bug reported by Tobias Thelen: missing "self." in assignment target. Fri Mar 19 21:50:11 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Modules/arraymodule.c: Use an unsigned cast to avoid a warning in VC++. * Lib/dospath.py, Lib/ntpath.py: New code for split() by Tim Peters, behaves more like posixpath.split(). * Objects/floatobject.c: Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if a block cannot be freed, add its free items back to the free list. This is necessary to avoid leaking when Python is reinitialized later. * Objects/intobject.c: Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if a block cannot be freed, add its free items back to the free list, and add its valid ints back to the small_ints array if they are in range. This is necessary to avoid leaking when Python is reinitialized later. * Lib/types.py: Added BufferType, the type returned by the new builtin buffer(). Greg Stein. * Python/bltinmodule.c: New builtin buffer() creates a derived read-only buffer from any object that supports the buffer interface (e.g. strings, arrays). * Objects/bufferobject.c: Added check for negative offset for PyBuffer_FromObject and check for negative size for PyBuffer_FromMemory. Greg Stein. Thu Mar 18 15:10:44 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urlparse.py: Sjoerd Mullender writes: If a filename on Windows starts with \\, it is converted to a URL which starts with ////. If this URL is passed to urlparse.urlparse you get a path that starts with // (and an empty netloc). If you pass the result back to urlparse.urlunparse, you get a URL that starts with //, which is parsed differently by urlparse.urlparse. The fix is to add the (empty) netloc with accompanying slashes if the path in urlunparse starts with //. Do this for all schemes that use a netloc. * Lib/nturl2path.py: Sjoerd Mullender writes: Pathnames of files on other hosts in the same domain (\\host\path\to\file) are not translated correctly to URLs and back. The URL should be something like file:////host/path/to/file. Note that a combination of drive letter and remote host is not possible. Wed Mar 17 22:30:10 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urlparse.py: Delete non-standard-conforming code in urljoin() that would use the netloc from the base url as the default netloc for the resulting url even if the schemes differ. Once upon a time, when the web was wild, this was a valuable hack because some people had a URL referencing an ftp server colocated with an http server without having the host in the ftp URL (so they could replicate it or change the hostname easily). More recently, after the file: scheme got added back to the list of schemes that accept a netloc, it turns out that this caused weirdness when joining an http: URL with a file: URL -- the resulting file: URL would always inherit the host from the http: URL because the file: scheme supports a netloc but in practice never has one. There are two reasons to get rid of the old, once-valuable hack, instead of removing the file: scheme from the uses_netloc list. One, the RFC says that file: uses the netloc syntax, and does not endorse the old hack. Two, neither netscape 4.5 nor IE 4.0 support the old hack. * Include/ceval.h, Include/abstract.h: Add DLL level b/w compat for PySequence_In and PyEval_CallObject Tue Mar 16 21:54:50 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/lib-tk/Tkinter.py: Bug reported by Jim Robinson: An attempt to execute grid_slaves with arguments (0,0) results in *all* of the slaves being returned, not just the slave associated with row 0, column 0. This is because the test for arguments in the method does not test to see if row (and column) does not equal None, but rather just whether is evaluates to non-false. A value of 0 fails this test. Tue Mar 16 14:17:48 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Modules/cmathmodule.c: Docstring fix: acosh() returns the hyperbolic arccosine, not the hyperbolic cosine. Problem report via David Ascher by one of his students. Mon Mar 15 21:40:59 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * configure.in: Should test for gethost*by*name_r, not for gethostname_r (which doesn't exist and doesn't make sense). * Modules/socketmodule.c: Patch by Rob Riggs for Linux -- glibc2 has a different argument converntion for gethostbyname_r() etc. than Solaris! * Python/thread_pthread.h: Rob Riggs wrote: """ Spec says that on success pthread_create returns 0. It does not say that an error code will be < 0. Linux glibc2 pthread_create() returns ENOMEM (12) when one exceed process limits. (It looks like it should return EAGAIN, but that's another story.) For reference, see: http://www.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html """ [I have a feeling that similar bugs were fixed before; perhaps someone could check that all error checks no check for != 0?] * Tools/bgen/bgen/bgenObjectDefinition.py: New mixin class that defines cmp and hash that use the ob_itself pointer. This allows (when using the mixin) different Python objects pointing to the same C object and behaving well as dictionary keys. Or so sez Jack Jansen... * Lib/urllib.py: Yet another patch by Sjoerd Mullender: Don't convert URLs to URLs using pathname2url. Fri Mar 12 22:15:43 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/cmd.py: Patch by Michael Scharf. He writes: The module cmd requires for each do_xxx command a help_xxx function. I think this is a little old fashioned. Here is a patch: use the docstring as help if no help_xxx function can be found. [I'm tempted to rip out all the help_* functions from pdb, but I'll resist it. Any takers? --Guido] * Tools/freeze/freeze.py: Bug submitted by Wayne Knowles, who writes: Under Windows, python freeze.py -o hello hello.py creates all the correct files in the hello subdirectory, but the Makefile has the directory prefix in it for frozen_extensions.c nmake fails because it tries to locate hello/frozen_extensions.c (His fix adds a call to os.path.basename() in the appropriate place.) * Objects/floatobject.c, Objects/intobject.c: Vladimir has restructured his code somewhat so that the blocks are now represented by an explicit structure. (There are still too many casts in the code, but that may be unavoidable.) Also added code so that with -vv it is very chatty about what it does. * Demo/zlib/zlibdemo.py, Demo/zlib/minigzip.py: Change #! line to modern usage; also chmod +x * Demo/pdist/rrcs, Demo/pdist/rcvs, Demo/pdist/rcsbump: Change #! line to modern usage * Lib/nturl2path.py, Lib/urllib.py: From: Sjoerd Mullender The filename to URL conversion didn't properly quote special characters. The URL to filename didn't properly unquote special chatacters. * Objects/floatobject.c: OK, try again. Vladimir gave me a fix for the alignment bus error, so here's his patch again. This time it works (at least on Solaris, Linux and Irix). Thu Mar 11 23:21:23 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Tools/idle/PathBrowser.py: Don't crash when sys.path contains an empty string. * Tools/idle/PathBrowser.py: - Don't crash in the case where a superclass is a string instead of a pyclbr.Class object; this can happen when the superclass is unrecognizable (to pyclbr), e.g. when module renaming is used. - Show a watch cursor when calling pyclbr (since it may take a while recursively parsing imported modules!). Thu Mar 11 16:04:04 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/mimetypes.py: Added .rdf and .xsl as application/xml types. (.rdf is for the Resource Description Framework, a metadata encoding, and .xsl is for the Extensible Stylesheet Language.) Thu Mar 11 13:26:23 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/test/output/test_popen2, Lib/test/test_popen2.py: Test for popen2 module, by Chris Tismer. * Objects/floatobject.c: Alas, Vladimir's patch caused a bus error (probably double alignment?), and I didn't test it. Withdrawing it for now. Wed Mar 10 22:55:47 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Objects/floatobject.c: Patch by Vladimir Marangoz to allow freeing of the allocated blocks of floats on finalization. * Objects/intobject.c: Patch by Vladimir Marangoz to allow freeing of the allocated blocks of integers on finalization. * Tools/idle/EditorWindow.py, Tools/idle/Bindings.py: Add PathBrowser to File module * Tools/idle/PathBrowser.py: "Path browser" - 4 scrolled lists displaying: directories on sys.path modules in selected directory classes in selected module methods of selected class Sinlge clicking in a directory, module or class item updates the next column with info about the selected item. Double clicking in a module, class or method item opens the file (and selects the clicked item if it is a class or method). I guess eventually I should be using a tree widget for this, but the ones I've seen don't work well enough, so for now I use the old Smalltalk or NeXT style multi-column hierarchical browser. * Tools/idle/MultiScrolledLists.py: New utility: multiple scrolled lists in parallel * Tools/idle/ScrolledList.py: - White background. - Display "(None)" (or text of your choosing) when empty. - Don't set the focus. Tue Mar 9 19:31:21 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urllib.py: open_http also had the 'data is None' test backwards. don't call with the extra argument if data is None. * Demo/embed/demo.c: Call Py_SetProgramName() instead of redefining getprogramname(), reflecting changes in the runtime around 1.5 or earlier. * Python/ceval.c: Always test for an error return (usually NULL or -1) without setting an exception. * Modules/timemodule.c: Patch by Chris Herborth for BeOS code. He writes: I had an off-by-1000 error in floatsleep(), and the problem with time.clock() is that it's not implemented properly on QNX... ANSI says it's supposed to return _CPU_ time used by the process, but on QNX it returns the amount of real time used... so I was confused. * Tools/bgen/bgen/macsupport.py: Small change by Jack Jansen. Test for self.returntype behaving like OSErr rather than being it. Thu Feb 25 16:14:58 1999 Jeremy Hylton <jhylton@eric.cnri.reston.va.us> * Lib/urllib.py: http_error had the 'data is None' test backwards. don't call with the extra argument if data is None. * Lib/urllib.py: change indentation from 8 spaces to 4 spaces * Lib/urllib.py: pleasing the tabnanny Thu Feb 25 14:26:02 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/colorsys.py: Oops, one more "x, y, z" to convert... * Lib/colorsys.py: Adjusted comment at the top to be less confusing, following Fredrik Lundh's example. Converted comment to docstring. Wed Feb 24 18:49:15 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/toaiff.py: Use sndhdr instead of the obsolete whatsound module. Wed Feb 24 18:42:38 1999 Jeremy Hylton <jhylton@eric.cnri.reston.va.us> * Lib/urllib.py: When performing a POST request, i.e. when the second argument to urlopen is used to specify form data, make sure the second argument is threaded through all of the http_error_NNN calls. This allows error handlers like the redirect and authorization handlers to properly re-start the connection. Wed Feb 24 16:25:17 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/mhlib.py: Patch by Lars Wirzenius: o the initial comment is wrong: creating messages is already implemented o Message.getbodytext: if the mail or it's part contains an empty content-transfer-encoding header, the code used to break; the change below treats an empty encoding value the same as the other types that do not need decoding o SubMessage.getbodytext was missing the decode argument; the change below adds it; I also made it unconditionally return the raw text if decoding was not desired, because my own routines needed that (and it was easier than rewriting my own routines ;-) Wed Feb 24 00:35:43 1999 Barry Warsaw <bwarsaw@eric.cnri.reston.va.us> * Python/bltinmodule.c (initerrors): Make sure that the exception tuples ("base-classes" when string-based exceptions are used) reflect the real class hierarchy, i.e. that SystemExit derives from Exception not StandardError. * Lib/exceptions.py: Document the correct class hierarchy for SystemExit. It is not an error and so it derives from Exception and not SystemError. The docstring was incorrect but the implementation was fine. Tue Feb 23 23:07:51 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/shutil.py: Add import sys, needed by reference to sys.exc_info() in rmtree(). Discovered by Mitch Chapman. * config.h.in: Now that we don't have AC_CHECK_LIB(m, pow), the HAVE_LIBM symbol disappears. It wasn't used anywhere anyway... * Modules/arraymodule.c: Carefully check for overflow when allocating the memory for fromfile -- someone tried to pass in sys.maxint and got bitten by the bogus calculations. * configure.in: Get rid of AC_CHECK_LIB(m, pow) since this is taken care of later with LIBM (from --with-libm=...); this actually broke the customizability offered by the latter option. Thanks go to Clay Spence for reporting this. * Lib/test/test_dl.py: 1. Print the error message (carefully) when a dl.open() fails in verbose mode. 2. When no test case worked, raise ImportError instead of failing. * Python/bltinmodule.c: Patch by Tim Peters to improve the range checks for range() and xrange(), especially for platforms where int and long are different sizes (so sys.maxint isn't actually the theoretical limit for the length of a list, but the largest C int is -- sys.maxint is the largest Python int, which is actually a C long). * Makefile.in: 1. Augment the DG/UX rule so it doesn't break the BeOS build. 2. Add $(EXE) to various occurrences of python so it will work on Cygwin with egcs (after setting EXE=.exe). These patches by Norman Vine. * Lib/posixfile.py: According to Jeffrey Honig, bsd/os 2.0 - 4.0 should be added to the list (of bsd variants that have a different lock structure). * Lib/test/test_fcntl.py: According to Jeffrey Honig, bsd/os 4.0 should be added to the list. * Modules/timemodule.c: Patch by Tadayoshi Funaba (with some changes) to be smarter about guessing what happened when strftime() returns 0. Is it buffer overflow or was the result simply 0 bytes long? (This happens for an empty format string, or when the format string is a single %Z and the timezone is unknown.) if the buffer is at least 256 times as long as the format, assume the latter. Mon Feb 22 19:01:42 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urllib.py: As Des Barry points out, we need to call pathname2url(file) in two calls to addinfourl() in open_file(). * Modules/Setup.in: Document *static* -- in two places! * Modules/timemodule.c: We don't support leap seconds, so the seconds field of a time 9-tuple should be in the range [0-59]. Noted by Tadayoshi Funaba. * Modules/stropmodule.c: In atoi(), don't use isxdigit() to test whether the last character converted was a "digit" -- use isalnum(). This test is there only to guard against "+" or "-" being interpreted as a valid int literal. Reported by Takahiro Nakayama. * Lib/os.py: As Finn Bock points out, _P_WAIT etc. don't have a leading underscore so they don't need to be treated specially here. Mon Feb 22 15:38:58 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Misc/NEWS: Typo: "apparentlt" --> "apparently" Mon Feb 22 15:38:46 1999 Guido van Rossum <guido@eric.cnri.reston.va.us> * Lib/urlparse.py: Steve Clift pointed out that 'file' allows a netloc. * Modules/posixmodule.c: The docstring for ttyname(..) claims a second "mode" argument. The actual code does not allow such an argument. (Finn Bock.) * Lib/lib-old/poly.py: Dang. Even though this is obsolete code, somebody found a bug, and I fix it. Oh well. Thu Feb 18 20:51:50 1999 Fred Drake <fdrake@eric.cnri.reston.va.us> * Lib/pyclbr.py: Bow to font-lock at the end of the docstring, since it throws stuff off. Make sure the path paramter to readmodule() is a list before adding it with sys.path, or the addition could fail. ====================================================================== From 1.5.2b1 to 1.5.2b2 ======================= General ------- - Many memory leaks fixed. - Many small bugs fixed. - Command line option -OO (or -O -O) suppresses inclusion of doc strings in resulting bytecode. Windows-specific changes ------------------------ - New built-in module winsound provides an interface to the Win32 PlaySound() call. - Re-enable the audioop module in the config.c file. - On Windows, support spawnv() and associated P_* symbols. - Fixed the conversion of times() return values on Windows. - Removed freeze from the installer -- it doesn't work without the source tree. (See FAQ 8.11.) - On Windows 95/98, the Tkinter module now is smart enough to find Tcl/Tk even when the PATH environment variable hasn't been set -- when the import of _tkinter fails, it searches in a standard locations, patches os.environ["PATH"], and tries again. When it still fails, a clearer error message is produced. This should avoid most installation problems with Tkinter use (e.g. in IDLE). - The -i option doesn't make any calls to set[v]buf() for stdin -- this apparently screwed up _kbhit() and the _tkinter main loop. - The ntpath module (and hence, os.path on Windows) now parses out UNC paths (e.g. \\host\mountpoint\dir\file) as "drive letters", so that splitdrive() will \\host\mountpoint as the drive and \dir\file as the path. ** EXPERIMENTAL ** - Added a hack to the exit code so that if (1) the exit status is nonzero and (2) we think we have our own DOS box (i.e. we're not started from a command line shell), we print a message and wait for the user to hit a key before the DOS box is closed. - Updated the installer to WISE 5.0g. Added a dialog warning about the imminent Tcl installation. Added a dialog to specify the program group name in the start menu. Upgraded the Tcl installer to Tcl 8.0.4. Changes to intrinsics --------------------- - The repr() or str() of a module object now shows the __file__ attribute (i.e., the file which it was loaded), or the string "(built-in)" if there is no __file__ attribute. - The range() function now avoids overflow during its calculations (if at all possible). - New info string sys.hexversion, which is an integer encoding the version in hexadecimal. In other words, hex(sys.hexversion) == 0x010502b2 for Python 1.5.2b2. New or improved ports --------------------- - Support for Nextstep descendants (future Mac systems). - Improved BeOS support. - Support dynamic loading of shared libraries on NetBSD platforms that use ELF (i.e., MIPS and Alpha systems). Configuration/build changes --------------------------- - The Lib/test directory is no longer included in the default module search path (sys.path) -- "test" has been a package ever since 1.5. - Now using autoconf 2.13. New library modules ------------------- - New library modules asyncore and asynchat: these form Sam Rushing's famous asynchronous socket library. Sam has gracefully allowed me to incorporate these in the standard Python library. - New module statvfs contains indexing constants for [f]statvfs() return tuple. Changes to the library ---------------------- - The wave module (platform-independent support for Windows sound files) has been fixed to actually make it work. - The sunau module (platform-independent support for Sun/NeXT sound files) has been fixed to work across platforms. Also, a weird encoding bug in the header of the audio test data file has been corrected. - Fix a bug in the urllib module that occasionally tripped up webchecker and other ftp retrieves. - ConfigParser's get() method now accepts an optional keyword argument (vars) that is substituted on top of the defaults that were setup in __init__. You can now also have recusive references in your configuration file. - Some improvements to the Queue module, including a put_nowait() module and an optional "block" second argument, to get() and put(), defaulting to 1. - The updated xmllib module is once again compatible with the version present in Python 1.5.1 (this was accidentally broken in 1.5.2b1). - The bdb module (base class for the debugger) now supports canonicalizing pathnames used in breakpoints. The derived class must override the new canonical() method for this to work. Also changed clear_break() to the backwards compatible old signature, and added clear_bpbynumber() for the new functionality. - In sgmllib (and hence htmllib), recognize attributes even if they don't have space in front of them. I.e. '<a name="foo"href="bar.html">' will now have two attributes recognized. - In the debugger (pdb), change clear syntax to support three alternatives: clear; clear file:line; clear bpno bpno ... - The os.path module now pretends to be a submodule within the os "package", so you can do things like "from os.path import exists". - The standard exceptions now have doc strings. - In the smtplib module, exceptions are now classes. Also avoid inserting a non-standard space after "TO" in rcpt() command. - The rfc822 module's getaddrlist() method now uses all occurrences of the specified header instead of just the first. Some other bugfixes too (to handle more weird addresses found in a very large test set, and to avoid crashes on certain invalid dates), and a small test module has been added. - Fixed bug in urlparse in the common-case code for HTTP URLs; it would lose the query, fragment, and/or parameter information. - The sndhdr module no longer supports whatraw() -- it depended on a rare extenral program. - The UserList module/class now supports the extend() method, like real list objects. - The uu module now deals better with trailing garbage generated by some broke uuencoders. - The telnet module now has an my_interact() method which uses threads instead of select. The interact() method uses this by default on Windows (where the single-threaded version doesn't work). - Add a class to mailbox.py for dealing with qmail directory mailboxes. The test code was extended to notice these being used as well. Changes to extension modules ---------------------------- - Support for the [f]statvfs() system call, where it exists. - Fixed some bugs in cPickle where bad input could cause it to dump core. - Fixed cStringIO to make the writelines() function actually work. - Added strop.expandtabs() so string.expandtabs() is now much faster. - Added fsync() and fdatasync(), if they appear to exist. - Support for "long files" (64-bit seek pointers). - Fixed a bug in the zlib module's flush() function. - Added access() system call. It returns 1 if access granted, 0 if not. - The curses module implements an optional nlines argument to w.scroll(). (It then calls wscrl(win, nlines) instead of scoll(win).) Changes to tools ---------------- - Some changes to IDLE; see Tools/idle/NEWS.txt. - Latest version of Misc/python-mode.el included. Changes to Tkinter ------------------ - Avoid tracebacks when an image is deleted after its root has been destroyed. Changes to the Python/C API --------------------------- - When parentheses are used in a PyArg_Parse[Tuple]() call, any sequence is now accepted, instead of requiring a tuple. This is in line with the general trend towards accepting arbitrary sequences. - Added PyModule_GetFilename(). - In PyNumber_Power(), remove unneeded and even harmful test for float to the negative power (which is already and better done in floatobject.c). - New version identification symbols; read patchlevel.h for info. The version numbers are now exported by Python.h. - Rolled back the API version change -- it's back to 1007! - The frozenmain.c function calls PyInitFrozenExtensions(). - Added 'N' format character to Py_BuildValue -- like 'O' but doesn't INCREF. ====================================================================== From 1.5.2a2 to 1.5.2b1 ======================= Changes to intrinsics --------------------- - New extension NotImplementedError, derived from RuntimeError. Not used, but recommended use is for "abstract" methods to raise this. - The parser will now spit out a warning or error when -t or -tt is used for parser input coming from a string, too. - The code generator now inserts extra SET_LINENO opcodes when compiling multi-line argument lists. - When comparing bound methods, use identity test on the objects, not equality test. New or improved ports --------------------- - Chris Herborth has redone his BeOS port; it now works on PowerPC (R3/R4) and x86 (R4 only). Threads work too in this port. Renaming -------- - Thanks to Chris Herborth, the thread primitives now have proper Py* names in the source code (they already had those for the linker, through some smart macros; but the source still had the old, un-Py names). Configuration/build changes --------------------------- - Improved support for FreeBSD/3. - Check for pthread_detach instead of pthread_create in libc. - The makesetup script now searches EXECINCLUDEPY before INCLUDEPY. - Misc/Makefile.pre.in now also looks at Setup.thread and Setup.local. Otherwise modules such as thread didn't get incorporated in extensions. New library modules ------------------- - shlex.py by Eric Raymond provides a lexical analyzer class for simple shell-like syntaxes. - netrc.py by Eric Raymond provides a parser for .netrc files. (The undocumented Netrc class in ftplib.py is now obsolete.) - codeop.py is a new module that contains the compile_command() function that was previously in code.py. This is so that JPython can provide its own version of this function, while still sharing the higher-level classes in code.py. - turtle.py is a new module for simple turtle graphics. I'm still working on it; let me know if you use this to teach Python to children or other novices without prior programming experience. Obsoleted library modules ------------------------- - poly.py and zmod.py have been moved to Lib/lib-old to emphasize their status of obsoleteness. They don't do a particularly good job and don't seem particularly relevant to the Python core. New tools --------- - I've added IDLE: my Integrated DeveLopment Environment for Python. Requires Tcl/Tk (and Tkinter). Works on Windows and Unix (and should work on Macintosh, but I haven't been able to test it there; it does depend on new features in 1.5.2 and perhaps even new features in 1.5.2b1, especially the new code module). This is very much a work in progress. I'd like to hear how people like it compared to PTUI (or any other IDE they are familiar with). - New tools by Barry Warsaw: = audiopy: controls the Solaris Audio device = pynche: The PYthonically Natural Color and Hue Editor = world: Print mappings between country names and DNS country codes New demos --------- - Demo/scripts/beer.py prints the lyrics to an arithmetic drinking song. - Demo/tkinter/guido/optionmenu.py shows how to do an option menu in Tkinter. (By Fredrik Lundh -- not by me!) Changes to the library ---------------------- - compileall.py now avoids recompiling .py files that haven't changed; it adds a -f option to force recompilation. - New version of xmllib.py by Sjoerd Mullender (0.2 with latest patches). - nntplib.py: statparse() no longer lowercases the message-id. - types.py: use type(__stdin__) for FileType. - urllib.py: fix translations for filenames with "funny" characters. Patch by Sjoerd Mullender. Note that if you subclass one of the URLopener classes, and you have copied code from the old urllib.py, your subclass may stop working. A long-term solution is to provide more methods so that you don't have to copy code. - cgi.py: In read_multi, allow a subclass to override the class we instantiate when we create a recursive instance, by setting the class variable 'FieldStorageClass' to the desired class. By default, this is set to None, in which case we use self.__class__ (as before). Also, a patch by Jim Fulton to pass additional arguments to recursive calls to the FieldStorage constructor from its read_multi method. - UserList.py: In __getslice__, use self.__class__ instead of UserList. - In SimpleHTTPServer.py, the server specified in test() should be BaseHTTPServer.HTTPServer, in case the request handler should want to reference the two attributes added by BaseHTTPServer.server_bind. (By Jeff Rush, for Bobo). Also open the file in binary mode, so serving images from a Windows box might actually work. - In CGIHTTPServer.py, the list of acceptable formats is -split- on spaces but -joined- on commas, resulting in double commas in the joined text. (By Jeff Rush.) - SocketServer.py, patch by Jeff Bauer: a minor change to declare two new threaded versions of Unix Server classes, using the ThreadingMixIn class: ThreadingUnixStreamServer, ThreadingUnixDatagramServer. - bdb.py: fix bomb on deleting a temporary breakpoint: there's no method do_delete(); do_clear() was meant. By Greg Ward. - getopt.py: accept a non-list sequence for the long options (request by Jack Jansen). Because it might be a common mistake to pass a single string, this situation is treated separately. Also added docstrings (copied from the library manual) and removed the (now redundant) module comments. - tempfile.py: improvements to avoid security leaks. - code.py: moved compile_command() to new module codeop.py. - pickle.py: support pickle format 1.3 (binary float added). By Jim Fulton. Also get rid of the undocumented obsolete Pickler dump_special method. - uu.py: Move 'import sys' to top of module, as noted by Tim Peters. - imaplib.py: fix problem with some versions of IMAP4 servers that choose to mix the case in their CAPABILITIES response. - cmp.py: use (f1, f2) as cache key instead of f1 + ' ' + f2. Noted by Fredrik Lundh. Changes to extension modules ---------------------------- - More doc strings for several modules were contributed by Chris Petrilli: math, cmath, fcntl. - Fixed a bug in zlibmodule.c that could cause core dumps on decompression of rarely occurring input. - cPickle.c: new version from Jim Fulton, with Open Source copyright notice. Also, initialize self->safe_constructors early on to prevent crash in early dealloc. - cStringIO.c: new version from Jim Fulton, with Open Source copyright notice. Also fixed a core dump in cStringIO.c when doing seeks. - mpzmodule.c: fix signed character usage in mpz.mpz(stringobjecty). - readline.c: Bernard Herzog pointed out that rl_parse_and_bind modifies its argument string (bad function!), so we make a temporary copy. - sunaudiodev.c: Barry Warsaw added more smarts to get the device and control pseudo-device, per audio(7I). Changes to tools ---------------- - New, improved version of Barry Warsaw's Misc/python-mode.el (editing support for Emacs). - tabnanny.py: added a -q ('quiet') option to tabnanny, which causes only the names of offending files to be printed. - freeze: when printing missing modules, also print the module they were imported from. - untabify.py: patch by Detlef Lannert to implement -t option (set tab size). Changes to Tkinter ------------------ - grid_bbox(): support new Tk API: grid bbox ?column row? ?column2 row2? - _tkinter.c: RajGopal Srinivasan noted that the latest code (1.5.2a2) doesn't work when running in a non-threaded environment. He added some #ifdefs that fix this. Changes to the Python/C API --------------------------- - Bumped API version number to 1008 -- enough things have changed! - There's a new macro, PyThreadState_GET(), which does the same work as PyThreadState_Get() without the overhead of a function call (it also avoids the error check). The two top calling locations of PyThreadState_Get() have been changed to use this macro. - All symbols intended for export from a DLL or shared library are now marked as such (with the DL_IMPORT() macro) in the header file that declares them. This was needed for the BeOS port, and should also make some other ports easier. The PC port no longer needs the file with exported symbols (PC/python_nt.def). There's also a DL_EXPORT macro which is only used for init methods in extension modules, and for Py_Main(). Invisible changes to internals ------------------------------ - Fixed a bug in new_buffersize() in fileobject.c which could return a buffer size that was way too large. - Use PySys_WriteStderr instead of fprintf in most places. - dictobject.c: remove dead code discovered by Vladimir Marangozov. - tupleobject.c: make tuples less hungry -- an extra item was allocated but never used. Tip by Vladimir Marangozov. - mymath.h: Metrowerks PRO4 finally fixes the hypot snafu. (Jack Jansen) - import.c: Jim Fulton fixes a reference count bug in PyEval_GetGlobals. - glmodule.c: check in the changed version after running the stubber again -- this solves the conflict with curses over the 'clear' entry point much nicer. (Jack Jansen had checked in the changes to cstubs eons ago, but I never regenrated glmodule.c :-( ) - frameobject.c: fix reference count bug in PyFrame_New. Vladimir Marangozov. - stropmodule.c: add a missing DECREF in an error exit. Submitted by Jonathan Giddy. ====================================================================== From 1.5.2a1 to 1.5.2a2 ======================= General ------- - It is now a syntax error to have a function argument without a default following one with a default. - __file__ is now set to the .py file if it was parsed (it used to always be the .pyc/.pyo file). - Don't exit with a fatal error during initialization when there's a problem with the exceptions.py module. - New environment variable PYTHONOPTIMIZE can be used to set -O. - New version of python-mode.el for Emacs. Miscellaneous fixed bugs ------------------------ - No longer print the (confusing) error message about stack underflow while compiling. - Some threading and locking bugs fixed. - When errno is zero, report "Error", not "Success". Documentation ------------- - Documentation will be released separately. - Doc strings added to array and md5 modules by Chris Petrilli. Ports and build procedure ------------------------- - Stop installing when a move or copy fails. - New version of the OS/2 port code by Jeff Rush. - The makesetup script handles absolute filenames better. - The 'new' module is now enabled by default in the Setup file. - I *think* I've solved the problem with the Linux build blowing up sometimes due to a conflict between sigcheck/intrcheck and signalmodule. Built-in functions ------------------ - The second argument to apply() can now be any sequence, not just a tuple. Built-in types -------------- - Lists have a new method: L1.extend(L2) is equivalent to the common idiom L1[len(L1):] = L2. - Better error messages when a sequence is indexed with a non-integer. - Bettter error message when calling a non-callable object (include the type in the message). Python services --------------- - New version of cPickle.c fixes some bugs. - pickle.py: improved instantiation error handling. - code.py: reworked quite a bit. New base class InteractiveInterpreter and derived class InteractiveConsole. Fixed several problems in compile_command(). - py_compile.py: print error message and continue on syntax errors. Also fixed an old bug with the fstat code (it was never used). - pyclbr.py: support submodules of packages. String Services --------------- - StringIO.py: raise the right exception (ValueError) for attempted I/O on closed StringIO objects. - re.py: fixed a bug in subn(), which caused .groups() to fail inside the replacement function called by sub(). - The struct module has a new format 'P': void * in native mode. Generic OS Services ------------------- - Module time: Y2K robustness. 2-digit year acceptance depends on value of time.accept2dyear, initialized from env var PYTHONY2K, default 0. Years 00-68 mean 2000-2068, while 69-99 mean 1969-1999 (POSIX or X/Open recommendation). - os.path: normpath(".//x") should return "x", not "/x". - getpass.py: fall back on default_getpass() when sys.stdin.fileno() doesn't work. - tempfile.py: regenerate the template after a fork() call. Optional OS Services -------------------- - In the signal module, disable restarting interrupted system calls when we have siginterrupt(). Debugger -------- - No longer set __args__; this feature is no longer supported and can affect the debugged code. - cmd.py, pdb.py and bdb.py have been overhauled by Richard Wolff, who added aliases and some other useful new features, e.g. much better breakpoint support: temporary breakpoint, disabled breakpoints, breakpoints with ignore counts, and conditions; breakpoints can be set on a file before it is loaded. Profiler -------- - Changes so that JPython can use it. Also fix the calibration code so it actually works again . Internet Protocols and Support ------------------------------ - imaplib.py: new version from Piers Lauder. - smtplib.py: change sendmail() method to accept a single string or a list or strings as the destination (commom newbie mistake). - poplib.py: LIST with a msg argument fixed. - urlparse.py: some optimizations for common case (http). - urllib.py: support content-length in info() for ftp protocol; support for a progress meter through a third argument to urlretrieve(); commented out gopher test (the test site is dead). Internet Data handling ---------------------- - sgmllib.py: support tags with - or . in their name. - mimetypes.py: guess_type() understands 'data' URLs. Restricted Execution -------------------- - The classes rexec.RModuleLoader and rexec.RModuleImporter no longer exist. Tkinter ------- - When reporting an exception, store its info in sys.last_*. Also, write all of it to stderr. - Added NS, EW, and NSEW constants, for grid's sticky option. - Fixed last-minute bug in 1.5.2a1 release: need to include "mytime.h". - Make bind variants without a sequence return a tuple of sequences (formerly it returned a string, which wasn't very convenient). - Add image commands to the Text widget (these are new in Tk 8.0). - Added new listbox and canvas methods: {xview,yview}_{scroll,moveto}.) - Improved the thread code (but you still can't call update() from another thread on Windows). - Fixed unnecessary references to _default_root in the new dialog modules. - Miscellaneous problems fixed. Windows General --------------- - Call LoadLibraryEx(..., ..., LOAD_WITH_ALTERED_SEARCH_PATH) to search for dependent dlls in the directory containing the .pyd. - In debugging mode, call DebugBreak() in Py_FatalError(). Windows Installer ----------------- - Install zlib.dll in the DLLs directory instead of in the win32 system directory, to avoid conflicts with other applications that have their own zlib.dll. Test Suite ---------- - test_long.py: new test for long integers, by Tim Peters. - regrtest.py: improved so it can be used for other test suites as well. - test_strftime.py: use re to compare test results, to support legal variants (e.g. on Linux). Tools and Demos --------------- - Four new scripts in Tools/scripts: crlf.py and lfcr.py (to remove/add Windows style '\r\n' line endings), untabify.py (to remove tabs), and rgrep.yp (reverse grep). - Improvements to Tools/freeze/. Each Python module is now written to its own C file. This prevents some compilers or assemblers from blowing up on large frozen programs, and saves recompilation time if only a few modules are changed. Other changes too, e.g. new command line options -x and -i. - Much improved (and smaller!) version of Tools/scripts/mailerdaemon.py. Python/C API ------------ - New mechanism to support extensions of the type object while remaining backward compatible with extensions compiled for previous versions of Python 1.5. A flags field indicates presence of certain fields. - Addition to the buffer API to differentiate access to bytes and 8-bit characters (in anticipation of Unicode characters). - New argument parsing format t# ("text") to indicate 8-bit characters; s# simply means 8-bit bytes, for backwards compatibility. - New object type, bufferobject.c is an example and can be used to create buffers from memory. - Some support for 64-bit longs, including some MS platforms. - Many calls to fprintf(stderr, ...) have been replaced with calls to PySys_WriteStderr(...). - The calling context for PyOS_Readline() has changed: it must now be called with the interpreter lock held! It releases the lock around the call to the function pointed to by PyOS_ReadlineFunctionPointer (default PyOS_StdioReadline()). - New APIs PyLong_FromVoidPtr() and PyLong_AsVoidPtr(). - Renamed header file "thread.h" to "pythread.h". - The code string of code objects may now be anything that supports the buffer API. ====================================================================== From 1.5.1 to 1.5.2a1 ===================== General ------- - When searching for the library, a landmark that is a compiled module (string.pyc or string.pyo) is also accepted. - When following symbolic links to the python executable, use a loop so that a symlink to a symlink can work. - Added a hack so that when you type 'quit' or 'exit' at the interpreter, you get a friendly explanation of how to press Ctrl-D (or Ctrl-Z) to exit. - New and improved Misc/python-mode.el (Python mode for Emacs). - Revert a new feature in Unix dynamic loading: for one or two revisions, modules were loaded using the RTLD_GLOBAL flag. It turned out to be a bad idea. Miscellaneous fixed bugs ------------------------ - All patches on the patch page have been integrated. (But much more has been done!) - Several memory leaks plugged (e.g. the one for classes with a __getattr__ method). - Removed the only use of calloc(). This triggered an obscure bug on multiprocessor Sparc Solaris 2.6. - Fix a peculiar bug that would allow "import sys.time" to succeed (believing the built-in time module to be a part of the sys package). - Fix a bug in the overflow checking when converting a Python long to a C long (failed to convert -2147483648L, and some other cases). Documentation ------------- - Doc strings have been added to many extension modules: __builtin__, errno, select, signal, socket, sys, thread, time. Also to methods of list objects (try [].append.__doc__). A doc string on a type will now automatically be propagated to an instance if the instance has methods that are accessed in the usual way. - The documentation has been expanded and the formatting improved. (Remember that the documentation is now unbundled and has its own release cycle though; see http://www.python.org/doc/.) - Added Misc/Porting -- a mini-FAQ on porting to a new platform. Ports and build procedure ------------------------- - The BeOS port is now integrated. Courtesy Chris Herborth. - Symbol files for FreeBSD 2.x and 3.x have been contributed (Lib/plat-freebsd[23]/*). - Support HPUX 10.20 DCE threads. - Finally fixed the configure script so that (on SGI) if -OPT:Olimit=0 works, it won't also use -Olimit 1500 (which gives a warning for every file). Also support the SGI_ABI environment variable better. - The makesetup script now understands absolute pathnames ending in .o in the module -- it assumes it's a file for which we have no source. - Other miscellaneous improvements to the configure script and Makefiles. - The test suite now uses a different sound sample. Built-in functions ------------------ - Better checks for invalid input to int(), long(), string.atoi(), string.atol(). (Formerly, a sign without digits would be accepted as a legal ways to spell zero.) - Changes to map() and filter() to use the length of a sequence only as a hint -- if an IndexError happens earlier, take that. (Formerly, this was considered an error.) - Experimental feature in getattr(): a third argument can specify a default (instead of raising AttributeError). - Implement round() slightly different, so that for negative ndigits no additional errors happen in the last step. - The open() function now adds the filename to the exception when it fails. Built-in exceptions ------------------- - New standard exceptions EnvironmentError and PosixError. EnvironmentError is the base class for IOError and PosixError; PosixError is the same as os.error. All this so that either exception class can be instantiated with a third argument indicating a filename. The built-in function open() and most os/posix functions that take a filename argument now use this. Built-in types -------------- - List objects now have an experimental pop() method; l.pop() returns and removes the last item; l.pop(i) returns and removes the item at i. Also, the sort() method is faster again. Sorting is now also safer: it is impossible for the sorting function to modify the list while the sort is going on (which could cause core dumps). - Changes to comparisons: numbers are now smaller than any other type. This is done to prevent the circularity where [] < 0L < 1 < [] is true. As a side effect, cmp(None, 0) is now positive instead of negative. This *shouldn't* affect any working code, but I've found that the change caused several "sleeping" bugs to become active, so beware! - Instance methods may now have other callable objects than just Python functions as their im_func. Use new.instancemethod() or write your own C code to create them; new.instancemethod() may be called with None for the instance to create an unbound method. - Assignment to __name__, __dict__ or __bases__ of a class object is now allowed (with stringent type checks); also allow assignment to __getattr__ etc. The cached values for __getattr__ etc. are recomputed after such assignments (but not for derived classes :-( ). - Allow assignment to some attributes of function objects: func_code, func_defaults and func_doc / __doc__. (With type checks except for __doc__ / func_doc .) Python services --------------- - New tests (in Lib/test): reperf.py (regular expression benchmark), sortperf.py (list sorting benchmark), test_MimeWriter.py (test case for the MimeWriter module). - Generalized test/regrtest.py so that it is useful for testing other packages. - The ihooks.py module now understands package imports. - In code.py, add a class that subsumes Fredrik Lundh's PythonInterpreter class. The interact() function now uses this. - In rlcompleter.py, in completer(), return None instead of raising an IndexError when there are no more completions left. - Fixed the marshal module to test for certain common kinds of invalid input. (It's still not foolproof!) - In the operator module, add an alias (now the preferred name) "contains" for "sequenceincludes". String Services --------------- - In the string and strop modules, in the replace() function, treat an empty pattern as an error (since it's not clear what was meant!). - Some speedups to re.py, especially the string substitution and split functions. Also added new function/method findall(), to find all occurrences of a given substring. - In cStringIO, add better argument type checking and support the readonly 'closed' attribute (like regular files). - In the struct module, unsigned 1-2 byte sized formats no longer result in long integer values. Miscellaneous services ---------------------- - In whrandom.py, added new method and function randrange(), same as choice(range(start, stop, step)) but faster. This addresses the problem that randint() was accidentally defined as taking an inclusive range. Also, randint(a, b) is now redefined as randrange(a, b+1), adding extra range and type checking to its arguments! - Add some semi-thread-safety to random.gauss() (it used to be able to crash when invoked from separate threads; now the worst it can do is give a duplicate result occasionally). - Some restructuring and generalization done to cmd.py. - Major upgrade to ConfigParser.py; converted to using 're', added new exceptions, support underscore in section header and option name. No longer add 'name' option to every section; instead, add '__name__'. - In getpass.py, don't use raw_input() to ask for the password -- we don't want it to show up in the readline history! Also don't catch interrupts (the try-finally already does all necessary cleanup). Generic OS Services ------------------- - New functions in os.py: makedirs(), removedirs(), renames(). New variable: linesep (the line separator as found in binary files, i.e. '\n' on Unix, '\r\n' on DOS/Windows, '\r' on Mac. Do *not* use this with files opened in (default) text mode; the line separator used will always be '\n'! - Changes to the 'os.path' submodule of os.py: added getsize(), getmtime(), getatime() -- these fetch the most popular items from the stat return tuple. - In the time module, add strptime(), if it exists. (This parses a time according to a format -- the inverse of strftime().) Also, remove the call to mktime() from strftime() -- it messed up the formatting of some non-local times. - In the socket module, added a new function gethostbyname_ex(). Also, don't use #ifdef to test for some symbols that are enums on some platforms (and should exist everywhere). Optional OS Services -------------------- - Some fixes to gzip.py. In particular, the readlines() method now returns the lines *with* trailing newline characters, like readlines() of regular file objects. Also, it didn't work together with cPickle; fixed that. - In whichdb.py, support byte-swapped dbhash (bsddb) files. - In anydbm.py, look at the type of an existing database to determine which module to use to open it. (The anydbm.error exception is now a tuple.) Unix Services ------------- - In the termios module, in tcsetattr(), initialize the structure vy calling tcgetattr(). - Added some of the "wait status inspection" macros as functions to the posix module (and thus to the os module): WEXITSTATUS(), WIFEXITED(), WIFSIGNALED(), WIFSTOPPED(), WSTOPSIG(), WTERMSIG(). - In the syslog module, make the default facility more intuitive (matching the docs). Debugger -------- - In pdb.py, support for setting breaks on files/modules that haven't been loaded yet. Internet Protocols and Support ------------------------------ - Changes in urllib.py; sped up unquote() and quote(). Fixed an obscure bug in quote_plus(). Added urlencode(dict) -- convenience function for sending a POST request with urlopen(). Use the getpass module to ask for a password. Rewrote the (test) main program so that when used as a script, it can retrieve one or more URLs to stdout. Use -t to run the self-test. Made the proxy code work again. - In cgi.py, treat "HEAD" the same as "GET", so that CGI scripts don't fail when someone asks for their HEAD. Also, for POST, set the default content-type to application/x-www-form-urlencoded. Also, in FieldStorage.__init__(), when method='GET', always get the query string from environ['QUERY_STRING'] or sys.argv[1] -- ignore an explicitly passed in fp. - The smtplib.py module now supports ESMTP and has improved standard compliance, for picky servers. - Improved imaplib.py. - Fixed UDP support in SocketServer.py (it never worked). - Fixed a small bug in CGIHTTPServer.py. Internet Data handling ---------------------- - In rfc822.py, add a new class AddressList. Also support a new overridable method, isheader(). Also add a get() method similar to dictionaries (and make getheader() an alias for it). Also, be smarter about seekable (test whether fp.tell() works) and test for presence of unread() method before trying seeks. - In sgmllib.py, restore the call to report_unbalanced() that was lost long ago. Also some other improvements: handle <? processing instructions >, allow . and - in entity names, and allow \r\n as line separator. - Some restructuring and generalization done to multifile.py; support a 'seekable' flag. Restricted Execution -------------------- - Improvements to rexec.py: package support; support a (minimal) sys.exc_info(). Also made the (test) main program a bit fancier (you can now use it to run arbitrary Python scripts in restricted mode). Tkinter ------- - On Unix, Tkinter can now safely be used from a multi-threaded application. (Formerly, no threads would make progress while Tkinter's mainloop() was active, because it didn't release the Python interpreter lock.) Unfortunately, on Windows, threads other than the main thread should not call update() or update_idletasks() because this will deadlock the application. - An interactive interpreter that uses readline and Tkinter no longer uses up all available CPU time. - Even if readline is not used, Tk windows created in an interactive interpreter now get continuously updated. (This even works in Windows as long as you don't hit a key.) - New demos in Demo/tkinter/guido/: brownian.py, redemo.py, switch.py. - No longer register Tcl_finalize() as a low-level exit handler. It may call back into Python, and that's a bad idea. - Allow binding of Tcl commands (given as a string). - Some minor speedups; replace explicitly coded getint() with int() in most places. - In FileDialog.py, remember the directory of the selected file, if given. - Change the names of all methods in the Wm class: they are now wm_title(), etc. The old names (title() etc.) are still defined as aliases. - Add a new method of interpreter objects, interpaddr(). This returns the address of the Tcl interpreter object, as an integer. Not very useful for the Python programmer, but this can be called by another C extension that needs to make calls into the Tcl/Tk C API and needs to get the address of the Tcl interpreter object. A simple cast of the return value to (Tcl_Interp *) will do the trick. Windows General --------------- - Don't insist on proper case for module source files if the filename is all uppercase (e.g. FOO.PY now matches foo; but FOO.py still doesn't). This should address problems with this feature on oldfashioned filesystems (Novell servers?). Windows Library --------------- - os.environ is now all uppercase, but accesses are case insensitive, and the putenv() calls made as a side effect of changing os.environ are case preserving. - Removed samefile(), sameopenfile(), samestat() from os.path (aka ntpath.py) -- these cannot be made to work reliably (at least I wouldn't know how). - Fixed os.pipe() so that it returns file descriptors acceptable to os.read() and os.write() (like it does on Unix), rather than Windows file handles. - Added a table of WSA error codes to socket.py. - In the select module, put the (huge) file descriptor arrays on the heap. - The getpass module now raises KeyboardInterrupt when it sees ^C. - In mailbox.py, fix tell/seek when using files opened in text mode. - In rfc822.py, fix tell/seek when using files opened in text mode. - In the msvcrt extension module, release the interpreter lock for calls that may block: _locking(), _getch(), _getche(). Also fix a bogus error return when open_osfhandle() doesn't have the right argument list. Windows Installer ----------------- - The registry key used is now "1.5" instead of "1.5.x" -- so future versions of 1.5 and Mark Hammond's win32all installer don't need to be resynchronized. Windows Tools ------------- - Several improvements to freeze specifically for Windows. Windows Build Procedure ----------------------- - The VC++ project files and the WISE installer have been moved to the PCbuild subdirectory, so they are distributed in the same subdirectory where they must be used. This avoids confusion. - New project files for Windows 3.1 port by Jim Ahlstrom. - Got rid of the obsolete subdirectory PC/setup_nt/. - The projects now use distinct filenames for the .exe, .dll, .lib and .pyd files built in debug mode (by appending "_d" to the base name, before the extension). This makes it easier to switch between the two and get the right versions. There's a pragma in config.h that directs the linker to include the appropriate .lib file (so python15.lib no longer needs to be explicit in your project). - The installer now installs more files (e.g. config.h). The idea is that you shouldn't need the source distribution if you want build your own extensions in C or C++. Tools and Demos --------------- - New script nm2def.py by Marc-Andre Lemburg, to construct PC/python_nt.def automatically (some hand editing still required). - New tool ndiff.py: Tim Peters' text diffing tool. - Various and sundry improvements to the freeze script. - The script texi2html.py (which was part of the Doc tree but is no longer used there) has been moved to the Tools/scripts subdirectory. - Some generalizations in the webchecker code. There's now a primnitive gui for websucker.py: wsgui.py. (In Tools/webchecker/.) - The ftpmirror.py script now handles symbolic links properly, and also files with multiple spaces in their names. - The 1.5.1 tabnanny.py suffers an assert error if fed a script whose last line is both indented and lacks a newline. This is now fixed. Python/C API ------------ - Added missing prototypes for PyEval_CallFunction() and PyEval_CallMethod(). - New macro PyList_SET_ITEM(). - New macros to access object members for PyFunction, PyCFunction objects. - New APIs PyImport_AppendInittab() an PyImport_ExtendInittab() to dynamically add one or many entries to the table of built-in modules. - New macro Py_InitModule3(name, methods, doc) which calls Py_InitModule4() with appropriate arguments. (The -4 variant requires you to pass an obscure version number constant which is always the same.) - New APIs PySys_WriteStdout() and PySys_WriteStderr() to write to sys.stdout or sys.stderr using a printf-like interface. (Used in _tkinter.c, for example.) - New APIs for conversion between Python longs and C 'long long' if your compiler supports it. - PySequence_In() is now called PySequence_Contains(). (PySequence_In() is still supported for b/w compatibility; it is declared obsolete because its argument order is confusing.) - PyDict_GetItem() and PyDict_GetItemString() are changed so that they *never* raise an exception -- (even if the hash() fails, simply clear the error). This was necessary because there is lots of code out there that already assumes this. - Changes to PySequence_Tuple() and PySequence_List() to use the length of a sequence only as a hint -- if an IndexError happens earlier, take that. (Formerly, this was considered an error.) - Reformatted abstract.c to give it a more familiar "look" and fixed many error checking bugs. - Add NULL pointer checks to all calls of a C function through a type object and extensions (e.g. nb_add). - The code that initializes sys.path now calls Py_GetPythonHome() instead of getenv("PYTHONHOME"). This, together with the new API Py_SetPythonHome(), makes it easier for embedding applications to change the notion of Python's "home" directory (where the libraries etc. are sought). - Fixed a very old bug in the parsing of "O?" format specifiers. ====================================================================== ======================================== ==> Release 1.5.1 (October 31, 1998) <== ======================================== From 1.5 to 1.5.1 ================= General ------- - The documentation is now unbundled. It has also been extensively modified (mostly to implement a new and more uniform formatting style). We figure that most people will prefer to download one of the preformatted documentation sets (HTML, PostScript or PDF) and that only a minority have a need for the LaTeX or FrameMaker sources. Of course, the unbundled documentation sources still released -- just not in the same archive file, and perhaps not on the same date. - All bugs noted on the errors page (and many unnoted) are fixed. All new bugs take their places. - No longer a core dump when attempting to print (or repr(), or str()) a list or dictionary that contains an instance of itself; instead, the recursive entry is printed as [...] or {...}. See Py_ReprEnter() and Py_ReprLeave() below. Comparisons of such objects still go beserk, since this requires a different kind of fix; fortunately, this is a less common scenario in practice. Syntax change ------------- - The raise statement can now be used without arguments, to re-raise a previously set exception. This should be used after catching an exception with an except clause only, either in the except clause or later in the same function. Import and module handling -------------------------- - The implementation of import has changed to use a mutex (when threading is supported). This means that when two threads simultaneously import the same module, the import statements are serialized. Recursive imports are not affected. - Rewrote the finalization code almost completely, to be much more careful with the order in which modules are destroyed. Destructors will now generally be able to reference built-in names such as None without trouble. - Case-insensitive platforms such as Mac and Windows require the case of a module's filename to match the case of the module name as specified in the import statement (see below). - The code for figuring out the default path now distinguishes between files, modules, executable files, and directories. When expecting a module, we also look for the .pyc or .pyo file. Parser/tokenizer changes ------------------------ - The tokenizer can now warn you when your source code mixes tabs and spaces for indentation in a manner that depends on how much a tab is worth in spaces. Use "python -t" or "python -v" to enable this option. Use "python -tt" to turn the warnings into errors. (See also tabnanny.py and tabpolice.py below.) - Return unsigned characters from tok_nextc(), so '\377' isn't mistaken for an EOF character. - Fixed two pernicious bugs in the tokenizer that only affected AIX. One was actually a general bug that was triggered by AIX's smaller I/O buffer size. The other was a bug in the AIX optimizer's loop unrolling code; swapping two statements made the problem go away. Tools, demos and miscellaneous files ------------------------------------ - There's a new version of Misc/python-mode.el (the Emacs mode for Python) which is much smarter about guessing the indentation style used in a particular file. Lots of other cool features too! - There are two new tools in Tools/scripts: tabnanny.py and tabpolice.py, implementing two different ways of checking whether a file uses indentation in a way that is sensitive to the interpretation of a tab. The preferred module is tabnanny.py (by Tim Peters). - Some new demo programs: Demo/tkinter/guido/paint.py -- Dave Mitchell Demo/sockets/unixserver.py -- Piet van Oostrum - Much better freeze support. The freeze script can now freeze hierarchical module names (with a corresponding change to import.c), and has a few extra options (e.g. to suppress freezing specific modules). It also does much more on Windows NT. - Version 1.0 of the faq wizard is included (only very small changes since version 0.9.0). - New feature for the ftpmirror script: when removing local files (i.e., only when -r is used), do a recursive delete. Configuring and building Python ------------------------------- - Get rid of the check for -linet -- recent Sequent Dynix systems don't need this any more and apparently it screws up their configuration. - Some changes because gcc on SGI doesn't support '-all'. - Changed the build rules to use $(LIBRARY) instead of -L.. -lpython$(VERSION) since the latter trips up the SunOS 4.1.x linker (sigh). - Fix the bug where the '# dgux is broken' comment in the Makefile tripped over Make on some platforms. - Changes for AIX: install the python.exp file; properly use $(srcdir); the makexp_aix script now removes C++ entries of the form Class::method. - Deleted some Makefile targets only used by the (long obsolete) gMakefile hacks. Extension modules ----------------- - Performance and threading improvements to the socket and bsddb modules, by Christopher Lindblad of Infoseek. - Added operator.__not__ and operator.not_. - In the thread module, when a thread exits due to an unhandled exception, don't store the exception information in sys.last_*; it prevents proper calling of destructors of local variables. - Fixed a number of small bugs in the cPickle module. - Changed find() and rfind() in the strop module so that find("x","",2) returns -1, matching the implementation in string.py. - In the time module, be more careful with the result of ctime(), and test for HAVE_MKTIME before usinmg mktime(). - Doc strings contributed by Mitch Chapman to the termios, pwd, gdbm modules. - Added the LOG_SYSLOG constant to the syslog module, if defined. Standard library modules ------------------------ - All standard library modules have been converted to an indentation style using either only tabs or only spaces -- never a mixture -- if they weren't already consistent according to tabnanny. This means that the new -t option (see above) won't complain about standard library modules. - New standard library modules: threading -- GvR and the thread-sig Java style thread objects -- USE THIS!!! getpass -- Piers Lauder simple utilities to prompt for a password and to retrieve the current username imaplib -- Piers Lauder interface for the IMAP4 protocol poplib -- David Ascher, Piers Lauder interface for the POP3 protocol smtplib -- Dragon De Monsyne interface for the SMTP protocol - Some obsolete modules moved to a separate directory (Lib/lib-old) which is *not* in the default module search path: Para addpack codehack fmt lockfile newdir ni rand tb - New version of the PCRE code (Perl Compatible Regular Expressions -- the re module and the supporting pcre extension) by Andrew Kuchling. Incompatible new feature in re.sub(): the handling of escapes in the replacement string has changed. - Interface change in the copy module: a __deepcopy__ method is now called with the memo dictionary as an argument. - Feature change in the tokenize module: differentiate between NEWLINE token (an official newline) and NL token (a newline that the grammar ignores). - Several bugfixes to the urllib module. It is now truly thread-safe, and several bugs and a portability problem have been fixed. New features, all due to Sjoerd Mullender: When creating a temporary file, it gives it an appropriate suffix. Support the "data:" URL scheme. The open() method uses the tempcache. - New version of the xmllib module (this time with a test suite!) by Sjoerd Mullender. - Added debugging code to the telnetlib module, to be able to trace the actual traffic. - In the rfc822 module, added support for deleting a header (still no support for adding headers, though). Also fixed a bug where an illegal address would cause a crash in getrouteaddr(), fixed a sign reversal in mktime_tz(), and use the local timezone by default (the latter two due to Bill van Melle). - The normpath() function in the dospath and ntpath modules no longer does case normalization -- for that, use the separate function normcase() (which always existed); normcase() has been sped up and fixed (it was the cause of a crash in Mark Hammond's installer in certain locales). - New command supported by the ftplib module: rmd(); also fixed some minor bugs. - The profile module now uses a different timer function by default -- time.clock() is generally better than os.times(). This makes it work better on Windows NT, too. - The tempfile module now recovers when os.getcwd() raises an exception. - Fixed some bugs in the random module; gauss() was subtly wrong, and vonmisesvariate() should return a full circle. Courtesy Mike Miller, Lambert Meertens (gauss()), and Magnus Kessler (vonmisesvariate()). - Better default seed in the whrandom module, courtesy Andrew Kuchling. - Fix slow close() in shelve module. - The Unix mailbox class in the mailbox module is now more robust when a line begins with the string "From " but is definitely not the start of a new message. The pattern used can be changed by overriding a method or class variable. - Added a rmtree() function to the copy module. - Fixed several typos in the pickle module. Also fixed problems when unpickling in restricted execution environments. - Added docstrings and fixed a typo in the py_compile and compileall modules. At Mark Hammond's repeated request, py_compile now append a newline to the source if it needs one. Both modules support an extra parameter to specify the purported source filename (to be used in error messages). - Some performance tweaks by Jeremy Hylton to the gzip module. - Fixed a bug in the merge order of dictionaries in the ConfigParser module. Courtesy Barry Warsaw. - In the multifile module, support the optional second parameter to seek() when possible. - Several fixes to the gopherlib module by Lars Marius Garshol. Also, urlparse now correctly handles Gopher URLs with query strings. - Fixed a tiny bug in format_exception() in the traceback module. Also rewrite tb_lineno() to be compatible with JPython (and not disturb the current exception!); by Jim Hugunin. - The httplib module is more robust when servers send a short response -- courtesy Tim O'Malley. Tkinter and friends ------------------- - Various typos and bugs fixed. - New module Tkdnd implements a drag-and-drop protocol (within one application only). - The event_*() widget methods have been restructured slightly -- they no longer use the default root. - The interfaces for the bind*() and unbind() widget methods have been redesigned; the bind*() methods now return the name of the Tcl command created for the callback, and this can be passed as a optional argument to unbind() in order to delete the command (normally, such commands are automatically unbound when the widget is destroyed, but for some applications this isn't enough). - Variable objects now have trace methods to interface to Tcl's variable tracing facilities. - Image objects now have an optional keyword argument, 'master', to specify a widget (tree) to which they belong. The image_names() and image_types() calls are now also widget methods. - There's a new global call, Tkinter.NoDefaultRoot(), which disables all use of the default root by the Tkinter library. This is useful to debug applications that are in the process of being converted from relying on the default root to explicit specification of the root widget. - The 'exit' command is deleted from the Tcl interpreter, since it provided a loophole by which one could (accidentally) exit the Python interpreter without invoking any cleanup code. - Tcl_Finalize() is now registered as a Python low-level exit handle, so Tcl will be finalized when Python exits. The Python/C API ---------------- - New function PyThreadState_GetDict() returns a per-thread dictionary intended for storing thread-local global variables. - New functions Py_ReprEnter() and Py_ReprLeave() use the per-thread dictionary to allow recursive container types to detect recursion in their repr(), str() and print implementations. - New function PyObject_Not(x) calculates (not x) according to Python's standard rules (basically, it negates the outcome PyObject_IsTrue(x). - New function _PyModule_Clear(), which clears a module's dictionary carefully without removing the __builtins__ entry. This is implied when a module object is deallocated (this used to clear the dictionary completely). - New function PyImport_ExecCodeModuleEx(), which extends PyImport_ExecCodeModule() by adding an extra parameter to pass it the true file. - New functions Py_GetPythonHome() and Py_SetPythonHome(), intended to allow embedded applications to force a different value for PYTHONHOME. - New global flag Py_FrozenFlag is set when this is a "frozen" Python binary; it suppresses warnings about not being able to find the standard library directories. - New global flag Py_TabcheckFlag is incremented by the -t option and causes the tokenizer to issue warnings or errors about inconsistent mixing of tabs and spaces for indentation. Miscellaneous minor changes and bug fixes ----------------------------------------- - Improved the error message when an attribute of an attribute-less object is requested -- include the name of the attribute and the type of the object in the message. - Sped up int(), long(), float() a bit. - Fixed a bug in list.sort() that would occasionally dump core. - Fixed a bug in PyNumber_Power() that caused numeric arrays to fail when taken tothe real power. - Fixed a number of bugs in the file reading code, at least one of which could cause a core dump on NT, and one of which would occasionally cause file.read() to return less than the full contents of the file. - Performance hack by Vladimir Marangozov for stack frame creation. - Make sure setvbuf() isn't used unless HAVE_SETVBUF is defined. Windows 95/NT ------------- - The .lib files are now part of the distribution; they are collected in the subdirectory "libs" of the installation directory. - The extension modules (.pyd files) are now collected in a separate subdirectory of the installation directory named "DLLs". - The case of a module's filename must now match the case of the module name as specified in the import statement. This is an experimental feature -- if it turns out to break in too many situations, it will be removed (or disabled by default) in the future. It can be disabled on a per-case basis by setting the environment variable PYTHONCASEOK (to any value). ====================================================================== ===================================== ==> Release 1.5 (January 3, 1998) <== ===================================== From 1.5b2 to 1.5 ================= - Newly documentated module: BaseHTTPServer.py, thanks to Greg Stein. - Added doc strings to string.py, stropmodule.c, structmodule.c, thanks to Charles Waldman. - Many nits fixed in the manuals, thanks to Fred Drake and many others (especially Rob Hooft and Andrew Kuchling). The HTML version now uses HTML markup instead of inline GIF images for tables; only two images are left (for obsure bits of math). The index of the HTML version has also been much improved. Finally, it is once again possible to generate an Emacs info file from the library manual (but I don't commit to supporting this in future versions). - New module: telnetlib.py (a simple telnet client library). - New tool: Tools/versioncheck/, by Jack Jansen. - Ported zlibmodule.c and bsddbmodule.c to NT; The project file for MS DevStudio 5.0 now includes new subprojects to build the zlib and bsddb extension modules. - Many small changes again to Tkinter.py -- mostly bugfixes and adding missing routines. Thanks to Greg McFarlane for reporting a bunch of problems and proofreading my fixes. - The re module and its documentation are up to date with the latest version released to the string-sig (Dec. 22). - Stop test_grp.py from failing when the /etc/group file is empty (yes, this happens!). - Fix bug in integer conversion (mystrtoul.c) that caused 4294967296==0 to be true! - The VC++ 4.2 project file should be complete again. - In tempfile.py, use a better template on NT, and add a new optional argument "suffix" with default "" to specify a specific extension for the temporary filename (needed sometimes on NT but perhaps also handy elsewhere). - Fixed some bugs in the FAQ wizard, and converted it to use re instead of regex. - Fixed a mysteriously undetected error in dlmodule.c (it was using a totally bogus routine name to raise an exception). - Fixed bug in import.c which wasn't using the new "dos-8x3" name yet. - Hopefully harmless changes to the build process to support shared libraries on DG/UX. This adds a target to create libpython$(VERSION).so; however this target is *only* for DG/UX. - Fixed a bug in the new format string error checking in getargs.c. - A simple fix for infinite recursion when printing __builtins__: reset '_' to None before printing and set it to the printed variable *after* printing (and only when printing is successful). - Fixed lib-tk/SimpleDialog.py to keep the dialog visible even if the parent window is not (Skip Montanaro). - Fixed the two most annoying problems with ftp URLs in urllib.urlopen(); an empty file now correctly raises an error, and it is no longer required to explicitly close the returned "file" object before opening another ftp URL to the same host and directory. ====================================================================== From 1.5b1 to 1.5b2 =================== - Fixed a bug in cPickle.c that caused it to crash right away because the version string had a different format. - Changes in pickle.py and cPickle.c: when unpickling an instance of a class that doesn't define the __getinitargs__() method, the __init__() constructor is no longer called. This makes a much larger group of classes picklable by default, but may occasionally change semantics. To force calling __init__() on unpickling, define a __getinitargs__() method. Other changes too, in particular cPickle now handles classes defined in packages correctly. The same change applies to copying instances with copy.py. The cPickle.c changes and some pickle.py changes are courtesy Jim Fulton. - Locale support in he "re" (Perl regular expressions) module. Use the flag re.L (or re.LOCALE) to enable locale-specific matching rules for \w and \b. The in-line syntax for this flag is (?L). - The built-in function isinstance(x, y) now also succeeds when y is a type object and type(x) is y. - repr() and str() of class and instance objects now reflect the package/module in which the class is defined. - Module "ni" has been removed. (If you really need it, it's been renamed to "ni1". Let me know if this causes any problems for you. Package authors are encouraged to write __init__.py files that support both ni and 1.5 package support, so the same version can be used with Python 1.4 as well as 1.5.) - The thread module is now automatically included when threads are configured. (You must remove it from your existing Setup file, since it is now in its own Setup.thread file.) - New command line option "-x" to skip the first line of the script; handy to make executable scripts on non-Unix platforms. - In importdl.c, add the RTLD_GLOBAL to the dlopen() flags. I haven't checked how this affects things, but it should make symbols in one shared library available to the next one. - The Windows installer now installs in the "Program Files" folder on the proper volume by default. - The Windows configuration adds a new main program, "pythonw", and registers a new extension, ".pyw" that invokes this. This is a pstandard Python interpreter that does not pop up a console window; handy for pure Tkinter applications. All output to the original stdout and stderr is lost; reading from the original stdin yields EOF. Also, both python.exe and pythonw.exe now have a pretty icon (a green snake in a box, courtesy Mark Hammond). - Lots of improvements to emacs-mode.el again. See Barry's web page: http://www.python.org/ftp/emacs/pmdetails.html. - Lots of improvements and additions to the library reference manual; many by Fred Drake. - Doc strings for the following modules: rfc822.py, posixpath.py, ntpath.py, httplib.py. Thanks to Mitch Chapman and Charles Waldman. - Some more regression testing. - An optional 4th (maxsplit) argument to strop.replace(). - Fixed handling of maxsplit in string.splitfields(). - Tweaked os.environ so it can be pickled and copied. - The portability problems caused by indented preprocessor commands and C++ style comments should be gone now. - In random.py, added Pareto and Weibull distributions. - The crypt module is now disabled in Modules/Setup.in by default; it is rarely needed and causes errors on some systems where users often don't know how to deal with those. - Some improvements to the _tkinter build line suggested by Case Roole. - A full suite of platform specific files for NetBSD 1.x, submitted by Anders Andersen. - New Solaris specific header STROPTS.py. - Moved a confusing occurrence of *shared* from the comments in Modules/Setup.in (people would enable this one instead of the real one, and get disappointing results). - Changed the default mode for directories to be group-writable when the installation process creates them. - Check for pthread support in "-l_r" for FreeBSD/NetBSD, and support shared libraries for both. - Support FreeBSD and NetBSD in posixfile.py. - Support for the "event" command, new in Tk 4.2. By Case Roole. - Add Tix_SafeInit() support to tkappinit.c. - Various bugs fixed in "re.py" and "pcre.c". - Fixed a bug (broken use of the syntax table) in the old "regexpr.c". - In frozenmain.c, stdin is made unbuffered too when PYTHONUNBUFFERED is set. - Provide default blocksize for retrbinary in ftplib.py (Skip Montanaro). - In NT, pick the username up from different places in user.py (Jeff Bauer). - Patch to urlparse.urljoin() for ".." and "..#1", Marc Lemburg. - Many small improvements to Jeff Rush' OS/2 support. - ospath.py is gone; it's been obsolete for so many years now... - The reference manual is now set up to prepare better HTML (still using webmaker, alas). - Add special handling to /Tools/freeze for Python modules that are imported implicitly by the Python runtime: 'site' and 'exceptions'. - Tools/faqwiz 0.8.3 -- add an option to suppress URL processing inside <PRE>, by "Scott". - Added ConfigParser.py, a generic parser for sectioned configuration files. - In _localemodule.c, LC_MESSAGES is not always defined; put it between #ifdefs. - Typo in resource.c: RUSAGE_CHILDERN -> RUSAGE_CHILDREN. - Demo/scripts/newslist.py: Fix the way the version number is gotten out of the RCS revision. - PyArg_Parse[Tuple] now explicitly check for bad characters at the end of the format string. - Revamped PC/example_nt to support VC++ 5.x. - <listobject>.sort() now uses a modified quicksort by Raymund Galvin, after studying the GNU libg++ quicksort. This should be much faster if there are lots of duplicates, and otherwise at least as good. - Added "uue" as an alias for "uuencode" to mimetools.py. (Hm, the uudecode bug where it complaints about trailing garbage is still there :-( ). - pickle.py requires integers in text mode to be in decimal notation (it used to accept octal and hex, even though it would only generate decimal numbers). - In string.atof(), don't fail when the "re" module is unavailable. Plug the ensueing security leak by supplying an empty __builtins__ directory to eval(). - A bunch of small fixes and improvements to Tkinter.py. - Fixed a buffer overrun in PC/getpathp.c. ====================================================================== From 1.5a4 to 1.5b1 =================== - The Windows NT/95 installer now includes full HTML of all manuals. It also has a checkbox that lets you decide whether to install the interpreter and library. The WISE installer script for the installer is included in the source tree as PC/python15.wse, and so are the icons used for Python files. The config.c file for the Windows build is now complete with the pcre module. - sys.ps1 and sys.ps2 can now arbitrary objects; their str() is evaluated for the prompt. - The reference manual is brought up to date (more or less -- it still needs work, e.g. in the area of package import). - The icons used by latex2html are now included in the Doc subdirectory (mostly so that tarring up the HTML files can be fully automated). A simple index.html is also added to Doc (it only works after you have successfully run latex2html). - For all you would-be proselytizers out there: a new version of Misc/BLURB describes Python more concisely, and Misc/comparisons compares Python to several other languages. Misc/BLURB.WINDOWS contains a blurb specifically aimed at Windows programmers (by Mark Hammond). - A new version of the Python mode for Emacs is included as Misc/python-mode.el. There are too many new features to list here. See http://www.python.org/ftp/emacs/pmdetails.html for more info. - New module fileinput makes iterating over the lines of a list of files easier. (This still needs some more thinking to make it more extensible.) - There's full OS/2 support, courtesy Jeff Rush. To build the OS/2 version, see PC/readme.txt and PC/os2vacpp. This is for IBM's Visual Age C++ compiler. I expect that Jeff will also provide a binary release for this platform. - On Linux, the configure script now uses '-Xlinker -export-dynamic' instead of '-rdynamic' to link the main program so that it exports its symbols to shared libraries it loads dynamically. I hope this doesn't break on older Linux versions; it is needed for mklinux and appears to work on Linux 2.0.30. - Some Tkinter resstructuring: the geometry methods that apply to a master are now properly usable on toplevel master widgets. There's a new (internal) widget class, BaseWidget. New, longer "official" names for the geometry manager methods have been added, e.g. "grid_columnconfigure()" instead of "columnconfigure()". The old shorter names still work, and where there's ambiguity, pack wins over place wins over grid. Also, the bind_class method now returns its value. - New, RFC-822 conformant parsing of email addresses and address lists in the rfc822 module, courtesy Ben Escoto. - New, revamped tkappinit.c with support for popular packages (PIL, TIX, BLT, TOGL). For the last three, you need to execute the Tcl command "load {} Tix" (or Blt, or Togl) to gain access to them. The Modules/Setup line for the _tkinter module has been rewritten using the cool line-breaking feature of most Bourne shells. - New socket method connect_ex() returns the error code from connect() instead of raising an exception on errors; this makes the logic required for asynchronous connects simpler and more efficient. - New "locale" module with (still experimental) interface to the standard C library locale interface, courtesy Martin von Loewis. 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 builtin names are already deleted by the time __del__ is called. The solution (a hack, but it works) is to set some instance variables to 0 instead of None. - The table of built-in module initializers is replaced by a pointer variable. This makes it possible to switch to a different table at run time, e.g. when a collection of modules is loaded from a shared library. (No example code of how to do this is given, but it is possible.) The table is still there of course, its name prefixed with an underscore and used to initialize the pointer. - The warning about a thread still having a frame now only happens in verbose mode. - Change the signal finialization so that it also resets the signal handlers. After this has been called, our signal handlers are no longer active! - New version of tokenize.py (by Ka-Ping Yee) recognizes raw string literals. There's now also a test fort this module. - The copy module now also uses __dict__.update(state) instead of going through individual attribute assignments, for class instances without a __setstate__ method. - New module reconvert translates old-style (regex module) regular expressions to new-style (re module, Perl-style) regular expressions. - Most modules that used to use the regex module now use the re module. The grep module has a new pgrep() function which uses Perl-style regular expressions. - The (very old, backwards compatibility) regexp.py module has been deleted. - Restricted execution (rexec): added the pcre module (support for the re module) to the list of trusted extension modules. - New version of Jim Fulton's CObject object type, adds PyCObject_FromVoidPtrAndDesc() and PyCObject_GetDesc() APIs. - Some patches to Lee Busby's fpectl mods that accidentally didn't make it into 1.5a4. - In the string module, add an optional 4th argument to count(), matching find() etc. - Patch for the nntplib module by Charles Waldman to add optional user and password arguments to NNTP.__init__(), for nntp servers that need them. - The str() function for class objects now returns "modulename.classname" instead of returning the same as repr(). - The parsing of \xXX escapes no longer relies on sscanf(). - The "sharedmodules" subdirectory of the installation is renamed to "lib-dynload". (You may have to edit your Modules/Setup file to fix this in an existing installation!) - Fixed Don Beaudry's mess-up with the OPT test in the configure script. Certain SGI platforms will still issue a warning for each compile; there's not much I can do about this since the compiler's exit status doesn't indicate that I was using an obsolete option. - Fixed Barry's mess-up with {}.get(), and added test cases for it. - Shared libraries didn't quite work under AIX because of the change in status of the GNU readline interface. Fix due to by Vladimir Marangozov. ====================================================================== From 1.5a3 to 1.5a4 =================== - faqwiz.py: version 0.8; Recognize https:// as URL; <html>...</html> feature; better install instructions; removed faqmain.py (which was an older version). - nntplib.py: Fixed some bugs reported by Lars Wirzenius (to Debian) about the treatment of lines starting with '.'. Added a minimal test function. - struct module: ignore most whitespace in format strings. - urllib.py: close the socket and temp file in URLopener.retrieve() so that multiple retrievals using the same connection work. - All standard exceptions are now classes by default; use -X to make them strings (for backward compatibility only). - There's a new standard exception hierarchy, defined in the standard library module exceptions.py (which you never need to import explicitly). See http://grail.cnri.reston.va.us/python/essays/stdexceptions.html for more info. - Three new C API functions: - int PyErr_GivenExceptionMatches(obj1, obj2) Returns 1 if obj1 and obj2 are the same object, or if obj1 is an instance of type obj2, or of a class derived from obj2 - int PyErr_ExceptionMatches(obj) Higher level wrapper around PyErr_GivenExceptionMatches() which uses PyErr_Occurred() as obj1. This will be the more commonly called function. - void PyErr_NormalizeException(typeptr, valptr, tbptr) Normalizes exceptions, and places the normalized values in the arguments. If type is not a class, this does nothing. If type is a class, then it makes sure that value is an instance of the class by: 1. if instance is of the type, or a class derived from type, it does nothing. 2. otherwise it instantiates the class, using the value as an argument. If value is None, it uses an empty arg tuple, and if the value is a tuple, it uses just that. - Another new C API function: PyErr_NewException() creates a new exception class derived from Exception; when -X is given, it creates a new string exception. - core interpreter: remove the distinction between tuple and list unpacking; allow an arbitrary sequence on the right hand side of any unpack instruction. (UNPACK_LIST and UNPACK_TUPLE now do the same thing, which should really be called UNPACK_SEQUENCE.) - classes: Allow assignments to an instance's __dict__ or __class__, so you can change ivars (including shared ivars -- shock horror) and change classes dynamically. Also make the check on read-only attributes of classes less draconic -- only the specials names __dict__, __bases__, __name__ and __{get,set,del}attr__ can't be assigned. - Two new built-in functions: issubclass() and isinstance(). Both take classes as their second arguments. The former takes a class as the first argument and returns true iff first is second, or is a subclass of second. The latter takes any object as the first argument and returns true iff first is an instance of the second, or any subclass of second. - configure: Added configuration tests for presence of alarm(), pause(), and getpwent(). - Doc/Makefile: changed latex2html targets. - classes: Reverse the search order for the Don Beaudry hook so that the first class with an applicable hook wins. Makes more sense. - Changed the checks made in Py_Initialize() and Py_Finalize(). It is now legal to call these more than once. The first call to Py_Initialize() initializes, the first call to Py_Finalize() finalizes. There's also a new API, Py_IsInitalized() which checks whether we are already initialized (in case you want to leave things as they were). - Completely disable the declarations for malloc(), realloc() and free(). Any 90's C compiler has these in header files, and the tests to decide whether to suppress the declarations kept failing on some platforms. - *Before* (instead of after) signalmodule.o is added, remove both intrcheck.o and sigcheck.o. This should get rid of warnings in ar or ld on various systems. - Added reop to PC/config.c - configure: Decided to use -Aa -D_HPUX_SOURCE on HP-UX platforms. Removed outdated HP-UX comments from README. Added Cray T3E comments. - Various renames of statically defined functions that had name conflicts on some systems, e.g. strndup (GNU libc), join (Cray), roundup (sys/types.h). - urllib.py: Interpret three slashes in file: URL as local file (for Netscape on Windows/Mac). - copy.py: Make sure the objects returned by __getinitargs__() are kept alive (in the memo) to avoid a certain kind of nasty crash. (Not easily reproducable because it requires a later call to __getinitargs__() to return a tuple that happens to be allocated at the same address.) - Added definition of AR to toplevel Makefile. Renamed @buildno temp file to buildno1. - Moved Include/assert.h to Parser/assert.h, which seems to be the only place where it's needed. - Tweaked the dictionary lookup code again for some more speed (Vladimir Marangozov). - NT build: Changed the way python15.lib is included in the other projects. Per Mark Hammond's suggestion, add it to the extra libs in Settings instead of to the project's source files. - regrtest.py: Change default verbosity so that there are only three levels left: -q, default and -v. In default mode, the name of each test is now printed. -v is the same as the old -vv. -q is more quiet than the old default mode. - Removed the old FAQ from the distribution. You now have to get it from the web! - Removed the PC/make_nt.in file from the distribution; it is no longer needed. - Changed the build sequence so that shared modules are built last. This fixes things for AIX and doesn't hurt elsewhere. - Improved test for GNU MP v1 in mpzmodule.c - fileobject.c: ftell() on Linux discards all buffered data; changed read() code to use lseek() instead to get the same effect - configure.in, configure, importdl.c: NeXT sharedlib fixes - tupleobject.c: PyTuple_SetItem asserts refcnt==1 - resource.c: Different strategy regarding whether to declare getrusage() and getpagesize() -- #ifdef doesn't work, Linux has conflicting decls in its headers. Choice: only declare the return type, not the argument prototype, and not on Linux. - importdl.c, configure*: set sharedlib extensions properly for NeXT - configure*, Makefile.in, Modules/Makefile.pre.in: AIX shared libraries fixed; moved addition of PURIFY to LINKCC to configure - reopmodule.c, regexmodule.c, regexpr.c, zlibmodule.c: needed casts added to shup up various compilers. - _tkinter.c: removed buggy mac #ifndef - Doc: various Mac documentation changes, added docs for 'ic' module - PC/make_nt.in: deleted - test_time.py, test_strftime.py: tweaks to catch %Z (which may return "") - test_rotor.py: print b -> print `b` - Tkinter.py: (tagOrId) -> (tagOrId,) - Tkinter.py: the Tk class now also has a configure() method and friends (they have been moved to the Misc class to accomplish this). - dict.get(key[, default]) returns dict[key] if it exists, or default if it doesn't. The default defaults to None. This is quicker for some applications than using either has_key() or try:...except KeyError:.... - Tools/webchecker/: some small changes to webchecker.py; added websucker.py (a simple web site mirroring script). - Dictionary objects now have a get() method (also in UserDict.py). dict.get(key, default) returns dict[key] if it exists and default otherwise; default defaults to None. - Tools/scripts/logmerge.py: print the author, too. - Changes to import: support for "import a.b.c" is now built in. See http://grail.cnri.reston.va.us/python/essays/packages.html for more info. Most important deviations from "ni.py": __init__.py is executed in the package's namespace instead of as a submodule; and there's no support for "__" or "__domain__". Note that "ni.py" is not changed to match this -- it is simply declared obsolete (while at the same time, it is documented...:-( ). Unfortunately, "ihooks.py" has not been upgraded (but see "knee.py" for an example implementation of hierarchical module import written in Python). - More changes to import: the site.py module is now imported by default when Python is initialized; use -S to disable it. The site.py module extends the path with several more directories: site-packages inside the lib/python1.5/ directory, site-python in the lib/ directory, and pathnames mentioned in *.pth files found in either of those directories. See http://grail.cnri.reston.va.us/python/essays/packages.html for more info. - Changes to standard library subdirectory names: those subdirectories that are not packages have been renamed with a hypen in their name, e.g. lib-tk, lib-stdwin, plat-win, plat-linux2, plat-sunos5, dos-8x3. The test suite is now a package -- to run a test, you must now use "import test.test_foo". - A completely new re.py module is provided (thanks to Andrew Kuchling, Tim Peters and Jeffrey Ollie) which uses Philip Hazel's "pcre" re compiler and engine. For a while, the "old" re.py (which was new in 1.5a3!) will be kept around as re1.py. The "old" regex module and underlying parser and engine are still present -- while regex is now officially obsolete, it will probably take several major release cycles before it can be removed. - The posix module now has a strerror() function which translates an error code to a string. - The emacs.py module (which was long obsolete) has been removed. - The universal makefile Misc/Makefile.pre.in now features an "install" target. By default, installed shared libraries go into $exec_prefix/lib/python$VERSION/site-packages/. - The install-sh script is installed with the other configuration specific files (in the config/ subdirectory). - It turns out whatsound.py and sndhdr.py were identical modules. Since there's also an imghdr.py file, I propose to make sndhdr.py the official one. For compatibility, whatsound.py imports * from sndhdr.py. - Class objects have a new attribute, __module__, giving the name of the module in which they were declared. This is useful for pickle and for printing the full name of a class exception. - Many extension modules no longer issue a fatal error when their initialization fails; the importing code now checks whether an error occurred during module initialization, and correctly propagates the exception to the import statement. - Most extension modules now raise class-based exceptions (except when -X is used). - Subtle changes to PyEval_{Save,Restore}Thread(): always swap the thread state -- just don't manipulate the lock if it isn't there. - Fixed a bug in Python/getopt.c that made it do the wrong thing when an option was a single '-'. Thanks to Andrew Kuchling. - New module mimetypes.py will guess a MIME type from a filename's extension. - Windows: the DLL version is now settable via a resource rather than being hardcoded. This can be used for "branding" a binary Python distribution. - urllib.py is now threadsafe -- it now uses re instead of regex, and sys.exc_info() instead of sys.exc_{type,value}. - Many other library modules that used to use sys.exc_{type,value,traceback} are now more thread-safe by virtue of using sys.exc_info(). - The functions in popen2 have an optional buffer size parameter. Also, the command argument can now be either a string (passed to the shell) or a list of arguments (passed directly to execv). - Alas, the thread support for _tkinter released with 1.5a3 didn't work. It's been rewritten. The bad news is that it now requires a modified version of a file in the standard Tcl distribution, which you must compile with a -I option pointing to the standard Tcl source tree. For this reason, the thread support is disabled by default. - The errno extension module adds two tables: errorcode maps errno numbers to errno names (e.g. EINTR), and errorstr maps them to message strings. (The latter is redundant because the new call posix.strerror() now does the same, but alla...) (Marc-Andre Lemburg) - The readline extension module now provides some interfaces to internal readline routines that make it possible to write a completer in Python. An example completer, rlcompleter.py, is provided. When completing a simple identifier, it completes keywords, built-ins and globals in __main__; when completing NAME.NAME..., it evaluates (!) the expression up to the last dot and completes its attributes. It's very cool to do "import string" type "string.", hit the completion key (twice), and see the list of names defined by the string module! Tip: to use the tab key as the completion key, call readline.parse_and_bind("tab: complete") - The traceback.py module has a new function tb_lineno() by Marc-Andre Lemburg which extracts the line number from the linenumber table in the code object. Apparently the traceback object doesn't contains the right linenumber when -O is used. Rather than guessing whether -O is on or off, the module itself uses tb_lineno() unconditionally. - Fixed Demo/tkinter/matt/canvas-moving-or-creating.py: change bind() to tag_bind() so it works again. - The pystone script is now a standard library module. Example use: "import test.pystone; test.pystone.main()". - The import of the readline module in interactive mode is now also attempted when -i is specified. (Yes, I know, giving in to Marc-Andre Lemburg, who asked for this. :-) - rfc822.py: Entirely rewritten parseaddr() function by Sjoerd Mullender, to be closer to the standard. This fixes the getaddr() method. Unfortunately, getaddrlist() is as broken as ever, since it splits on commas without regard for RFC 822 quoting conventions. - pprint.py: correctly emit trailing "," in singleton tuples. - _tkinter.c: export names for its type objects, TkappType and TkttType. - pickle.py: use __module__ when defined; fix a particularly hard to reproduce bug that confuses the memo when temporary objects are returned by custom pickling interfaces; and a semantic change: when unpickling the instance variables of an instance, use inst.__dict__.update(value) instead of a for loop with setattr() over the value.keys(). This is more consistent (the pickling doesn't use getattr() either but pickles inst.__dict__) and avoids problems with instances that have a __setattr__ hook. But it *is* a semantic change (because the setattr hook is no longer used). So beware! - config.h is now installed (at last) in $exec_prefix/include/python1.5/. For most sites, this means that it is actually in $prefix/include/python1.5/, with all the other Python include files, since $prefix and $exec_prefix are the same by default. - The imp module now supports parts of the functionality to implement import of hierarchical module names. It now supports find_module() and load_module() for all types of modules. Docstrings have been added for those functions in the built-in imp module that are still relevant (some old interfaces are obsolete). For a sample implementation of hierarchical module import in Python, see the new library module knee.py. - The % operator on string objects now allows arbitrary nested parens in a %(...)X style format. (Brad Howes) - Reverse the order in which Setup and Setup.local are passed to the makesetup script. This allows variable definitions in Setup.local to override definitions in Setup. (But you'll still have to edit Setup if you want to disable modules that are enabled by default, or if such modules need non-standard options.) - Added PyImport_ImportModuleEx(name, globals, locals, fromlist); this is like PyImport_ImporModule(name) but receives the globals and locals dict and the fromlist arguments as well. (The name is a char*; the others are PyObject*s). - The 'p' format in the struct extension module alloded to above is new in 1.5a4. - The types.py module now uses try-except in a few places to make it more likely that it can be imported in restricted mode. Some type names are undefined in that case, e.g. CodeType (inaccessible), FileType (not always accessible), and TracebackType and FrameType (inaccessible). - In urllib.py: added separate administration of temporary files created y URLopener.retrieve() so cleanup() can properly remove them. The old code removed everything in tempcache which was a bad idea if the user had passed a non-temp file into it. Also, in basejoin(), interpret relative paths starting in "../". This is necessary if the server uses symbolic links. - The Windows build procedure and project files are now based on Microsoft Visual C++ 5.x. The build now takes place in the PCbuild directory. It is much more robust, and properly builds separate Debug and Release versions. (The installer will be added shortly.) - Added casts and changed some return types in regexpr.c to avoid compiler warnings or errors on some platforms. - The AIX build tools for shared libraries now supports VPATH. (Donn Cave) - By default, disable the "portable" multimedia modules audioop, imageop, and rgbimg, since they don't work on 64-bit platforms. - Fixed a nasty bug in cStringIO.c when code was actually using the close() method (the destructors would try to free certain fields a second time). - For those who think they need it, there's a "user.py" module. This is *not* imported by default, but can be imported to run user-specific setup commands, ~/.pythonrc.py. - Various speedups suggested by Fredrik Lundh, Marc-Andre Lemburg, Vladimir Marangozov, and others. - Added os.altsep; this is '/' on DOS/Windows, and None on systems with a sane filename syntax. - os.py: Write out the dynamic OS choice, to avoid exec statements. Adding support for a new OS is now a bit more work, but I bet that 'dos' or 'nt' will cover most situations... - The obsolete exception AccessError is now really gone. - Tools/faqwiz/: New installation instructions show how to maintain multiple FAQs. Removed bootstrap script from end of faqwiz.py module. Added instructions to bootstrap script, too. Version bumped to 0.8.1. Added <html>...</html> feature suggested by Skip Montanaro. Added leading text for Roulette, default to 'Hit Reload ...'. Fix typo in default SRCDIR. - Documentation for the relatively new modules "keyword" and "symbol" has been added (to the end of the section on the parser extension module). - In module bisect.py, but functions have two optional argument 'lo' and 'hi' which allow you to specify a subsequence of the array to operate on. - In ftplib.py, changed most methods to return their status (even when it is always "200 OK") rather than swallowing it. - main() now calls setlocale(LC_ALL, ""), if setlocale() and <locale.h> are defined. - Changes to configure.in, the configure script, and both Makefile.pre.in files, to support SGI's SGI_ABI platform selection environment variable. ====================================================================== From 1.4 to 1.5a3 ================= Security -------- - If you are using the setuid script C wrapper (Misc/setuid-prog.c), please use the new version. The old version has a huge security leak. Miscellaneous ------------- - Because of various (small) incompatible changes in the Python bytecode interpreter, the magic number for .pyc files has changed again. - The default module search path is now much saner. Both on Unix and Windows, it is essentially derived from the path to the executable (which can be overridden by setting the environment variable $PYTHONHOME). The value of $PYTHONPATH on Windows is now inserted in front of the default path, like in Unix (instead of overriding the default path). On Windows, the directory containing the executable is added to the end of the path. - A new version of python-mode.el for Emacs has been included. Also, a new file ccpy-style.el has been added to configure Emacs cc-mode for the preferred style in Python C sources. - On Unix, when using sys.argv[0] to insert the script directory in front of sys.path, expand a symbolic link. You can now install a program in a private directory and have a symbolic link to it in a public bin directory, and it will put the private directory in the module search path. Note that the symlink is expanded in sys.path[0] but not in sys.argv[0], so you can still tell the name by which you were invoked. - It is now recommended to use ``#!/usr/bin/env python'' instead of ``#!/usr/local/bin/python'' at the start of executable scripts, except for CGI scripts. It has been determined that the use of /usr/bin/env is more portable than that of /usr/local/bin/python -- scripts almost never have to be edited when the Python interpreter lives in a non-standard place. Note that this doesn't work for CGI scripts since the python executable often doesn't live in the HTTP server's default search path. - The silly -s command line option and the corresponding PYTHONSUPPRESS environment variable (and the Py_SuppressPrint global flag in the Python/C API) are gone. - Most problems on 64-bit platforms should now be fixed. Andrew Kuchling helped. Some uncommon extension modules are still not clean (image and audio ops?). - Fixed a bug where multiple anonymous tuple arguments would be mixed up when using the debugger or profiler (reported by Just van Rossum). The simplest example is ``def f((a,b),(c,d)): print a,b,c,d''; this would print the wrong value when run under the debugger or profiler. - The hacks that the dictionary implementation used to speed up repeated lookups of the same C string were removed; these were a source of subtle problems and don't seem to serve much of a purpose any longer. - All traces of support for the long dead access statement have been removed from the sources. - Plugged the two-byte memory leak in the tokenizer when reading an interactive EOF. - There's a -O option to the interpreter that removes SET_LINENO instructions and assert statements (see below); it uses and produces .pyo files instead of .pyc files. The speedup is only a few percent in most cases. The line numbers are still available in the .pyo file, as a separate table (which is also available in .pyc files). However, the removal of the SET_LINENO instructions means that the debugger (pdb) can't set breakpoints on lines in -O mode. The traceback module contains a function to extract a line number from the code object referenced in a traceback object. In the future it should be possible to write external bytecode optimizers that create better optimized .pyo files, and there should be more control over optimization; consider the -O option a "teaser". Without -O, the assert statement actually generates code that first checks __debug__; if this variable is false, the assertion is not checked. __debug__ is a built-in variable whose value is initialized to track the -O flag (it's true iff -O is not specified). With -O, no code is generated for assert statements, nor for code of the form ``if __debug__: <something>''. Sorry, no further constant folding happens. Performance ----------- - It's much faster (almost twice for pystone.py -- see Tools/scripts). See the entry on string interning below. - Some speedup by using separate free lists for method objects (both the C and the Python variety) and for floating point numbers. - Big speedup by allocating frame objects with a single malloc() call. The Python/C API for frames is changed (you shouldn't be using this anyway). - Significant speedup by inlining some common opcodes for common operand types (e.g. i+i, i-i, and list[i]). Fredrik Lundh. - Small speedup by reordering the method tables of some common objects (e.g. list.append is now first). - Big optimization to the read() method of file objects. A read() without arguments now attempts to use fstat to allocate a buffer of the right size; for pipes and sockets, it will fall back to doubling the buffer size. While that the improvement is real on all systems, it is most dramatic on Windows. Documentation ------------- - Many new pieces of library documentation were contributed, mostly by Andrew Kuchling. Even cmath is now documented! There's also a chapter of the library manual, "libundoc.tex", which provides a listing of all undocumented modules, plus their status (e.g. internal, obsolete, or in need of documentation). Also contributions by Sue Williams, Skip Montanaro, and some module authors who succumbed to pressure to document their own contributed modules :-). Note that printing the documentation now kills fewer trees -- the margins have been reduced. - I have started documenting the Python/C API. Unfortunately this project hasn't been completed yet. It will be complete before the final release of Python 1.5, though. At the moment, it's better to read the LaTeX source than to attempt to run it through LaTeX and print the resulting dvi file. - The posix module (and hence os.py) now has doc strings! Thanks to Neil Schemenauer. I received a few other contributions of doc strings. In most other places, doc strings are still wishful thinking... Language changes ---------------- - Private variables with leading double underscore are now a permanent feature of the language. (These were experimental in release 1.4. I have favorable experience using them; I can't label them "experimental" forever.) - There's new string literal syntax for "raw strings". Prefixing a string literal with the letter r (or R) disables all escape processing in the string; for example, r'\n' is a two-character string consisting of a backslash followed by the letter n. This combines with all forms of string quotes; it is actually useful for triple quoted doc strings which might contain references to \n or \t. An embedded quote prefixed with a backslash does not terminate the string, but the backslash is still included in the string; for example, r'\'' is a two-character string consisting of a backslash and a quote. (Raw strings are also affectionately known as Robin strings, after their inventor, Robin Friedrich.) - There's a simple assert statement, and a new exception AssertionError. For example, ``assert foo > 0'' is equivalent to ``if not foo > 0: raise AssertionError''. Sorry, the text of the asserted condition is not available; it would be too complicated to generate code for this (since the code is generated from a parse tree). However, the text is displayed as part of the traceback! - The raise statement has a new feature: when using "raise SomeClass, somevalue" where somevalue is not an instance of SomeClass, it instantiates SomeClass(somevalue). In 1.5a4, if somevalue is an instance of a *derived* class of SomeClass, the exception class raised is set to somevalue.__class__, and SomeClass is ignored after that. - Duplicate keyword arguments are now detected at compile time; f(a=1,a=2) is now a syntax error. Changes to builtin 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 '"'. 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 linraries 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 the Makefiles from the configure script. - Shared libraries are now installed as programs (i.e. with executable permission). This is required on HP-UX and won't hurt on other systems. - The objc.c module is no longer part of the distribution. Objective-C support may become available as contributed software on the ftp site. - The sybase module is no longer part of the distribution. A much improved sybase module is available as contributed software from the ftp site. - _tkinter is now compatible with Tcl 7.5 / Tk 4.1 patch1 on Windows and Mac (don't use unpatched Tcl/Tk!). The default line in the Setup.in file now links with Tcl 7.5 / Tk 4.1 rather than 7.4/4.0. - In Setup, you can now write "*shared*" instead of "*noconfig*", and you can use *.so and *.sl as shared libraries. - Some more fidgeting for AIX shared libraries. - The mpz module is now compatible with GMP 2.x. (Not tested by me.) (Note -- a complete replacement by Niels Mo"ller, called gpmodule, is available from the contrib directory on the ftp site.) - A warning is written to sys.stderr when a __del__ method raises an exception (formerly, such exceptions were completely ignored). - The configure script now defines HAVE_OLD_CPP if the C preprocessor is incapable of ANSI style token concatenation and stringification. - All source files (except a few platform specific modules) are once again compatible with K&R C compilers as well as ANSI compilers. In particular, ANSI-isms have been removed or made conditional in complexobject.c, getargs.c and operator.c. - The abstract object API has three new functions, PyObject_DelItem, PySequence_DelItem, and PySequence_DelSlice. - The operator module has new functions delitem and delslice, and the functions "or" and "and" are renamed to "or_" and "and_" (since "or" and "and" are reserved words). ("__or__" and "__and__" are unchanged.) - The environment module is no longer supported; putenv() is now a function in posixmodule (also under NT). - Error in filter(<function>, "") has been fixed. - Unrecognized keyword arguments raise TypeError, not KeyError. - Better portability, fewer bugs and memory leaks, fewer compiler warnings, some more documentation. - Bug in float power boundary case (0.0 to the negative integer power) fixed. - The test of negative number to the float power has been moved from the built-in pow() functin to floatobject.c (so complex numbers can yield the correct result). - The bug introduced in beta2 where shared libraries loaded (using dlopen()) from the current directory would fail, has been fixed. - Modules imported as shared libraries now also have a __file__ attribute, giving the filename from which they were loaded. The only modules without a __file__ attribute now are built-in modules. - On the Mac, dynamically loaded modules can end in either ".slb" or ".<platform>.slb" where <platform> is either "CFM68K" or "ppc". The ".slb" extension should only be used for "fat" binaries. - C API addition: marshal.c now supports PyMarshal_WriteObjectToString(object). - C API addition: getargs.c now supports PyArg_ParseTupleAndKeywords(args, kwdict, format, kwnames, ...) to parse keyword arguments. - The PC versioning scheme (sys.winver) has changed once again. the version number is now "<digit>.<digit>.<digit>.<apiversion>", where the first three <digit>s are the Python version (e.g. "1.4.0" for Python 1.4, "1.4.1" for Python 1.4.1 -- the beta level is not included) and <apiversion> is the four-digit PYTHON_API_VERSION (currently 1005). - h2py.py accepts whitespace before the # in CPP directives - On Solaris 2.5, it should now be possible to use either Posix threads or Solaris threads (XXX: how do you select which is used???). (Note: the Python pthreads interface doesn't fully support semaphores yet -- anyone care to fix this?) - Thread support should now work on AIX, using either DCE threads or pthreads. - New file Demo/sockets/unicast.py - Working Mac port, with CFM68K support, with Tk 4.1 support (though not both) (XXX) - New project setup for PC port, now compatible with PythonWin, with _tkinter and NumPy support (XXX) - New module site.py (XXX) - New module xdrlib.py and optional support module _xdrmodule.c (XXX) - parser module adapted to new grammar, complete w/ Doc & Demo (XXX) - regen script fixed (XXX) - new machdep subdirectories Lib/{aix3,aix4,next3_3,freebsd2,linux2} (XXX) - testall now also tests math module (XXX) - string.atoi c.s. now raise an exception for an empty input string. - At last, it is no longer necessary to define HAVE_CONFIG_H in order to have config.h included at various places. - Unrecognized keyword arguments now raise TypeError rather than KeyError. - The makesetup script recognizes files with extension .so or .sl as (shared) libraries. - 'access' is no longer a reserved word, and all code related to its implementation is gone (or at least #ifdef'ed out). This should make Python a little speedier too! - Performance enhancements suggested by Sjoerd Mullender. This includes the introduction of two new optional function pointers in type object, getattro and setattro, which are like getattr and setattr but take a string object instead of a C string pointer. - New operations in string module: lstrip(s) and rstrip(s) strip whitespace only on the left or only on the right, A new optional third argument to split() specifies the maximum number of separators honored (so splitfields(s, sep, n) returns a list of at most n+1 elements). (Since 1.3, splitfields(s, None) is totally equivalent to split(s).) string.capwords() has an optional second argument specifying the separator (which is passed to split()). - regsub.split() has the same addition as string.split(). regsub.splitx(s, sep, maxsep) implements the functionality that was regsub.split(s, 1) in 1.4beta2 (return a list containing the delimiters as well as the words). - Final touch for AIX loading, rewritten Misc/AIX-NOTES. - In Modules/_tkinter.c, when using Tk 4.1 or higher, use className argument to _tkinter.create() to set Tcl's argv0 variable, so X resources use the right resource class again. - Add #undef fabs to Modules/mathmodule.c for macintosh. - Added some macro renames for AIX in Modules/operator.c. - Removed spurious 'E' from Doc/liberrno.tex. - Got rid of some cruft in Misc/ (dlMakefile, pyimenu.el); added new Misc/gMakefile and new version of Misc/python-mode.el. - Fixed typo in Lib/ntpath.py (islink has "return false" which gives a NameError). - Added missing "from types import *" to Lib/tkinter/Canvas.py. - Added hint about using default args for __init__ to pickle docs. - Corrected typo in Inclide/abstract.h: PySequence_Lenth -> PySequence_Length. - Some improvements to Doc/texi2html.py. - In Python/import.c, Cast unsigned char * in struct _frozen to char * in calls to rds_object(). - In doc/ref4.tex, added note about scope of lambda bodies. What's new in 1.4beta2 (since beta1)? ------------------------------------- - Portability bug in the md5.h header solved. - The PC build procedure now really works, and sets sys.platform to a meaningful value (a few things were botched in beta 1). Lib/dos_8x3 is now a standard part of the distribution (alas). - More improvements to the installation procedure. Typing "make install" now inserts the version number in the pathnames of almost everything installed, and creates the machine dependent modules (FCNTL.py etc.) if not supplied by the distribution. (XXX There's still a problem with the latter because the "regen" script requires that Python is installed. Some manual intervention may still be required.) (This has been fixed in 1.4beta3.) - New modules: errno, operator (XXX). - Changes for use with Numerical Python: builtin 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 mdoules. - 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 builtin 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 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 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 the 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 a portability problem sice 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.