From b26f32f4e91585d29934494e400d6fac4bbf10e1 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Mon, 4 Aug 2003 22:49:46 +0000 Subject: [PATCH] Merging release23-branch into the long-term Python 2.3 maintenance branch --- Doc/ACKS | 2 +- Doc/Makefile | 4 +- Doc/README | 11 +- Doc/doc/doc.tex | 2 +- Doc/html/about.html | 4 +- Doc/html/stdabout.dat | 4 +- Doc/info/README | 2 +- Doc/lib/libundoc.tex | 2 +- Doc/mac/toolbox.tex | 2 +- Doc/mac/undoc.tex | 2 +- Doc/python-docs.txt | 8 +- Doc/texinputs/boilerplate.tex | 4 +- Doc/tools/getpagecounts | 2 +- Doc/tools/html2texi.pl | 2 +- Doc/tools/mkackshtml | 2 +- Doc/tools/sgmlconv/README | 2 +- Doc/whatsnew/whatsnew23.tex | 5 +- Lib/test/test_optparse.py | 4 +- Lib/test/test_posixpath.py | 2 + Lib/test/test_strptime.py | 4 + Lib/test/test_urllib.py | 3 +- Lib/test/test_uu.py | 2 +- Mac/Build/PythonCore.mcp | Bin 173876 -> 173876 bytes Mac/Build/PythonInterpreter.mcp | Bin 109654 -> 109654 bytes Mac/Build/PythonStandSmall.mcp | Bin 349209 -> 349209 bytes Mac/Build/_CG.carbon.mcp | Bin 49058 -> 49058 bytes Mac/Contrib/osam/OSAm.prj | Bin 71523 -> 71523 bytes Mac/Distributions/(vise)/Python 2.3.vct | Bin 693147 -> 698945 bytes Mac/Distributions/binary.include | 3 +- Mac/Distributions/dev.include | 11 +- Mac/Distributions/src.include | 6 +- Mac/Include/macbuildno.h | 2 +- Mac/OSX/Dist/build | 6 +- Mac/OSX/Dist/resources/ReadMe.txt | 32 + Mac/OSX/Dist/resources/Welcome.rtf | 15 + Mac/OSX/Dist/resources/Welcome.txt | 25 - Mac/ReadMe | 4 +- Mac/scripts/fixfiletypes.py | 4 +- Misc/HISTORY | 1429 ++++++++++++++++++++++ Misc/NEWS | 1432 +---------------------- README | 7 +- 41 files changed, 1541 insertions(+), 1510 deletions(-) create mode 100644 Mac/OSX/Dist/resources/ReadMe.txt create mode 100644 Mac/OSX/Dist/resources/Welcome.rtf delete mode 100644 Mac/OSX/Dist/resources/Welcome.txt diff --git a/Doc/ACKS b/Doc/ACKS index c70306f7ca10..2e695406788d 100644 --- a/Doc/ACKS +++ b/Doc/ACKS @@ -4,7 +4,7 @@ Contributors to the Python Documentation This file lists people who have contributed in some way to the Python documentation. It is probably not complete -- if you feel that you or anyone else should be on this list, please let us know (send email to -python-docs@python.org), and we'll be glad to correct the problem. +docs@python.org), and we'll be glad to correct the problem. It is only with the input and contributions of the Python community that Python has such wonderful documentation -- Thank You! diff --git a/Doc/Makefile b/Doc/Makefile index 384b23fc131b..a30a3242325c 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -49,7 +49,7 @@ # The formatted output is located in subdirectories. For PDF and # PostScript, look in the paper-$(PAPER)/ directory. For HTML, look in # the html/ directory. If you want to fix the GNU info process, look -# in the info/ directory; please send patches to python-docs@python.org. +# in the info/ directory; please send patches to docs@python.org. # This Makefile only includes information on how to perform builds; for # dependency information, see Makefile.deps. @@ -66,7 +66,7 @@ TOOLSDIR= tools # This is the *documentation* release, and is used to construct the file # names of the downloadable tarballs. -RELEASE=2.3 +RELEASE=2.3+ PYTHON= python DVIPS= dvips -N0 -t $(PAPER) diff --git a/Doc/README b/Doc/README index 52b958c348c6..f6f04970fa2d 100644 --- a/Doc/README +++ b/Doc/README @@ -66,20 +66,11 @@ databases at: Other suggestions or questions should be sent to the Python Documentation Team: - python-docs@python.org + docs@python.org Thanks! -What happened to the Macintosh chapter of the Python Library Reference? ------------------------------------------------------------------------ - -The directory mac/ contains the LaTeX sources for the "Macintosh -Library Modules" manual; this is built using the standard build -targets, so check the proper output directory for your chosen format -and paper size. - - What tools do I need? --------------------- diff --git a/Doc/doc/doc.tex b/Doc/doc/doc.tex index 210ae2cf0b23..6c77ba0d4817 100644 --- a/Doc/doc/doc.tex +++ b/Doc/doc/doc.tex @@ -1911,7 +1911,7 @@ This \UNIX\ is also followed by a space. interested parties. Comments and bug reports on the standard documents should be sent - to \email{python-docs@python.org}. This may include comments + to \email{docs@python.org}. This may include comments about formatting, content, grammatical and spelling errors, or this document. You can also send comments on this document directly to the author at \email{fdrake@acm.org}. diff --git a/Doc/html/about.html b/Doc/html/about.html index 0e0fb644692b..1d69fd1a194c 100644 --- a/Doc/html/about.html +++ b/Doc/html/about.html @@ -55,8 +55,8 @@

Comments and Questions

General comments and questions regarding this document should - be sent by email to python-docs@python.org. If you find specific errors in + be sent by email to docs@python.org. If you find specific errors in this document, please report the bug at the Python Bug Tracker at SourceForge. diff --git a/Doc/html/stdabout.dat b/Doc/html/stdabout.dat index bf0f1e6ff5ab..00a20ba2897a 100644 --- a/Doc/html/stdabout.dat +++ b/Doc/html/stdabout.dat @@ -28,8 +28,8 @@

Comments and Questions

General comments and questions regarding this document should - be sent by email to python-docs@python.org. If you find specific errors in + be sent by email to docs@python.org. If you find specific errors in this document, either in the content or the presentation, please report the bug at the Python Bug diff --git a/Doc/info/README b/Doc/info/README index 802314412cbf..bcee2be2b0ac 100644 --- a/Doc/info/README +++ b/Doc/info/README @@ -18,4 +18,4 @@ Thanks go to Milan Zamazal for providing this conversion to the info format. Questions and comments on these documents should be directed to -python-docs@python.org. +docs@python.org. diff --git a/Doc/lib/libundoc.tex b/Doc/lib/libundoc.tex index 466d75bd9b80..e1d3a2a74115 100644 --- a/Doc/lib/libundoc.tex +++ b/Doc/lib/libundoc.tex @@ -2,7 +2,7 @@ Here's a quick listing of modules that are currently undocumented, but that should be documented. Feel free to contribute documentation for -them! (Send via email to \email{python-docs@python.org}.) +them! (Send via email to \email{docs@python.org}.) The idea and original contents for this chapter were taken from a posting by Fredrik Lundh; the specific contents of this chapter diff --git a/Doc/mac/toolbox.tex b/Doc/mac/toolbox.tex index d31b7f870877..9fbcb8440d4a 100644 --- a/Doc/mac/toolbox.tex +++ b/Doc/mac/toolbox.tex @@ -24,7 +24,7 @@ from Carbon import AE \strong{Warning!} These modules are not yet documented. If you wish to contribute documentation of any of these modules, please get -in touch with \email{python-docs@python.org}. +in touch with \email{docs@python.org}. \localmoduletable diff --git a/Doc/mac/undoc.tex b/Doc/mac/undoc.tex index 93c66d896f97..55f1721baffb 100644 --- a/Doc/mac/undoc.tex +++ b/Doc/mac/undoc.tex @@ -4,7 +4,7 @@ The modules in this chapter are poorly documented (if at all). If you wish to contribute documentation of any of these modules, please get in touch with -\ulink{\email{python-docs@python.org}}{mailto:python-docs@python.org}. +\ulink{\email{docs@python.org}}{mailto:docs@python.org}. \localmoduletable diff --git a/Doc/python-docs.txt b/Doc/python-docs.txt index 22beac632ab4..94d4513ab009 100644 --- a/Doc/python-docs.txt +++ b/Doc/python-docs.txt @@ -1,5 +1,5 @@ This message is being sent in response to your message to the Python -documentation maintainers (python-docs@python.org). Your message will +documentation maintainers (docs@python.org). Your message will be handled by a human, but this message serves to answer the most common questions sent to this address. @@ -96,7 +96,7 @@ Answers to the Questions Start by reading the documentation for XXX. If the documentation doesn't make sense or seems incomplete, please - file a specific bug report to python-docs@python.org (the + file a specific bug report to docs@python.org (the address you sent your question to). Otherwise, you probably sent your question to the wrong place (which does not preclude an answer, if I know it). @@ -124,14 +124,14 @@ Answers to the Questions http://www.jython.org/ Chances are very good that the person who answers questions - posted to python-docs@python.org doesn't use Jython very often, + posted to docs@python.org doesn't use Jython very often, and won't be able to give you a meaningful answer beyond "Look at the Jython website." Sorry, I don't have *all* the answers! 8. I found a bug in the documentation, who should I tell? If you're reading this, you've found the right address! Send - all documentation bug reports to python-docs@python.org. If + all documentation bug reports to docs@python.org. If you prefer to use a Web-based reporting mechanism, you can use the bug database at http://www.python.org/python-bugs/. diff --git a/Doc/texinputs/boilerplate.tex b/Doc/texinputs/boilerplate.tex index c69cdba81799..82ff0b5bddad 100644 --- a/Doc/texinputs/boilerplate.tex +++ b/Doc/texinputs/boilerplate.tex @@ -2,10 +2,10 @@ Fred L. Drake, Jr., editor} \authoraddress{ \strong{PythonLabs}\\ - Email: \email{python-docs@python.org} + Email: \email{docs@python.org} } -\date{July 29, 2003} % XXX update before final release! +\date{\today} % XXX update before final release! \release{2.3} % software release, not documentation \setreleaseinfo{} % empty for final release \setshortversion{2.3} % major.minor only for software diff --git a/Doc/tools/getpagecounts b/Doc/tools/getpagecounts index 0837431fe150..58f703c290ee 100755 --- a/Doc/tools/getpagecounts +++ b/Doc/tools/getpagecounts @@ -73,7 +73,7 @@ The following manuals are included in this package: If you have any questions, comments, or suggestions regarding these -documents, please send them via email to python-docs@python.org. +documents, please send them via email to docs@python.org. """ def count_pages(filename): diff --git a/Doc/tools/html2texi.pl b/Doc/tools/html2texi.pl index be050b166731..5dcfd46f02a5 100755 --- a/Doc/tools/html2texi.pl +++ b/Doc/tools/html2texi.pl @@ -137,7 +137,7 @@ # Index: # Perhaps double-check that every tag mentioned in the index is found # in the text. -# Python: email to python-docs@python.org, to get their feedback. +# Python: email to docs@python.org, to get their feedback. # Compare to existing lib/ Info manual # Write the hooks into info-look; replace pyliblookup1-1.tar.gz. # Postpass to remove extra quotation marks around typography already in diff --git a/Doc/tools/mkackshtml b/Doc/tools/mkackshtml index 79fe3f92f512..2c79f5eb1067 100755 --- a/Doc/tools/mkackshtml +++ b/Doc/tools/mkackshtml @@ -53,7 +53,7 @@ THANKS = '''\ documentation. This list is probably not complete -- if you feel that you or anyone else should be on this list, please let us know (send email to python-docs@python.org), and +href="mailto:docs@python.org">docs@python.org), and we will be glad to correct the problem.

It is only with the input and contributions of the Python community diff --git a/Doc/tools/sgmlconv/README b/Doc/tools/sgmlconv/README index 15462930b4b7..02564eb5e48a 100644 --- a/Doc/tools/sgmlconv/README +++ b/Doc/tools/sgmlconv/README @@ -13,7 +13,7 @@ To convert one document to XML: cd Doc/ make -f ../tools/sgmlconv/make.rules TOOLSDIR=../tools -Please send comments and bug reports to python-docs@python.org. +Please send comments and bug reports to docs@python.org. What do the tools do? diff --git a/Doc/whatsnew/whatsnew23.tex b/Doc/whatsnew/whatsnew23.tex index 2e9b3854c0d4..cd8dc17b21a6 100644 --- a/Doc/whatsnew/whatsnew23.tex +++ b/Doc/whatsnew/whatsnew23.tex @@ -1055,7 +1055,7 @@ class FakeSeq: def __getitem__(self, item): if isinstance(item, slice): indices = item.indices(len(self)) - return FakeSeq([self.calc_item(i) in range(*indices)]) + return FakeSeq([self.calc_item(i) for i in range(*indices)]) else: return self.calc_item(i) \end{verbatim} @@ -2386,7 +2386,8 @@ name. The author would like to thank the following people for offering suggestions, corrections and assistance with various drafts of this article: Jeff Bauer, Simon Brunning, Brett Cannon, Michael Chermside, -Andrew Dalke, Scott David Daniels, Fred~L. Drake, Jr., Kelly Gerber, +Andrew Dalke, Scott David Daniels, Fred~L. Drake, Jr., David Fraser, +Kelly Gerber, Raymond Hettinger, Michael Hudson, Chris Lambert, Detlef Lannert, Martin von~L\"owis, Andrew MacIntyre, Lalo Martins, Chad Netzer, Gustavo Niemeyer, Neal Norwitz, Hans Nowak, Chris Reedy, Francesco diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py index 471244691fde..c8b355681d52 100644 --- a/Lib/test/test_optparse.py +++ b/Lib/test/test_optparse.py @@ -607,7 +607,7 @@ class TestNArgsAppend(BaseTest): class TestVersion(BaseTest): def test_version(self): oldargv = sys.argv[0] - sys.argv[0] = "./foo/bar" + sys.argv[0] = os.path.join(os.curdir, "foo", "bar") self.parser = OptionParser(usage=SUPPRESS_USAGE, version="%prog 0.1") self.assertStdoutEquals(["--version"], "bar 0.1\n") sys.argv[0] = oldargv @@ -1086,7 +1086,7 @@ class TestHelp(BaseTest): def assertHelpEquals(self, expected_output): # This trick is used to make optparse believe bar.py is being executed. oldargv = sys.argv[0] - sys.argv[0] = "./foo/bar.py" + sys.argv[0] = os.path.join(os.curdir, "foo", "bar.py") self.assertStdoutEquals(["-h"], expected_output) diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index fcf2ef56c6e6..792bc9ed3dc8 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -326,6 +326,8 @@ class PosixPathTest(unittest.TestCase): self.assertRaises(TypeError, posixpath.samestat) def test_ismount(self): + if os.name in ('mac',): + return self.assertIs(posixpath.ismount("/"), True) self.assertRaises(TypeError, posixpath.ismount) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 9ac75e630bf7..183ec5629776 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -4,6 +4,7 @@ import unittest import time import locale import re +import sys from test import test_support import _strptime @@ -306,6 +307,9 @@ class StrptimeTests(unittest.TestCase): strf_output = time.strftime("%Z") #UTC does not have a timezone strp_output = _strptime.strptime(strf_output, "%Z") locale_time = _strptime.LocaleTime() + if sys.platform == 'mac': + # Timezones don't really work on MacOS9 + return if time.tzname[0] != time.tzname[1] or not time.daylight: self.failUnless(strp_output[8] == time_tuple[8], "timezone check failed; '%s' -> %s != %s" % diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 9cb4dd233b78..b097a681c18a 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -106,7 +106,8 @@ class urlretrieve_FileTests(unittest.TestCase): # Make sure that a local file just gets its own location returned and # a headers value is returned. result = urllib.urlretrieve("file:%s" % test_support.TESTFN) - self.assertEqual(result[0], test_support.TESTFN) + self.assertEqual(os.path.normpath(result[0]), + os.path.normpath(test_support.TESTFN)) self.assert_(isinstance(result[1], mimetools.Message), "did not get a mimetools.Message instance as second " "returned value") diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index 26d1a7ab4fe9..5941b447603b 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -142,7 +142,7 @@ class UUFileTest(unittest.TestCase): uu.decode(f) f.close() - f = open(self.tmpout, 'r') + f = open(self.tmpout, 'rU') s = f.read() f.close() self.assertEqual(s, plaintext) diff --git a/Mac/Build/PythonCore.mcp b/Mac/Build/PythonCore.mcp index 7ec096f13e9565d55546b55e978e922dc53543a2..93aa4ca4ca4fbab739bbe9a695af3c6046807a2b 100644 GIT binary patch delta 97 zc-q@?j%&*~t_@zH9J~Fvm>3vL7j6y;Js=L`v3C9czg=!~VDT@;%_8}G)C3qiEZ#6c s0g(M=G9$~)%{!+#wQ+u6VrBs2>0EM*3X>CxAGEW`F>Ys(V>0Lj0Nl?ZeEG7i delta 47 zc-jFk0MP%|*ap_v2CyOw1<-&200grzstN&0%B$$X4xLi&$`bA0QF!TkN^Mx diff --git a/Mac/Build/_CG.carbon.mcp b/Mac/Build/_CG.carbon.mcp index da7927ec42dc55e4b7a45ae762e34d5ea3c79405..624a2de42590eaca2a23cfa66e050f4a49f8262f 100755 GIT binary patch delta 107 zc-mX^pJ~y5rVY}Y!b_6V7=U1bFpy|yU}oU*jRx@^{kZxV7$U7VD;A0}ZEoKp%?$v+C=;jv delta 107 zc-mX^pJ~y5rVY}Y!WkGC8DOA+gMonwNQ*G|emlSr0Og4>1f?8caD(zB7~;zgFa$$+ gQb5cM#C%YiXIItVnE(H$cy3lK6lL1nzD1fF03@yz4*&oF diff --git a/Mac/Contrib/osam/OSAm.prj b/Mac/Contrib/osam/OSAm.prj index 527563c100a0ac7a1d97b6d646b99ff1fca9b453..650e70ca96cd46ebb030171716969c3c204173b9 100644 GIT binary patch delta 41 wc-nisj^*(>mJPbn>`D1~3_!5iL^>jhW4FJ%|Ns9p{%o$?BFeORW%;i808NMydH?_b delta 41 xc-nisj^*(>mJPbn>jhW0&=v)BpdUyS2G;izw6PmF2tU0{~1*5)1$U diff --git a/Mac/Distributions/(vise)/Python 2.3.vct b/Mac/Distributions/(vise)/Python 2.3.vct index 2e0cfd3bc7f74fcda90b5c868e76b4cc63fe97ba..4e0d3af18c4ff893f96d42041d48fac23348fe1f 100644 GIT binary patch delta 92444 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 (cr, tp): if change: MacOS.SetCreatorAndType(name, cr, tp) - macostools.touched(fs) + #macostools.touched(fs) print 'Fixed ', name else: print 'Wrong', curcrtp, name @@ -51,6 +51,6 @@ def run(change): walktree(pathname, change) if __name__ == '__main__': - run(0) + run(1) diff --git a/Misc/HISTORY b/Misc/HISTORY index 329d0b369257..fb7ba77f0401 100644 --- a/Misc/HISTORY +++ b/Misc/HISTORY @@ -7,6 +7,1435 @@ As you read on you go back to the dark ages of Python's history. ====================================================================== +What's New in Python 2.2 final? +=============================== + +*Release date: 21-Dec-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- pickle.py, cPickle: allow pickling instances of new-style classes + with a custom metaclass. + +Core and builtins +----------------- + +- weakref proxy object: when comparing, unwrap both arguments if both + are proxies. + +Extension modules +----------------- + +- binascii.b2a_base64(): fix a potential buffer overrun when encoding + very short strings. + +- cPickle: the obscure "fast" mode was suspected of causing stack + overflows on the Mac. Hopefully fixed this by setting the recursion + limit much smaller. If the limit is too low (it only affects + performance), you can change it by defining PY_CPICKLE_FAST_LIMIT + when compiling cPickle.c (or in pyconfig.h). + +Library +------- + +- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at + close or delete time). + +- rfc822.py: fixed a bug where the address '<>' was converted to None + instead of an empty string (also fixes the email.Utils module). + +- xmlrpclib.py: version 1.0.0; uses precision for doubles. + +- test suite: the pickle and cPickle tests were not executing any code + when run from the standard regression test. + +Tools/Demos +----------- + +Build +----- + +C API +----- + +New platforms +------------- + +Tests +----- + +Windows +------- + +- distutils package: fixed broken Windows installers (bdist_wininst). + +- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper + instances are deleted at process exit time. + +- socket.py: prevent mysterious warnings when socket instances are + deleted at process exit time. + +- posixmodule.c: fix a Windows crash with stat() of a filename ending + in backslash. + +Mac +---- + +- The Carbon toolbox modules have been upgraded to Universal Headers + 3.4, and experimental CoreGraphics and CarbonEvents modules have + been added. All only for framework-enabled MacOSX. + + +What's New in Python 2.2c1? +=========================== + +*Release date: 14-Dec-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- Guido's tutorial introduction to the new type/class features has + been extensively updated. See + + http://www.python.org/2.2/descrintro.html + + That remains the primary documentation in this area. + +- Fixed a leak: instance variables declared with __slots__ were never + deleted! + +- The "delete attribute" method of descriptor objects is called + __delete__, not __del__. In previous releases, it was mistakenly + called __del__, which created an unfortunate overloading condition + with finalizers. (The "get attribute" and "set attribute" methods + are still called __get__ and __set__, respectively.) + +- Some subtle issues with the super built-in were fixed: + + (a) When super itself is subclassed, its __get__ method would still + return an instance of the base class (i.e., of super). + + (b) super(C, C()).__class__ would return C rather than super. This + is confusing. To fix this, I decided to change the semantics of + super so that it only applies to code attributes, not to data + attributes. After all, overriding data attributes is not + supported anyway. + + (c) The __get__ method didn't check whether the argument was an + instance of the type used in creation of the super instance. + +- Previously, hash() of an instance of a subclass of a mutable type + (list or dictionary) would return some value, rather than raising + TypeError. This has been fixed. Also, directly calling + dict.__hash__ and list.__hash__ now raises the same TypeError + (previously, these were the same as object.__hash__). + +- New-style objects now support deleting their __dict__. This is for + all intents and purposes equivalent to assigning a brand new empty + dictionary, but saves space if the object is not used further. + +Core and builtins +----------------- + +- -Qnew now works as documented in PEP 238: when -Qnew is passed on + the command line, all occurrences of "/" use true division instead + of classic division. See the PEP for details. Note that "all" + means all instances in library and 3rd-party modules, as well as in + your own code. As the PEP says, -Qnew is intended for use only in + educational environments with control over the libraries in use. + Note that test_coercion.py in the standard Python test suite fails + under -Qnew; this is expected, and won't be repaired until true + division becomes the default (in the meantime, test_coercion is + testing the current rules). + +- complex() now only allows the first argument to be a string + argument, and raises TypeError if either the second arg is a string + or if the second arg is specified when the first is a string. + +Extension modules +----------------- + +- gc.get_referents was renamed to gc.get_referrers. + +Library +------- + +- Functions in the os.spawn() family now release the global interpreter + lock around calling the platform spawn. They should always have done + this, but did not before 2.2c1. Multithreaded programs calling + an os.spawn function with P_WAIT will no longer block all Python threads + until the spawned program completes. It's possible that some programs + relies on blocking, although more likely by accident than by design. + +- webbrowser defaults to netscape.exe on OS/2 now. + +- Tix.ResizeHandle exposes detach_widget, hide, and show. + +- The charset alias windows_1252 has been added. + +- types.StringTypes is a tuple containing the defined string types; + usually this will be (str, unicode), but if Python was compiled + without Unicode support it will be just (str,). + +- The pulldom and minidom modules were synchronized to PyXML. + +Tools/Demos +----------- + +- A new script called Tools/scripts/google.py was added, which fires + off a search on Google. + +Build +----- + +- Note that release builds of Python should arrange to define the + preprocessor symbol NDEBUG on the command line (or equivalent). + In the 2.2 pre-release series we tried to define this by magic in + Python.h instead, but it proved to cause problems for extension + authors. The Unix, Windows and Mac builds now all define NDEBUG in + release builds via cmdline (or equivalent) instead. Ports to + other platforms should do likewise. + +- It is no longer necessary to use --with-suffix when building on a + case-insensitive file system (such as Mac OS X HFS+). In the build + directory an extension is used, but not in the installed python. + +C API +----- + +- New function PyDict_MergeFromSeq2() exposes the builtin dict + constructor's logic for updating a dictionary from an iterable object + producing key-value pairs. + +- PyArg_ParseTupleAndKeywords() requires that the number of entries in + the keyword list equal the number of argument specifiers. This + wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even + dump core in some bad cases. This has been repaired. As a result, + PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that + previously went unchallenged. + +New platforms +------------- + +Tests +----- + +Windows +------- + +Mac +---- + +- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin", + without any trailing digits. + +- Changed logic for finding python home in Mac OS X framework Pythons. + Now sys.executable points to the executable again, in stead of to + the shared library. The latter is used only for locating the python + home. + + +What's New in Python 2.2b2? +=========================== + +*Release date: 16-Nov-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- Multiple inheritance mixing new-style and classic classes in the + list of base classes is now allowed, so this works now: + + class Classic: pass + class Mixed(Classic, object): pass + + The MRO (method resolution order) for each base class is respected + according to its kind, but the MRO for the derived class is computed + using new-style MRO rules if any base class is a new-style class. + This needs to be documented. + +- The new builtin dictionary() constructor, and dictionary type, have + been renamed to dict. This reflects a decade of common usage. + +- dict() now accepts an iterable object producing 2-sequences. For + example, dict(d.items()) == d for any dictionary d. The argument, + and the elements of the argument, can be any iterable objects. + +- New-style classes can now have a __del__ method, which is called + when the instance is deleted (just like for classic classes). + +- Assignment to object.__dict__ is now possible, for objects that are + instances of new-style classes that have a __dict__ (unless the base + class forbids it). + +- Methods of built-in types now properly check for keyword arguments + (formerly these were silently ignored). The only built-in methods + that take keyword arguments are __call__, __init__ and __new__. + +- The socket function has been converted to a type; see below. + +Core and builtins +----------------- + +- Assignment to __debug__ raises SyntaxError at compile-time. This + was promised when 2.1c1 was released as "What's New in Python 2.1c1" + (see below) says. + +- Clarified the error messages for unsupported operands to an operator + (like 1 + ''). + +Extension modules +----------------- + +- mmap has a new keyword argument, "access", allowing a uniform way for + both Windows and Unix users to create read-only, write-through and + copy-on-write memory mappings. This was previously possible only on + Unix. A new keyword argument was required to support this in a + uniform way because the mmap() signatures had diverged across + platforms. Thanks to Jay T Miller for repairing this! + +- By default, the gc.garbage list now contains only those instances in + unreachable cycles that have __del__ methods; in 2.1 it contained all + instances in unreachable cycles. "Instances" here has been generalized + to include instances of both new-style and old-style classes. + +- The socket module defines a new method for socket objects, + sendall(). This is like send() but may make multiple calls to + send() until all data has been sent. Also, the socket function has + been converted to a subclassable type, like list and tuple (etc.) + before it; socket and SocketType are now the same thing. + +- Various bugfixes to the curses module. There is now a test suite + for the curses module (you have to run it manually). + +- binascii.b2a_base64 no longer places an arbitrary restriction of 57 + bytes on its input. + +Library +------- + +- tkFileDialog exposes a Directory class and askdirectory + convenience function. + +- Symbolic group names in regular expressions must be unique. For + example, the regexp r'(?P)(?P)' is not allowed, because a + single name can't mean both "group 1" and "group 2" simultaneously. + Python 2.2 detects this error at regexp compilation time; + previously, the error went undetected, and results were + unpredictable. Also in sre, the pattern.split(), pattern.sub(), and + pattern.subn() methods have been rewritten in C. Also, an + experimental function/method finditer() has been added, which works + like findall() but returns an iterator. + +- Tix exposes more commands through the classes DirSelectBox, + DirSelectDialog, ListNoteBook, Meter, CheckList, and the + methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, + tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. + +- Traceback objects are now scanned by cyclic garbage collection, so + cycles created by casual use of sys.exc_info() no longer cause + permanent memory leaks (provided garbage collection is enabled). + +- os.extsep -- a new variable needed by the RISCOS support. It is the + separator used by extensions, and is '.' on all platforms except + RISCOS, where it is '/'. There is no need to use this variable + unless you have a masochistic desire to port your code to RISCOS. + +- mimetypes.py has optional support for non-standard, but commonly + found types. guess_type() and guess_extension() now accept an + optional 'strict' flag, defaulting to true, which controls whether + recognize non-standard types or not. A few non-standard types we + know about have been added. Also, when run as a script, there are + new -l and -e options. + +- statcache is now deprecated. + +- email.Utils.formatdate() now produces the preferred RFC 2822 style + dates with numeric timezones (it used to produce obsolete dates + hard coded to "GMT" timezone). An optional 'localtime' flag is + added to produce dates in the local timezone, with daylight savings + time properly taken into account. + +- In pickle and cPickle, instead of masking errors in load() by + transforming them into SystemError, we let the original exception + propagate out. Also, implement support for __safe_for_unpickling__ + in pickle, as it already was supported in cPickle. + +Tools/Demos +----------- + +Build +----- + +- The dbm module is built using libdb1 if available. The bsddb module + is built with libdb3 if available. + +- Misc/Makefile.pre.in has been removed by BDFL pronouncement. + +C API +----- + +- New function PySequence_Fast_GET_SIZE() returns the size of a non- + NULL result from PySequence_Fast(), more quickly than calling + PySequence_Size(). + +- New argument unpacking function PyArg_UnpackTuple() added. + +- New functions PyObject_CallFunctionObjArgs() and + PyObject_CallMethodObjArgs() have been added to make it more + convenient and efficient to call functions and methods from C. + +- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's + possible that this will propagate errors it didn't before. + +- New function PyObject_CheckReadBuffer(), which returns true if its + argument supports the single-segment readable buffer interface. + +New platforms +------------- + +- We've finally confirmed that this release builds on HP-UX 11.00, + *with* threads, and passes the test suite. + +- Thanks to a series of patches from Michael Muller, Python may build + again under OS/2 Visual Age C++. + +- Updated RISCOS port by Dietmar Schwertberger. + +Tests +----- + +- Added a test script for the curses module. It isn't run automatically; + regrtest.py must be run with '-u curses' to enable it. + +Windows +------- + +Mac +---- + +- PythonScript has been moved to unsupported and is slated to be + removed completely in the next release. + +- It should now be possible to build applets that work on both OS9 and + OSX. + +- The core is now linked with CoreServices not Carbon; as a side + result, default 8bit encoding on OSX is now ASCII. + +- Python should now build on OSX 10.1.1 + + +What's New in Python 2.2b1? +=========================== + +*Release date: 19-Oct-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- New-style classes are now always dynamic (except for built-in and + extension types). There is no longer a performance penalty, and I + no longer see another reason to keep this baggage around. One relic + remains: the __dict__ of a new-style class is a read-only proxy; you + must set the class's attribute to modify it. As a consequence, the + __defined__ attribute of new-style types no longer exists, for lack + of need: there is once again only one __dict__ (although in the + future a __cache__ may be resurrected with a similar function, if I + can prove that it actually speeds things up). + +- C.__doc__ now works as expected for new-style classes (in 2.2a4 it + always returned None, even when there was a class docstring). + +- doctest now finds and runs docstrings attached to new-style classes, + class methods, static methods, and properties. + +Core and builtins +----------------- + +- A very subtle syntactical pitfall in list comprehensions was fixed. + For example: [a+b for a in 'abc', for b in 'def']. The comma in + this example is a mistake. Previously, this would silently let 'a' + iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce', + 'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be', + 'bf', 'cd', 'ce', 'cf']. Now, this is flagged as a syntax error. + Note that [a for a in ] is a convoluted way to say + [] anyway, so it's not like any expressiveness is lost. + +- getattr(obj, name, default) now only catches AttributeError, as + documented, rather than returning the default value for all + exceptions (which could mask bugs in a __getattr__ hook, for + example). + +- Weak reference objects are now part of the core and offer a C API. + A bug which could allow a core dump when binary operations involved + proxy reference has been fixed. weakref.ReferenceError is now a + built-in exception. + +- unicode(obj) now behaves more like str(obj), accepting arbitrary + objects, and calling a __unicode__ method if it exists. + unicode(obj, encoding) and unicode(obj, encoding, errors) still + require an 8-bit string or character buffer argument. + +- isinstance() now allows any object as the first argument and a + class, a type or something with a __bases__ tuple attribute for the + second argument. The second argument may also be a tuple of a + class, type, or something with __bases__, in which case isinstance() + will return true if the first argument is an instance of any of the + things contained in the second argument tuple. E.g. + + isinstance(x, (A, B)) + + returns true if x is an instance of A or B. + +Extension modules +----------------- + +- thread.start_new_thread() now returns the thread ID (previously None). + +- binascii has now two quopri support functions, a2b_qp and b2a_qp. + +- readline now supports setting the startup_hook and the + pre_event_hook, and adds the add_history() function. + +- os and posix supports chroot(), setgroups() and unsetenv() where + available. The stat(), fstat(), statvfs() and fstatvfs() functions + now return "pseudo-sequences" -- the various fields can now be + accessed as attributes (e.g. os.stat("/").st_mtime) but for + backwards compatibility they also behave as a fixed-length sequence. + Some platform-specific fields (e.g. st_rdev) are only accessible as + attributes. + +- time: localtime(), gmtime() and strptime() now return a + pseudo-sequence similar to the os.stat() return value, with + attributes like tm_year etc. + +- Decompression objects in the zlib module now accept an optional + second parameter to decompress() that specifies the maximum amount + of memory to use for the uncompressed data. + +- optional SSL support in the socket module now exports OpenSSL + functions RAND_add(), RAND_egd(), and RAND_status(). These calls + are useful on platforms like Solaris where OpenSSL does not + automatically seed its PRNG. Also, the keyfile and certfile + arguments to socket.ssl() are now optional. + +- posixmodule (and by extension, the os module on POSIX platforms) now + exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW. + +Library +------- + +- doctest now excludes functions and classes not defined by the module + being tested, thanks to Tim Hochberg. + +- HotShot, a new profiler implemented using a C-based callback, has + been added. This substantially reduces the overhead of profiling, + but it is still quite preliminary. Support modules and + documentation will be added in upcoming releases (before 2.2 final). + +- profile now produces correct output in situations where an exception + raised in Python is cleared by C code (e.g. hasattr()). This used + to cause wrong output, including spurious claims of recursive + functions and attribution of time spent to the wrong function. + + The code and documentation for the derived OldProfile and HotProfile + profiling classes was removed. The code hasn't worked for years (if + you tried to use them, they raised exceptions). OldProfile + intended to reproduce the behavior of the profiler Python used more + than 7 years ago, and isn't interesting anymore. HotProfile intended + to provide a faster profiler (but producing less information), and + that's a worthy goal we intend to meet via a different approach (but + without losing information). + +- Profile.calibrate() has a new implementation that should deliver + a much better system-specific calibration constant. The constant can + now be specified in an instance constructor, or as a Profile class or + instance variable, instead of by editing profile.py's source code. + Calibration must still be done manually (see the docs for the profile + module). + + Note that Profile.calibrate() must be overridden by subclasses. + Improving the accuracy required exploiting detailed knowledge of + profiler internals; the earlier method abstracted away the details + and measured a simplified model instead, but consequently computed + a constant too small by a factor of 2 on some modern machines. + +- quopri's encode and decode methods take an optional header parameter, + which indicates whether output is intended for the header 'Q' + encoding. + +- The SocketServer.ThreadingMixIn class now closes the request after + finish_request() returns. (Not when it errors out though.) + +- The nntplib module's NNTP.body() method has grown a 'file' argument + to allow saving the message body to a file. + +- The email package has added a class email.Parser.HeaderParser which + only parses headers and does not recurse into the message's body. + Also, the module/class MIMEAudio has been added for representing + audio data (contributed by Anthony Baxter). + +- ftplib should be able to handle files > 2GB. + +- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO, + ON, and OFF. + +- xml.dom.minidom NodeList objects now support the length attribute + and item() method as required by the DOM specifications. + +Tools/Demos +----------- + +- Demo/dns was removed. It no longer serves any purpose; a package + derived from it is now maintained by Anthony Baxter, see + http://PyDNS.SourceForge.net. + +- The freeze tool has been made more robust, and two new options have + been added: -X and -E. + +Build +----- + +- configure will use CXX in LINKCC if CXX is used to build main() and + the system requires to link a C++ main using the C++ compiler. + +C API +----- + +- The documentation for the tp_compare slot is updated to require that + the return value must be -1, 0, 1; an arbitrary number <0 or >0 is + not correct. This is not yet enforced but will be enforced in + Python 2.3; even later, we may use -2 to indicate errors and +2 for + "NotImplemented". Right now, -1 should be used for an error return. + +- PyLong_AsLongLong() now accepts int (as well as long) arguments. + Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well + as long) arguments. + +- PyThread_start_new_thread() now returns a long int giving the thread + ID, if one can be calculated; it returns -1 for error, 0 if no + thread ID is calculated (this is an incompatible change, but only + the thread module used this API). This code has only really been + tested on Linux and Windows; other platforms please beware (and + report any bugs or strange behavior). + +- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as + input. + +New platforms +------------- + +Tests +----- + +Windows +------- + +- Installer: If you install IDLE, and don't disable file-extension + registration, a new "Edit with IDLE" context (right-click) menu entry + is created for .py and .pyw files. + +- The signal module now supports SIGBREAK on Windows, thanks to Steven + Scott. Note that SIGBREAK is unique to Windows. The default SIGBREAK + action remains to call Win32 ExitProcess(). This can be changed via + signal.signal(). For example:: + + # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C + # (SIGINT) behavior. + import signal + signal.signal(signal.SIGBREAK, signal.default_int_handler) + + try: + while 1: + pass + except KeyboardInterrupt: + # We get here on Ctrl+C or Ctrl+Break now; if we had not changed + # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the + # program without the possibility for any Python-level cleanup). + print "Clean exit" + + +What's New in Python 2.2a4? +=========================== + +*Release date: 28-Sep-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- pydoc and inspect are now aware of new-style classes; + e.g. help(list) at the interactive prompt now shows proper + documentation for all operations on list objects. + +- Applications using Jim Fulton's ExtensionClass module can now safely + be used with Python 2.2. In particular, Zope 2.4.1 now works with + Python 2.2 (as well as with Python 2.1.1). The Demo/metaclass + examples also work again. It is hoped that Gtk and Boost also work + with 2.2a4 and beyond. (If you can confirm this, please write + webmaster@python.org; if there are still problems, please open a bug + report on SourceForge.) + +- property() now takes 4 keyword arguments: fget, fset, fdel and doc. + These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__' + in the constructed property object. fget, fset and fdel weren't + discoverable from Python in 2.2a3. __doc__ is new, and allows to + associate a docstring with a property. + +- Comparison overloading is now more completely implemented. For + example, a str subclass instance can properly be compared to a str + instance, and it can properly overload comparison. Ditto for most + other built-in object types. + +- The repr() of new-style classes has changed; instead of a new-style class is now rendered as , + *except* for built-in types, which are still rendered as (to avoid upsetting existing code that might parse or + otherwise rely on repr() of certain type objects). + +- The repr() of new-style objects is now always ; + previously, it was sometimes . + +- For new-style classes, what was previously called __getattr__ is now + called __getattribute__. This method, if defined, is called for + *every* attribute access. A new __getattr__ hook more similar to the + one in classic classes is defined which is called only if regular + attribute access raises AttributeError; to catch *all* attribute + access, you can use __getattribute__ (for new-style classes). If + both are defined, __getattribute__ is called first, and if it raises + AttributeError, __getattr__ is called. + +- The __class__ attribute of new-style objects can be assigned to. + The new class must have the same C-level object layout as the old + class. + +- The builtin file type can be subclassed now. In the usual pattern, + "file" is the name of the builtin type, and file() is a new builtin + constructor, with the same signature as the builtin open() function. + file() is now the preferred way to open a file. + +- Previously, __new__ would only see sequential arguments passed to + the type in a constructor call; __init__ would see both sequential + and keyword arguments. This made no sense whatsoever any more, so + now both __new__ and __init__ see all arguments. + +- Previously, hash() applied to an instance of a subclass of str or + unicode always returned 0. This has been repaired. + +- Previously, an operation on an instance of a subclass of an + immutable type (int, long, float, complex, tuple, str, unicode), + where the subtype didn't override the operation (and so the + operation was handled by the builtin type), could return that + instance instead a value of the base type. For example, if s was of + a str subclass type, s[:] returned s as-is. Now it returns a str + with the same value as s. + +- Provisional support for pickling new-style objects has been added. + +Core +---- + +- file.writelines() now accepts any iterable object producing strings. + +- PyUnicode_FromEncodedObject() now works very much like + PyObject_Str(obj) in that it tries to use __str__/tp_str + on the object if the object is not a string or buffer. This + makes unicode() behave like str() when applied to non-string/buffer + objects. + +- PyFile_WriteObject now passes Unicode objects to the file's write + method. As a result, all file-like objects which may be the target + of a print statement must support Unicode objects, i.e. they must + at least convert them into ASCII strings. + +- Thread scheduling on Solaris should be improved; it is no longer + necessary to insert a small sleep at the start of a thread in order + to let other runnable threads be scheduled. + +Library +------- + +- StringIO.StringIO instances and cStringIO.StringIO instances support + read character buffer compatible objects for their .write() methods. + These objects are converted to strings and then handled as such + by the instances. + +- The "email" package has been added. This is basically a port of the + mimelib package with API changes + and some implementations updated to use iterators and generators. + +- difflib.ndiff() and difflib.Differ.compare() are generators now. This + restores the ability of Tools/scripts/ndiff.py to start producing output + before the entire comparison is complete. + +- StringIO.StringIO instances and cStringIO.StringIO instances support + iteration just like file objects (i.e. their .readline() method is + called for each iteration until it returns an empty string). + +- The codecs module has grown four new helper APIs to access + builtin codecs: getencoder(), getdecoder(), getreader(), + getwriter(). + +- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer) + simplifies writing XML RPC servers. + +- os.path.realpath(): a new function that returns the absolute pathname + after interpretation of symbolic links. On non-Unix systems, this + is an alias for os.path.abspath(). + +- operator.indexOf() (PySequence_Index() in the C API) now works with any + iterable object. + +- smtplib now supports various authentication and security features of + the SMTP protocol through the new login() and starttls() methods. + +- hmac: a new module implementing keyed hashing for message + authentication. + +- mimetypes now recognizes more extensions and file types. At the + same time, some mappings not sanctioned by IANA were removed. + +- The "compiler" package has been brought up to date to the state of + Python 2.2 bytecode generation. It has also been promoted from a + Tool to a standard library package. (Tools/compiler still exists as + a sample driver.) + +Build +----- + +- Large file support (LFS) is now automatic when the platform supports + it; no more manual configuration tweaks are needed. On Linux, at + least, it's possible to have a system whose C library supports large + files but whose kernel doesn't; in this case, large file support is + still enabled but doesn't do you any good unless you upgrade your + kernel or share your Python executable with another system whose + kernel has large file support. + +- The configure script now supplies plausible defaults in a + cross-compilation environment. This doesn't mean that the supplied + values are always correct, or that cross-compilation now works + flawlessly -- but it's a first step (and it shuts up most of + autoconf's warnings about AC_TRY_RUN). + +- The Unix build is now a bit less chatty, courtesy of the parser + generator. The build is completely silent (except for errors) when + using "make -s", thanks to a -q option to setup.py. + +C API +----- + +- The "structmember" API now supports some new flag bits to deny read + and/or write access to attributes in restricted execution mode. + +New platforms +------------- + +- Compaq's iPAQ handheld, running the "familiar" Linux distribution + (http://familiar.handhelds.org). + +Tests +----- + +- The "classic" standard tests, which work by comparing stdout to + an expected-output file under Lib/test/output/, no longer stop at + the first mismatch. Instead the test is run to completion, and a + variant of ndiff-style comparison is used to report all differences. + This is much easier to understand than the previous style of reporting. + +- The unittest-based standard tests now use regrtest's test_main() + convention, instead of running as a side-effect of merely being + imported. This allows these tests to be run in more natural and + flexible ways as unittests, outside the regrtest framework. + +- regrtest.py is much better integrated with unittest and doctest now, + especially in regard to reporting errors. + +Windows +------- + +- Large file support now also works for files > 4GB, on filesystems + that support it (NTFS under Windows 2000). See "What's New in + Python 2.2a3" for more detail. + + +What's New in Python 2.2a3? +=========================== + +*Release Date: 07-Sep-2001* + +Core +---- + +- Conversion of long to float now raises OverflowError if the long is too + big to represent as a C double. + +- The 3-argument builtin pow() no longer allows a third non-None argument + if either of the first two arguments is a float, or if both are of + integer types and the second argument is negative (in which latter case + the arguments are converted to float, so this is really the same + restriction). + +- The builtin dir() now returns more information, and sometimes much + more, generally naming all attributes of an object, and all attributes + reachable from the object via its class, and from its class's base + classes, and so on from them too. Example: in 2.2a2, dir([]) returned + an empty list. In 2.2a3, + + >>> dir([]) + ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', + '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__', + '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__', + '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__', + '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', + 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', + 'reverse', 'sort'] + + dir(module) continues to return only the module's attributes, though. + +- Overflowing operations on plain ints now return a long int rather + than raising OverflowError. This is a partial implementation of PEP + 237. You can use -Wdefault::OverflowWarning to enable a warning for + this situation, and -Werror::OverflowWarning to revert to the old + OverflowError exception. + +- A new command line option, -Q, is added to control run-time + warnings for the use of classic division. (See PEP 238.) Possible + values are -Qold, -Qwarn, -Qwarnall, and -Qnew. The default is + -Qold, meaning the / operator has its classic meaning and no + warnings are issued. Using -Qwarn issues a run-time warning about + all uses of classic division for int and long arguments; -Qwarnall + also warns about classic division for float and complex arguments + (for use with fixdiv.py). + [Note: the remainder of this item (preserved below) became + obsolete in 2.2c1 -- -Qnew has global effect in 2.2] :: + + Using -Qnew is questionable; it turns on new division by default, but + only in the __main__ module. You can usefully combine -Qwarn or + -Qwarnall and -Qnew: this gives the __main__ module new division, and + warns about classic division everywhere else. + +- Many built-in types can now be subclassed. This applies to int, + long, float, str, unicode, and tuple. (The types complex, list and + dictionary can also be subclassed; this was introduced earlier.) + Note that restrictions apply when subclassing immutable built-in + types: you can only affect the value of the instance by overloading + __new__. You can add mutable attributes, and the subclass instances + will have a __dict__ attribute, but you cannot change the "value" + (as implemented by the base class) of an immutable subclass instance + once it is created. + +- The dictionary constructor now takes an optional argument, a + mapping-like object, and initializes the dictionary from its + (key, value) pairs. + +- A new built-in type, super, has been added. This facilitates making + "cooperative super calls" in a multiple inheritance setting. For an + explanation, see http://www.python.org/2.2/descrintro.html#cooperation + +- A new built-in type, property, has been added. This enables the + creation of "properties". These are attributes implemented by + getter and setter functions (or only one of these for read-only or + write-only attributes), without the need to override __getattr__. + See http://www.python.org/2.2/descrintro.html#property + +- The syntax of floating-point and imaginary literals has been + liberalized, to allow leading zeroes. Examples of literals now + legal that were SyntaxErrors before: + + 00.0 0e3 0100j 07.5 00000000000000000008. + +- An old tokenizer bug allowed floating point literals with an incomplete + exponent, such as 1e and 3.1e-. Such literals now raise SyntaxError. + +Library +------- + +- telnetlib includes symbolic names for the options, and support for + setting an option negotiation callback. It also supports processing + of suboptions. + +- The new C standard no longer requires that math libraries set errno to + ERANGE on overflow. For platform libraries that exploit this new + freedom, Python's overflow-checking was wholly broken. A new overflow- + checking scheme attempts to repair that, but may not be reliable on all + platforms (C doesn't seem to provide anything both useful and portable + in this area anymore). + +- Asynchronous timeout actions are available through the new class + threading.Timer. + +- math.log and math.log10 now return sensible results for even huge + long arguments. For example, math.log10(10 ** 10000) ~= 10000.0. + +- A new function, imp.lock_held(), returns 1 when the import lock is + currently held. See the docs for the imp module. + +- pickle, cPickle and marshal on 32-bit platforms can now correctly read + dumps containing ints written on platforms where Python ints are 8 bytes. + When read on a box where Python ints are 4 bytes, such values are + converted to Python longs. + +- In restricted execution mode (using the rexec module), unmarshalling + code objects is no longer allowed. This plugs a security hole. + +- unittest.TestResult instances no longer store references to tracebacks + generated by test failures. This prevents unexpected dangling references + to objects that should be garbage collected between tests. + +Tools +----- + +- Tools/scripts/fixdiv.py has been added which can be used to fix + division operators as per PEP 238. + +Build +----- + +- If you are an adventurous person using Mac OS X you may want to look at + Mac/OSX. There is a Makefile there that will build Python as a real Mac + application, which can be used for experimenting with Carbon or Cocoa. + Discussion of this on pythonmac-sig, please. + +C API +----- + +- New function PyObject_Dir(obj), like Python __builtin__.dir(obj). + +- Note that PyLong_AsDouble can fail! This has always been true, but no + callers checked for it. It's more likely to fail now, because overflow + errors are properly detected now. The proper way to check:: + + double x = PyLong_AsDouble(some_long_object); + if (x == -1.0 && PyErr_Occurred()) { + /* The conversion failed. */ + } + +- The GC API has been changed. Extensions that use the old API will still + compile but will not participate in GC. To upgrade an extension + module: + + - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC + + - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and + PyObject_GC_Del to deallocate them + + - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini + to PyObject_GC_UnTrack + + - remove PyGC_HEAD_SIZE from object size calculations + + - remove calls to PyObject_AS_GC and PyObject_FROM_GC + +- Two new functions: PyString_FromFormat() and PyString_FromFormatV(). + These can be used safely to construct string objects from a + sprintf-style format string (similar to the format string supported + by PyErr_Format()). + +New platforms +------------- + +- Stephen Hansen contributed patches sufficient to get a clean compile + under Borland C (Windows), but he reports problems running it and ran + out of time to complete the port. Volunteers? Expect a MemoryError + when importing the types module; this is probably shallow, and + causing later failures too. + +Tests +----- + +Windows +------- + +- Large file support is now enabled on Win32 platforms as well as on + Win64. This means that, for example, you can use f.tell() and f.seek() + to manipulate files larger than 2 gigabytes (provided you have enough + disk space, and are using a Windows filesystem that supports large + partitions). Windows filesystem limits: FAT has a 2GB (gigabyte) + filesize limit, and large file support makes no difference there. + FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now. + NTFS has no practical limit on file size, and files of any size can be + used from Python now. + +- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC + points to command.com (patch from Brian Quinlan). + + +What's New in Python 2.2a2? +=========================== + +*Release Date: 22-Aug-2001* + +Build +----- + +- Tim Peters developed a brand new Windows installer using Wise 8.1, + generously donated to us by Wise Solutions. + +- configure supports a new option --enable-unicode, with the values + ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode + type and supporting code is completely removed from the interpreter. + +- A new configure option --enable-framework builds a Mac OS X framework, + which "make frameworkinstall" will install. This provides a starting + point for more mac-like functionality, join pythonmac-sig@python.org + if you are interested in helping. + +- The NeXT platform is no longer supported. + +- The 'new' module is now statically linked. + +Tools +----- + +- The new Tools/scripts/cleanfuture.py can be used to automatically + edit out obsolete future statements from Python source code. See + the module docstring for details. + +Tests +----- + +- regrtest.py now knows which tests are expected to be skipped on some + platforms, allowing to give clearer test result output. regrtest + also has optional --use/-u switch to run normally disabled tests + which require network access or consume significant disk resources. + +- Several new tests in the standard test suite, with special thanks to + Nick Mathewson. + +Core +---- + +- The floor division operator // has been added as outlined in PEP + 238. The / operator still provides classic division (and will until + Python 3.0) unless "from __future__ import division" is included, in + which case the / operator will provide true division. The operator + module provides truediv() and floordiv() functions. Augmented + assignment variants are included, as are the equivalent overloadable + methods and C API methods. See the PEP for a full discussion: + + +- Future statements are now effective in simulated interactive shells + (like IDLE). This should "just work" by magic, but read Michael + Hudson's "Future statements in simulated shells" PEP 264 for full + details: . + +- The type/class unification (PEP 252-253) was integrated into the + trunk and is not so tentative any more (the exact specification of + some features is still tentative). A lot of work has done on fixing + bugs and adding robustness and features (performance still has to + come a long way). + +- Warnings about a mismatch in the Python API during extension import + now use the Python warning framework (which makes it possible to + write filters for these warnings). + +- A function's __dict__ (aka func_dict) will now always be a + dictionary. It used to be possible to delete it or set it to None, + but now both actions raise TypeErrors. It is still legal to set it + to a dictionary object. Getting func.__dict__ before any attributes + have been assigned now returns an empty dictionary instead of None. + +- A new command line option, -E, was added which disables the use of + all environment variables, or at least those that are specifically + significant to Python. Usually those have a name starting with + "PYTHON". This was used to fix a problem where the tests fail if + the user happens to have PYTHONHOME or PYTHONPATH pointing to an + older distribution. + +Library +------- + +- New class Differ and new functions ndiff() and restore() in difflib.py. + These package the algorithms used by the popular Tools/scripts/ndiff.py, + for programmatic reuse. + +- New function xml.sax.saxutils.quoteattr(): Quote an XML attribute + value using the minimal quoting required for the value; more + reliable than using xml.sax.saxutils.escape() for attribute values. + +- Readline completion support for cmd.Cmd was added. + +- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings. + +- Added function threading.BoundedSemaphore() + +- Added Ka-Ping Yee's cgitb.py module. + +- The 'new' module now exposes the CO_xxx flags. + +- The gc module offers the get_referents function. + +New platforms +------------- + +C API +----- + +- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added + which provide a cross-platform implementations for the + relatively new snprintf()/vsnprintf() C lib APIs. In contrast to + the standard sprintf() and vsprintf() C lib APIs, these versions + apply bounds checking on the used buffer which enhances protection + against buffer overruns. + +- Unicode APIs now use name mangling to assure that mixing interpreters + and extensions using different Unicode widths is rendered next to + impossible. Trying to import an incompatible Unicode-aware extension + will result in an ImportError. Unicode extensions writers must make + sure to check the Unicode width compatibility in their extensions by + using at least one of the mangled Unicode APIs in the extension. + +- Two new flags METH_NOARGS and METH_O are available in method definition + tables to simplify implementation of methods with no arguments and a + single untyped argument. Calling such methods is more efficient than + calling corresponding METH_VARARGS methods. METH_OLDARGS is now + deprecated. + +Windows +------- + +- "import module" now compiles module.pyw if it exists and nothing else + relevant is found. + + +What's New in Python 2.2a1? +=========================== + +*Release date: 18-Jul-2001* + +Core +---- + +- TENTATIVELY, a large amount of code implementing much of what's + described in PEP 252 (Making Types Look More Like Classes) and PEP + 253 (Subtyping Built-in Types) was added. This will be released + with Python 2.2a1. Documentation will be provided separately + through http://www.python.org/2.2/. The purpose of releasing this + with Python 2.2a1 is to test backwards compatibility. It is + possible, though not likely, that a decision is made not to release + this code as part of 2.2 final, if any serious backwards + incompatibilities are found during alpha testing that cannot be + repaired. + +- Generators were added; this is a new way to create an iterator (see + below) using what looks like a simple function containing one or + more 'yield' statements. See PEP 255. Since this adds a new + keyword to the language, this feature must be enabled by including a + future statement: "from __future__ import generators" (see PEP 236). + Generators will become a standard feature in a future release + (probably 2.3). Without this future statement, 'yield' remains an + ordinary identifier, but a warning is issued each time it is used. + (These warnings currently don't conform to the warnings framework of + PEP 230; we intend to fix this in 2.2a2.) + +- The UTF-16 codec was modified to be more RFC compliant. It will now + only remove BOM characters at the start of the string and then + only if running in native mode (UTF-16-LE and -BE won't remove a + leading BMO character). + +- Strings now have a new method .decode() to complement the already + existing .encode() method. These two methods provide direct access + to the corresponding decoders and encoders of the registered codecs. + + To enhance the usability of the .encode() method, the special + casing of Unicode object return values was dropped (Unicode objects + were auto-magically converted to string using the default encoding). + + Both methods will now return whatever the codec in charge of the + requested encoding returns as object, e.g. Unicode codecs will + return Unicode objects when decoding is requested ("äöü".decode("latin-1") + will return u"äöü"). This enables codec writer to create codecs + for various simple to use conversions. + + New codecs were added to demonstrate these new features (the .encode() + and .decode() columns indicate the type of the returned objects): + + +---------+-----------+-----------+-----------------------------+ + |Name | .encode() | .decode() | Description | + +=========+===========+===========+=============================+ + |uu | string | string | UU codec (e.g. for email) | + +---------+-----------+-----------+-----------------------------+ + |base64 | string | string | base64 codec | + +---------+-----------+-----------+-----------------------------+ + |quopri | string | string | quoted-printable codec | + +---------+-----------+-----------+-----------------------------+ + |zlib | string | string | zlib compression | + +---------+-----------+-----------+-----------------------------+ + |hex | string | string | 2-byte hex codec | + +---------+-----------+-----------+-----------------------------+ + |rot-13 | string | Unicode | ROT-13 Unicode charmap codec| + +---------+-----------+-----------+-----------------------------+ + +- Some operating systems now support the concept of a default Unicode + encoding for file system operations. Notably, Windows supports 'mbcs' + as the default. The Macintosh will also adopt this concept in the medium + term, although the default encoding for that platform will be other than + 'mbcs'. + + On operating system that support non-ASCII filenames, it is common for + functions that return filenames (such as os.listdir()) to return Python + string objects pre-encoded using the default file system encoding for + the platform. As this encoding is likely to be different from Python's + default encoding, converting this name to a Unicode object before passing + it back to the Operating System would result in a Unicode error, as Python + would attempt to use its default encoding (generally ASCII) rather than + the default encoding for the file system. + + In general, this change simply removes surprises when working with + Unicode and the file system, making these operations work as you expect, + increasing the transparency of Unicode objects in this context. + See [????] for more details, including examples. + +- Float (and complex) literals in source code were evaluated to full + precision only when running from a .py file; the same code loaded from a + .pyc (or .pyo) file could suffer numeric differences starting at about the + 12th significant decimal digit. For example, on a machine with IEEE-754 + floating arithmetic, + + x = 9007199254740992.0 + print long(x) + + printed 9007199254740992 if run directly from .py, but 9007199254740000 + if from a compiled (.pyc or .pyo) file. This was due to marshal using + str(float) instead of repr(float) when building code objects. marshal + now uses repr(float) instead, which should reproduce floats to full + machine precision (assuming the platform C float<->string I/O conversion + functions are of good quality). + + This may cause floating-point results to change in some cases, and + usually for the better, but may also cause numerically unstable + algorithms to break. + +- The implementation of dicts suffers fewer collisions, which has speed + benefits. However, the order in which dict entries appear in dict.keys(), + dict.values() and dict.items() may differ from previous releases for a + given dict. Nothing is defined about this order, so no program should + rely on it. Nevertheless, it's easy to write test cases that rely on the + order by accident, typically because of printing the str() or repr() of a + dict to an "expected results" file. See Lib/test/test_support.py's new + sortdict(dict) function for a simple way to display a dict in sorted + order. + +- Many other small changes to dicts were made, resulting in faster + operation along the most common code paths. + +- Dictionary objects now support the "in" operator: "x in dict" means + the same as dict.has_key(x). + +- The update() method of dictionaries now accepts generic mapping + objects. Specifically the argument object must support the .keys() + and __getitem__() methods. This allows you to say, for example, + {}.update(UserDict()) + +- Iterators were added; this is a generalized way of providing values + to a for loop. See PEP 234. There's a new built-in function iter() + to return an iterator. There's a new protocol to get the next value + from an iterator using the next() method (in Python) or the + tp_iternext slot (in C). There's a new protocol to get iterators + using the __iter__() method (in Python) or the tp_iter slot (in C). + Iterating (i.e. a for loop) over a dictionary generates its keys. + Iterating over a file generates its lines. + +- The following functions were generalized to work nicely with iterator + arguments:: + + map(), filter(), reduce(), zip() + list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API) + max(), min() + join() method of strings + extend() method of lists + 'x in y' and 'x not in y' (PySequence_Contains() in C API) + operator.countOf() (PySequence_Count() in C API) + right-hand side of assignment statements with multiple targets, such as :: + x, y, z = some_iterable_object_returning_exactly_3_values + +- Accessing module attributes is significantly faster (for example, + random.random or os.path or yourPythonModule.yourAttribute). + +- Comparing dictionary objects via == and != is faster, and now works even + if the keys and values don't support comparisons other than ==. + +- Comparing dictionaries in ways other than == and != is slower: there were + insecurities in the dict comparison implementation that could cause Python + to crash if the element comparison routines for the dict keys and/or + values mutated the dicts. Making the code bulletproof slowed it down. + +- Collisions in dicts are resolved via a new approach, which can help + dramatically in bad cases. For example, looking up every key in a dict + d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x + faster now. Thanks to Christian Tismer for pointing out the cause and + the nature of an effective cure (last December! better late than never). + +- repr() is much faster for large containers (dict, list, tuple). + + +Library +------- + +- The constants ascii_letters, ascii_lowercase. and ascii_uppercase + were added to the string module. These a locale-independent + constants, unlike letters, lowercase, and uppercase. These are now + use in appropriate locations in the standard library. + +- The flags used in dlopen calls can now be configured using + sys.setdlopenflags and queried using sys.getdlopenflags. + +- Fredrik Lundh's xmlrpclib is now a standard library module. This + provides full client-side XML-RPC support. In addition, + Demo/xmlrpc/ contains two server frameworks (one SocketServer-based, + one asyncore-based). Thanks to Eric Raymond for the documentation. + +- The xrange() object is simplified: it no longer supports slicing, + repetition, comparisons, efficient 'in' checking, the tolist() + method, or the start, stop and step attributes. See PEP 260. + +- A new function fnmatch.filter to filter lists of file names was added. + +- calendar.py uses month and day names based on the current locale. + +- strop is now *really* obsolete (this was announced before with 1.6), + and issues DeprecationWarning when used (except for the four items + that are still imported into string.py). + +- Cookie.py now sorts key+value pairs by key in output strings. + +- pprint.isrecursive(object) didn't correctly identify recursive objects. + Now it does. + +- pprint functions now much faster for large containers (tuple, list, dict). + +- New 'q' and 'Q' format codes in the struct module, corresponding to C + types "long long" and "unsigned long long" (on Windows, __int64). In + native mode, these can be used only when the platform C compiler supports + these types (when HAVE_LONG_LONG is #define'd by the Python config + process), and then they inherit the sizes and alignments of the C types. + In standard mode, 'q' and 'Q' are supported on all platforms, and are + 8-byte integral types. + +- The site module installs a new built-in function 'help' that invokes + pydoc.help. It must be invoked as 'help()'; when invoked as 'help', + it displays a message reminding the user to use 'help()' or + 'help(object)'. + +Tests +----- + +- New test_mutants.py runs dict comparisons where the key and value + comparison operators mutate the dicts randomly during comparison. This + rapidly causes Python to crash under earlier releases (not for the faint + of heart: it can also cause Win9x to freeze or reboot!). + +- New test_pprint.py verifies that pprint.isrecursive() and + pprint.isreadable() return sensible results. Also verifies that simple + cases produce correct output. + +C API +----- + +- Removed the unused last_is_sticky argument from the internal + _PyTuple_Resize(). If this affects you, you were cheating. + What's New in Python 2.1 (final)? ================================= diff --git a/Misc/NEWS b/Misc/NEWS index 8044c35d8642..ebe198cce399 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -284,7 +284,7 @@ Mac --- - Bundlebuilder now inherits default values in the right way. It was - previously possible for app bundles to et a type of "BNDL" instead + previously possible for app bundles to get a type of "BNDL" instead of "APPL." Other improvements include, a --build-id option to specify the CFBundleIdentifier and using the --python option to set the executable in the bundle. @@ -2367,1436 +2367,6 @@ Mac other platforms. If you really need sourcefiles with Mac characters in them you can change this in site.py. - -What's New in Python 2.2 final? -=============================== - -*Release date: 21-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pickle.py, cPickle: allow pickling instances of new-style classes - with a custom metaclass. - -Core and builtins ------------------ - -- weakref proxy object: when comparing, unwrap both arguments if both - are proxies. - -Extension modules ------------------ - -- binascii.b2a_base64(): fix a potential buffer overrun when encoding - very short strings. - -- cPickle: the obscure "fast" mode was suspected of causing stack - overflows on the Mac. Hopefully fixed this by setting the recursion - limit much smaller. If the limit is too low (it only affects - performance), you can change it by defining PY_CPICKLE_FAST_LIMIT - when compiling cPickle.c (or in pyconfig.h). - -Library -------- - -- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at - close or delete time). - -- rfc822.py: fixed a bug where the address '<>' was converted to None - instead of an empty string (also fixes the email.Utils module). - -- xmlrpclib.py: version 1.0.0; uses precision for doubles. - -- test suite: the pickle and cPickle tests were not executing any code - when run from the standard regression test. - -Tools/Demos ------------ - -Build ------ - -C API ------ - -New platforms -------------- - -Tests ------ - -Windows -------- - -- distutils package: fixed broken Windows installers (bdist_wininst). - -- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper - instances are deleted at process exit time. - -- socket.py: prevent mysterious warnings when socket instances are - deleted at process exit time. - -- posixmodule.c: fix a Windows crash with stat() of a filename ending - in backslash. - -Mac ----- - -- The Carbon toolbox modules have been upgraded to Universal Headers - 3.4, and experimental CoreGraphics and CarbonEvents modules have - been added. All only for framework-enabled MacOSX. - - -What's New in Python 2.2c1? -=========================== - -*Release date: 14-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Guido's tutorial introduction to the new type/class features has - been extensively updated. See - - http://www.python.org/2.2/descrintro.html - - That remains the primary documentation in this area. - -- Fixed a leak: instance variables declared with __slots__ were never - deleted! - -- The "delete attribute" method of descriptor objects is called - __delete__, not __del__. In previous releases, it was mistakenly - called __del__, which created an unfortunate overloading condition - with finalizers. (The "get attribute" and "set attribute" methods - are still called __get__ and __set__, respectively.) - -- Some subtle issues with the super built-in were fixed: - - (a) When super itself is subclassed, its __get__ method would still - return an instance of the base class (i.e., of super). - - (b) super(C, C()).__class__ would return C rather than super. This - is confusing. To fix this, I decided to change the semantics of - super so that it only applies to code attributes, not to data - attributes. After all, overriding data attributes is not - supported anyway. - - (c) The __get__ method didn't check whether the argument was an - instance of the type used in creation of the super instance. - -- Previously, hash() of an instance of a subclass of a mutable type - (list or dictionary) would return some value, rather than raising - TypeError. This has been fixed. Also, directly calling - dict.__hash__ and list.__hash__ now raises the same TypeError - (previously, these were the same as object.__hash__). - -- New-style objects now support deleting their __dict__. This is for - all intents and purposes equivalent to assigning a brand new empty - dictionary, but saves space if the object is not used further. - -Core and builtins ------------------ - -- -Qnew now works as documented in PEP 238: when -Qnew is passed on - the command line, all occurrences of "/" use true division instead - of classic division. See the PEP for details. Note that "all" - means all instances in library and 3rd-party modules, as well as in - your own code. As the PEP says, -Qnew is intended for use only in - educational environments with control over the libraries in use. - Note that test_coercion.py in the standard Python test suite fails - under -Qnew; this is expected, and won't be repaired until true - division becomes the default (in the meantime, test_coercion is - testing the current rules). - -- complex() now only allows the first argument to be a string - argument, and raises TypeError if either the second arg is a string - or if the second arg is specified when the first is a string. - -Extension modules ------------------ - -- gc.get_referents was renamed to gc.get_referrers. - -Library -------- - -- Functions in the os.spawn() family now release the global interpreter - lock around calling the platform spawn. They should always have done - this, but did not before 2.2c1. Multithreaded programs calling - an os.spawn function with P_WAIT will no longer block all Python threads - until the spawned program completes. It's possible that some programs - relies on blocking, although more likely by accident than by design. - -- webbrowser defaults to netscape.exe on OS/2 now. - -- Tix.ResizeHandle exposes detach_widget, hide, and show. - -- The charset alias windows_1252 has been added. - -- types.StringTypes is a tuple containing the defined string types; - usually this will be (str, unicode), but if Python was compiled - without Unicode support it will be just (str,). - -- The pulldom and minidom modules were synchronized to PyXML. - -Tools/Demos ------------ - -- A new script called Tools/scripts/google.py was added, which fires - off a search on Google. - -Build ------ - -- Note that release builds of Python should arrange to define the - preprocessor symbol NDEBUG on the command line (or equivalent). - In the 2.2 pre-release series we tried to define this by magic in - Python.h instead, but it proved to cause problems for extension - authors. The Unix, Windows and Mac builds now all define NDEBUG in - release builds via cmdline (or equivalent) instead. Ports to - other platforms should do likewise. - -- It is no longer necessary to use --with-suffix when building on a - case-insensitive file system (such as Mac OS X HFS+). In the build - directory an extension is used, but not in the installed python. - -C API ------ - -- New function PyDict_MergeFromSeq2() exposes the builtin dict - constructor's logic for updating a dictionary from an iterable object - producing key-value pairs. - -- PyArg_ParseTupleAndKeywords() requires that the number of entries in - the keyword list equal the number of argument specifiers. This - wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even - dump core in some bad cases. This has been repaired. As a result, - PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that - previously went unchallenged. - -New platforms -------------- - -Tests ------ - -Windows -------- - -Mac ----- - -- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin", - without any trailing digits. - -- Changed logic for finding python home in Mac OS X framework Pythons. - Now sys.executable points to the executable again, in stead of to - the shared library. The latter is used only for locating the python - home. - - -What's New in Python 2.2b2? -=========================== - -*Release date: 16-Nov-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Multiple inheritance mixing new-style and classic classes in the - list of base classes is now allowed, so this works now: - - class Classic: pass - class Mixed(Classic, object): pass - - The MRO (method resolution order) for each base class is respected - according to its kind, but the MRO for the derived class is computed - using new-style MRO rules if any base class is a new-style class. - This needs to be documented. - -- The new builtin dictionary() constructor, and dictionary type, have - been renamed to dict. This reflects a decade of common usage. - -- dict() now accepts an iterable object producing 2-sequences. For - example, dict(d.items()) == d for any dictionary d. The argument, - and the elements of the argument, can be any iterable objects. - -- New-style classes can now have a __del__ method, which is called - when the instance is deleted (just like for classic classes). - -- Assignment to object.__dict__ is now possible, for objects that are - instances of new-style classes that have a __dict__ (unless the base - class forbids it). - -- Methods of built-in types now properly check for keyword arguments - (formerly these were silently ignored). The only built-in methods - that take keyword arguments are __call__, __init__ and __new__. - -- The socket function has been converted to a type; see below. - -Core and builtins ------------------ - -- Assignment to __debug__ raises SyntaxError at compile-time. This - was promised when 2.1c1 was released as "What's New in Python 2.1c1" - (see below) says. - -- Clarified the error messages for unsupported operands to an operator - (like 1 + ''). - -Extension modules ------------------ - -- mmap has a new keyword argument, "access", allowing a uniform way for - both Windows and Unix users to create read-only, write-through and - copy-on-write memory mappings. This was previously possible only on - Unix. A new keyword argument was required to support this in a - uniform way because the mmap() signatures had diverged across - platforms. Thanks to Jay T Miller for repairing this! - -- By default, the gc.garbage list now contains only those instances in - unreachable cycles that have __del__ methods; in 2.1 it contained all - instances in unreachable cycles. "Instances" here has been generalized - to include instances of both new-style and old-style classes. - -- The socket module defines a new method for socket objects, - sendall(). This is like send() but may make multiple calls to - send() until all data has been sent. Also, the socket function has - been converted to a subclassable type, like list and tuple (etc.) - before it; socket and SocketType are now the same thing. - -- Various bugfixes to the curses module. There is now a test suite - for the curses module (you have to run it manually). - -- binascii.b2a_base64 no longer places an arbitrary restriction of 57 - bytes on its input. - -Library -------- - -- tkFileDialog exposes a Directory class and askdirectory - convenience function. - -- Symbolic group names in regular expressions must be unique. For - example, the regexp r'(?P)(?P)' is not allowed, because a - single name can't mean both "group 1" and "group 2" simultaneously. - Python 2.2 detects this error at regexp compilation time; - previously, the error went undetected, and results were - unpredictable. Also in sre, the pattern.split(), pattern.sub(), and - pattern.subn() methods have been rewritten in C. Also, an - experimental function/method finditer() has been added, which works - like findall() but returns an iterator. - -- Tix exposes more commands through the classes DirSelectBox, - DirSelectDialog, ListNoteBook, Meter, CheckList, and the - methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, - tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. - -- Traceback objects are now scanned by cyclic garbage collection, so - cycles created by casual use of sys.exc_info() no longer cause - permanent memory leaks (provided garbage collection is enabled). - -- os.extsep -- a new variable needed by the RISCOS support. It is the - separator used by extensions, and is '.' on all platforms except - RISCOS, where it is '/'. There is no need to use this variable - unless you have a masochistic desire to port your code to RISCOS. - -- mimetypes.py has optional support for non-standard, but commonly - found types. guess_type() and guess_extension() now accept an - optional 'strict' flag, defaulting to true, which controls whether - recognize non-standard types or not. A few non-standard types we - know about have been added. Also, when run as a script, there are - new -l and -e options. - -- statcache is now deprecated. - -- email.Utils.formatdate() now produces the preferred RFC 2822 style - dates with numeric timezones (it used to produce obsolete dates - hard coded to "GMT" timezone). An optional 'localtime' flag is - added to produce dates in the local timezone, with daylight savings - time properly taken into account. - -- In pickle and cPickle, instead of masking errors in load() by - transforming them into SystemError, we let the original exception - propagate out. Also, implement support for __safe_for_unpickling__ - in pickle, as it already was supported in cPickle. - -Tools/Demos ------------ - -Build ------ - -- The dbm module is built using libdb1 if available. The bsddb module - is built with libdb3 if available. - -- Misc/Makefile.pre.in has been removed by BDFL pronouncement. - -C API ------ - -- New function PySequence_Fast_GET_SIZE() returns the size of a non- - NULL result from PySequence_Fast(), more quickly than calling - PySequence_Size(). - -- New argument unpacking function PyArg_UnpackTuple() added. - -- New functions PyObject_CallFunctionObjArgs() and - PyObject_CallMethodObjArgs() have been added to make it more - convenient and efficient to call functions and methods from C. - -- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's - possible that this will propagate errors it didn't before. - -- New function PyObject_CheckReadBuffer(), which returns true if its - argument supports the single-segment readable buffer interface. - -New platforms -------------- - -- We've finally confirmed that this release builds on HP-UX 11.00, - *with* threads, and passes the test suite. - -- Thanks to a series of patches from Michael Muller, Python may build - again under OS/2 Visual Age C++. - -- Updated RISCOS port by Dietmar Schwertberger. - -Tests ------ - -- Added a test script for the curses module. It isn't run automatically; - regrtest.py must be run with '-u curses' to enable it. - -Windows -------- - -Mac ----- - -- PythonScript has been moved to unsupported and is slated to be - removed completely in the next release. - -- It should now be possible to build applets that work on both OS9 and - OSX. - -- The core is now linked with CoreServices not Carbon; as a side - result, default 8bit encoding on OSX is now ASCII. - -- Python should now build on OSX 10.1.1 - - -What's New in Python 2.2b1? -=========================== - -*Release date: 19-Oct-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- New-style classes are now always dynamic (except for built-in and - extension types). There is no longer a performance penalty, and I - no longer see another reason to keep this baggage around. One relic - remains: the __dict__ of a new-style class is a read-only proxy; you - must set the class's attribute to modify it. As a consequence, the - __defined__ attribute of new-style types no longer exists, for lack - of need: there is once again only one __dict__ (although in the - future a __cache__ may be resurrected with a similar function, if I - can prove that it actually speeds things up). - -- C.__doc__ now works as expected for new-style classes (in 2.2a4 it - always returned None, even when there was a class docstring). - -- doctest now finds and runs docstrings attached to new-style classes, - class methods, static methods, and properties. - -Core and builtins ------------------ - -- A very subtle syntactical pitfall in list comprehensions was fixed. - For example: [a+b for a in 'abc', for b in 'def']. The comma in - this example is a mistake. Previously, this would silently let 'a' - iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce', - 'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be', - 'bf', 'cd', 'ce', 'cf']. Now, this is flagged as a syntax error. - Note that [a for a in ] is a convoluted way to say - [] anyway, so it's not like any expressiveness is lost. - -- getattr(obj, name, default) now only catches AttributeError, as - documented, rather than returning the default value for all - exceptions (which could mask bugs in a __getattr__ hook, for - example). - -- Weak reference objects are now part of the core and offer a C API. - A bug which could allow a core dump when binary operations involved - proxy reference has been fixed. weakref.ReferenceError is now a - built-in exception. - -- unicode(obj) now behaves more like str(obj), accepting arbitrary - objects, and calling a __unicode__ method if it exists. - unicode(obj, encoding) and unicode(obj, encoding, errors) still - require an 8-bit string or character buffer argument. - -- isinstance() now allows any object as the first argument and a - class, a type or something with a __bases__ tuple attribute for the - second argument. The second argument may also be a tuple of a - class, type, or something with __bases__, in which case isinstance() - will return true if the first argument is an instance of any of the - things contained in the second argument tuple. E.g. - - isinstance(x, (A, B)) - - returns true if x is an instance of A or B. - -Extension modules ------------------ - -- thread.start_new_thread() now returns the thread ID (previously None). - -- binascii has now two quopri support functions, a2b_qp and b2a_qp. - -- readline now supports setting the startup_hook and the - pre_event_hook, and adds the add_history() function. - -- os and posix supports chroot(), setgroups() and unsetenv() where - available. The stat(), fstat(), statvfs() and fstatvfs() functions - now return "pseudo-sequences" -- the various fields can now be - accessed as attributes (e.g. os.stat("/").st_mtime) but for - backwards compatibility they also behave as a fixed-length sequence. - Some platform-specific fields (e.g. st_rdev) are only accessible as - attributes. - -- time: localtime(), gmtime() and strptime() now return a - pseudo-sequence similar to the os.stat() return value, with - attributes like tm_year etc. - -- Decompression objects in the zlib module now accept an optional - second parameter to decompress() that specifies the maximum amount - of memory to use for the uncompressed data. - -- optional SSL support in the socket module now exports OpenSSL - functions RAND_add(), RAND_egd(), and RAND_status(). These calls - are useful on platforms like Solaris where OpenSSL does not - automatically seed its PRNG. Also, the keyfile and certfile - arguments to socket.ssl() are now optional. - -- posixmodule (and by extension, the os module on POSIX platforms) now - exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW. - -Library -------- - -- doctest now excludes functions and classes not defined by the module - being tested, thanks to Tim Hochberg. - -- HotShot, a new profiler implemented using a C-based callback, has - been added. This substantially reduces the overhead of profiling, - but it is still quite preliminary. Support modules and - documentation will be added in upcoming releases (before 2.2 final). - -- profile now produces correct output in situations where an exception - raised in Python is cleared by C code (e.g. hasattr()). This used - to cause wrong output, including spurious claims of recursive - functions and attribution of time spent to the wrong function. - - The code and documentation for the derived OldProfile and HotProfile - profiling classes was removed. The code hasn't worked for years (if - you tried to use them, they raised exceptions). OldProfile - intended to reproduce the behavior of the profiler Python used more - than 7 years ago, and isn't interesting anymore. HotProfile intended - to provide a faster profiler (but producing less information), and - that's a worthy goal we intend to meet via a different approach (but - without losing information). - -- Profile.calibrate() has a new implementation that should deliver - a much better system-specific calibration constant. The constant can - now be specified in an instance constructor, or as a Profile class or - instance variable, instead of by editing profile.py's source code. - Calibration must still be done manually (see the docs for the profile - module). - - Note that Profile.calibrate() must be overridden by subclasses. - Improving the accuracy required exploiting detailed knowledge of - profiler internals; the earlier method abstracted away the details - and measured a simplified model instead, but consequently computed - a constant too small by a factor of 2 on some modern machines. - -- quopri's encode and decode methods take an optional header parameter, - which indicates whether output is intended for the header 'Q' - encoding. - -- The SocketServer.ThreadingMixIn class now closes the request after - finish_request() returns. (Not when it errors out though.) - -- The nntplib module's NNTP.body() method has grown a 'file' argument - to allow saving the message body to a file. - -- The email package has added a class email.Parser.HeaderParser which - only parses headers and does not recurse into the message's body. - Also, the module/class MIMEAudio has been added for representing - audio data (contributed by Anthony Baxter). - -- ftplib should be able to handle files > 2GB. - -- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO, - ON, and OFF. - -- xml.dom.minidom NodeList objects now support the length attribute - and item() method as required by the DOM specifications. - -Tools/Demos ------------ - -- Demo/dns was removed. It no longer serves any purpose; a package - derived from it is now maintained by Anthony Baxter, see - http://PyDNS.SourceForge.net. - -- The freeze tool has been made more robust, and two new options have - been added: -X and -E. - -Build ------ - -- configure will use CXX in LINKCC if CXX is used to build main() and - the system requires to link a C++ main using the C++ compiler. - -C API ------ - -- The documentation for the tp_compare slot is updated to require that - the return value must be -1, 0, 1; an arbitrary number <0 or >0 is - not correct. This is not yet enforced but will be enforced in - Python 2.3; even later, we may use -2 to indicate errors and +2 for - "NotImplemented". Right now, -1 should be used for an error return. - -- PyLong_AsLongLong() now accepts int (as well as long) arguments. - Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well - as long) arguments. - -- PyThread_start_new_thread() now returns a long int giving the thread - ID, if one can be calculated; it returns -1 for error, 0 if no - thread ID is calculated (this is an incompatible change, but only - the thread module used this API). This code has only really been - tested on Linux and Windows; other platforms please beware (and - report any bugs or strange behavior). - -- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as - input. - -New platforms -------------- - -Tests ------ - -Windows -------- - -- Installer: If you install IDLE, and don't disable file-extension - registration, a new "Edit with IDLE" context (right-click) menu entry - is created for .py and .pyw files. - -- The signal module now supports SIGBREAK on Windows, thanks to Steven - Scott. Note that SIGBREAK is unique to Windows. The default SIGBREAK - action remains to call Win32 ExitProcess(). This can be changed via - signal.signal(). For example:: - - # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C - # (SIGINT) behavior. - import signal - signal.signal(signal.SIGBREAK, signal.default_int_handler) - - try: - while 1: - pass - except KeyboardInterrupt: - # We get here on Ctrl+C or Ctrl+Break now; if we had not changed - # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the - # program without the possibility for any Python-level cleanup). - print "Clean exit" - - -What's New in Python 2.2a4? -=========================== - -*Release date: 28-Sep-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pydoc and inspect are now aware of new-style classes; - e.g. help(list) at the interactive prompt now shows proper - documentation for all operations on list objects. - -- Applications using Jim Fulton's ExtensionClass module can now safely - be used with Python 2.2. In particular, Zope 2.4.1 now works with - Python 2.2 (as well as with Python 2.1.1). The Demo/metaclass - examples also work again. It is hoped that Gtk and Boost also work - with 2.2a4 and beyond. (If you can confirm this, please write - webmaster@python.org; if there are still problems, please open a bug - report on SourceForge.) - -- property() now takes 4 keyword arguments: fget, fset, fdel and doc. - These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__' - in the constructed property object. fget, fset and fdel weren't - discoverable from Python in 2.2a3. __doc__ is new, and allows to - associate a docstring with a property. - -- Comparison overloading is now more completely implemented. For - example, a str subclass instance can properly be compared to a str - instance, and it can properly overload comparison. Ditto for most - other built-in object types. - -- The repr() of new-style classes has changed; instead of a new-style class is now rendered as , - *except* for built-in types, which are still rendered as (to avoid upsetting existing code that might parse or - otherwise rely on repr() of certain type objects). - -- The repr() of new-style objects is now always ; - previously, it was sometimes . - -- For new-style classes, what was previously called __getattr__ is now - called __getattribute__. This method, if defined, is called for - *every* attribute access. A new __getattr__ hook more similar to the - one in classic classes is defined which is called only if regular - attribute access raises AttributeError; to catch *all* attribute - access, you can use __getattribute__ (for new-style classes). If - both are defined, __getattribute__ is called first, and if it raises - AttributeError, __getattr__ is called. - -- The __class__ attribute of new-style objects can be assigned to. - The new class must have the same C-level object layout as the old - class. - -- The builtin file type can be subclassed now. In the usual pattern, - "file" is the name of the builtin type, and file() is a new builtin - constructor, with the same signature as the builtin open() function. - file() is now the preferred way to open a file. - -- Previously, __new__ would only see sequential arguments passed to - the type in a constructor call; __init__ would see both sequential - and keyword arguments. This made no sense whatsoever any more, so - now both __new__ and __init__ see all arguments. - -- Previously, hash() applied to an instance of a subclass of str or - unicode always returned 0. This has been repaired. - -- Previously, an operation on an instance of a subclass of an - immutable type (int, long, float, complex, tuple, str, unicode), - where the subtype didn't override the operation (and so the - operation was handled by the builtin type), could return that - instance instead a value of the base type. For example, if s was of - a str subclass type, s[:] returned s as-is. Now it returns a str - with the same value as s. - -- Provisional support for pickling new-style objects has been added. - -Core ----- - -- file.writelines() now accepts any iterable object producing strings. - -- PyUnicode_FromEncodedObject() now works very much like - PyObject_Str(obj) in that it tries to use __str__/tp_str - on the object if the object is not a string or buffer. This - makes unicode() behave like str() when applied to non-string/buffer - objects. - -- PyFile_WriteObject now passes Unicode objects to the file's write - method. As a result, all file-like objects which may be the target - of a print statement must support Unicode objects, i.e. they must - at least convert them into ASCII strings. - -- Thread scheduling on Solaris should be improved; it is no longer - necessary to insert a small sleep at the start of a thread in order - to let other runnable threads be scheduled. - -Library -------- - -- StringIO.StringIO instances and cStringIO.StringIO instances support - read character buffer compatible objects for their .write() methods. - These objects are converted to strings and then handled as such - by the instances. - -- The "email" package has been added. This is basically a port of the - mimelib package with API changes - and some implementations updated to use iterators and generators. - -- difflib.ndiff() and difflib.Differ.compare() are generators now. This - restores the ability of Tools/scripts/ndiff.py to start producing output - before the entire comparison is complete. - -- StringIO.StringIO instances and cStringIO.StringIO instances support - iteration just like file objects (i.e. their .readline() method is - called for each iteration until it returns an empty string). - -- The codecs module has grown four new helper APIs to access - builtin codecs: getencoder(), getdecoder(), getreader(), - getwriter(). - -- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer) - simplifies writing XML RPC servers. - -- os.path.realpath(): a new function that returns the absolute pathname - after interpretation of symbolic links. On non-Unix systems, this - is an alias for os.path.abspath(). - -- operator.indexOf() (PySequence_Index() in the C API) now works with any - iterable object. - -- smtplib now supports various authentication and security features of - the SMTP protocol through the new login() and starttls() methods. - -- hmac: a new module implementing keyed hashing for message - authentication. - -- mimetypes now recognizes more extensions and file types. At the - same time, some mappings not sanctioned by IANA were removed. - -- The "compiler" package has been brought up to date to the state of - Python 2.2 bytecode generation. It has also been promoted from a - Tool to a standard library package. (Tools/compiler still exists as - a sample driver.) - -Build ------ - -- Large file support (LFS) is now automatic when the platform supports - it; no more manual configuration tweaks are needed. On Linux, at - least, it's possible to have a system whose C library supports large - files but whose kernel doesn't; in this case, large file support is - still enabled but doesn't do you any good unless you upgrade your - kernel or share your Python executable with another system whose - kernel has large file support. - -- The configure script now supplies plausible defaults in a - cross-compilation environment. This doesn't mean that the supplied - values are always correct, or that cross-compilation now works - flawlessly -- but it's a first step (and it shuts up most of - autoconf's warnings about AC_TRY_RUN). - -- The Unix build is now a bit less chatty, courtesy of the parser - generator. The build is completely silent (except for errors) when - using "make -s", thanks to a -q option to setup.py. - -C API ------ - -- The "structmember" API now supports some new flag bits to deny read - and/or write access to attributes in restricted execution mode. - -New platforms -------------- - -- Compaq's iPAQ handheld, running the "familiar" Linux distribution - (http://familiar.handhelds.org). - -Tests ------ - -- The "classic" standard tests, which work by comparing stdout to - an expected-output file under Lib/test/output/, no longer stop at - the first mismatch. Instead the test is run to completion, and a - variant of ndiff-style comparison is used to report all differences. - This is much easier to understand than the previous style of reporting. - -- The unittest-based standard tests now use regrtest's test_main() - convention, instead of running as a side-effect of merely being - imported. This allows these tests to be run in more natural and - flexible ways as unittests, outside the regrtest framework. - -- regrtest.py is much better integrated with unittest and doctest now, - especially in regard to reporting errors. - -Windows -------- - -- Large file support now also works for files > 4GB, on filesystems - that support it (NTFS under Windows 2000). See "What's New in - Python 2.2a3" for more detail. - - -What's New in Python 2.2a3? -=========================== - -*Release Date: 07-Sep-2001* - -Core ----- - -- Conversion of long to float now raises OverflowError if the long is too - big to represent as a C double. - -- The 3-argument builtin pow() no longer allows a third non-None argument - if either of the first two arguments is a float, or if both are of - integer types and the second argument is negative (in which latter case - the arguments are converted to float, so this is really the same - restriction). - -- The builtin dir() now returns more information, and sometimes much - more, generally naming all attributes of an object, and all attributes - reachable from the object via its class, and from its class's base - classes, and so on from them too. Example: in 2.2a2, dir([]) returned - an empty list. In 2.2a3, - - >>> dir([]) - ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', - '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__', - '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__', - '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__', - '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', - 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', - 'reverse', 'sort'] - - dir(module) continues to return only the module's attributes, though. - -- Overflowing operations on plain ints now return a long int rather - than raising OverflowError. This is a partial implementation of PEP - 237. You can use -Wdefault::OverflowWarning to enable a warning for - this situation, and -Werror::OverflowWarning to revert to the old - OverflowError exception. - -- A new command line option, -Q, is added to control run-time - warnings for the use of classic division. (See PEP 238.) Possible - values are -Qold, -Qwarn, -Qwarnall, and -Qnew. The default is - -Qold, meaning the / operator has its classic meaning and no - warnings are issued. Using -Qwarn issues a run-time warning about - all uses of classic division for int and long arguments; -Qwarnall - also warns about classic division for float and complex arguments - (for use with fixdiv.py). - [Note: the remainder of this item (preserved below) became - obsolete in 2.2c1 -- -Qnew has global effect in 2.2] :: - - Using -Qnew is questionable; it turns on new division by default, but - only in the __main__ module. You can usefully combine -Qwarn or - -Qwarnall and -Qnew: this gives the __main__ module new division, and - warns about classic division everywhere else. - -- Many built-in types can now be subclassed. This applies to int, - long, float, str, unicode, and tuple. (The types complex, list and - dictionary can also be subclassed; this was introduced earlier.) - Note that restrictions apply when subclassing immutable built-in - types: you can only affect the value of the instance by overloading - __new__. You can add mutable attributes, and the subclass instances - will have a __dict__ attribute, but you cannot change the "value" - (as implemented by the base class) of an immutable subclass instance - once it is created. - -- The dictionary constructor now takes an optional argument, a - mapping-like object, and initializes the dictionary from its - (key, value) pairs. - -- A new built-in type, super, has been added. This facilitates making - "cooperative super calls" in a multiple inheritance setting. For an - explanation, see http://www.python.org/2.2/descrintro.html#cooperation - -- A new built-in type, property, has been added. This enables the - creation of "properties". These are attributes implemented by - getter and setter functions (or only one of these for read-only or - write-only attributes), without the need to override __getattr__. - See http://www.python.org/2.2/descrintro.html#property - -- The syntax of floating-point and imaginary literals has been - liberalized, to allow leading zeroes. Examples of literals now - legal that were SyntaxErrors before: - - 00.0 0e3 0100j 07.5 00000000000000000008. - -- An old tokenizer bug allowed floating point literals with an incomplete - exponent, such as 1e and 3.1e-. Such literals now raise SyntaxError. - -Library -------- - -- telnetlib includes symbolic names for the options, and support for - setting an option negotiation callback. It also supports processing - of suboptions. - -- The new C standard no longer requires that math libraries set errno to - ERANGE on overflow. For platform libraries that exploit this new - freedom, Python's overflow-checking was wholly broken. A new overflow- - checking scheme attempts to repair that, but may not be reliable on all - platforms (C doesn't seem to provide anything both useful and portable - in this area anymore). - -- Asynchronous timeout actions are available through the new class - threading.Timer. - -- math.log and math.log10 now return sensible results for even huge - long arguments. For example, math.log10(10 ** 10000) ~= 10000.0. - -- A new function, imp.lock_held(), returns 1 when the import lock is - currently held. See the docs for the imp module. - -- pickle, cPickle and marshal on 32-bit platforms can now correctly read - dumps containing ints written on platforms where Python ints are 8 bytes. - When read on a box where Python ints are 4 bytes, such values are - converted to Python longs. - -- In restricted execution mode (using the rexec module), unmarshalling - code objects is no longer allowed. This plugs a security hole. - -- unittest.TestResult instances no longer store references to tracebacks - generated by test failures. This prevents unexpected dangling references - to objects that should be garbage collected between tests. - -Tools ------ - -- Tools/scripts/fixdiv.py has been added which can be used to fix - division operators as per PEP 238. - -Build ------ - -- If you are an adventurous person using Mac OS X you may want to look at - Mac/OSX. There is a Makefile there that will build Python as a real Mac - application, which can be used for experimenting with Carbon or Cocoa. - Discussion of this on pythonmac-sig, please. - -C API ------ - -- New function PyObject_Dir(obj), like Python __builtin__.dir(obj). - -- Note that PyLong_AsDouble can fail! This has always been true, but no - callers checked for it. It's more likely to fail now, because overflow - errors are properly detected now. The proper way to check:: - - double x = PyLong_AsDouble(some_long_object); - if (x == -1.0 && PyErr_Occurred()) { - /* The conversion failed. */ - } - -- The GC API has been changed. Extensions that use the old API will still - compile but will not participate in GC. To upgrade an extension - module: - - - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC - - - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and - PyObject_GC_Del to deallocate them - - - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini - to PyObject_GC_UnTrack - - - remove PyGC_HEAD_SIZE from object size calculations - - - remove calls to PyObject_AS_GC and PyObject_FROM_GC - -- Two new functions: PyString_FromFormat() and PyString_FromFormatV(). - These can be used safely to construct string objects from a - sprintf-style format string (similar to the format string supported - by PyErr_Format()). - -New platforms -------------- - -- Stephen Hansen contributed patches sufficient to get a clean compile - under Borland C (Windows), but he reports problems running it and ran - out of time to complete the port. Volunteers? Expect a MemoryError - when importing the types module; this is probably shallow, and - causing later failures too. - -Tests ------ - -Windows -------- - -- Large file support is now enabled on Win32 platforms as well as on - Win64. This means that, for example, you can use f.tell() and f.seek() - to manipulate files larger than 2 gigabytes (provided you have enough - disk space, and are using a Windows filesystem that supports large - partitions). Windows filesystem limits: FAT has a 2GB (gigabyte) - filesize limit, and large file support makes no difference there. - FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now. - NTFS has no practical limit on file size, and files of any size can be - used from Python now. - -- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC - points to command.com (patch from Brian Quinlan). - - -What's New in Python 2.2a2? -=========================== - -*Release Date: 22-Aug-2001* - -Build ------ - -- Tim Peters developed a brand new Windows installer using Wise 8.1, - generously donated to us by Wise Solutions. - -- configure supports a new option --enable-unicode, with the values - ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode - type and supporting code is completely removed from the interpreter. - -- A new configure option --enable-framework builds a Mac OS X framework, - which "make frameworkinstall" will install. This provides a starting - point for more mac-like functionality, join pythonmac-sig@python.org - if you are interested in helping. - -- The NeXT platform is no longer supported. - -- The 'new' module is now statically linked. - -Tools ------ - -- The new Tools/scripts/cleanfuture.py can be used to automatically - edit out obsolete future statements from Python source code. See - the module docstring for details. - -Tests ------ - -- regrtest.py now knows which tests are expected to be skipped on some - platforms, allowing to give clearer test result output. regrtest - also has optional --use/-u switch to run normally disabled tests - which require network access or consume significant disk resources. - -- Several new tests in the standard test suite, with special thanks to - Nick Mathewson. - -Core ----- - -- The floor division operator // has been added as outlined in PEP - 238. The / operator still provides classic division (and will until - Python 3.0) unless "from __future__ import division" is included, in - which case the / operator will provide true division. The operator - module provides truediv() and floordiv() functions. Augmented - assignment variants are included, as are the equivalent overloadable - methods and C API methods. See the PEP for a full discussion: - - -- Future statements are now effective in simulated interactive shells - (like IDLE). This should "just work" by magic, but read Michael - Hudson's "Future statements in simulated shells" PEP 264 for full - details: . - -- The type/class unification (PEP 252-253) was integrated into the - trunk and is not so tentative any more (the exact specification of - some features is still tentative). A lot of work has done on fixing - bugs and adding robustness and features (performance still has to - come a long way). - -- Warnings about a mismatch in the Python API during extension import - now use the Python warning framework (which makes it possible to - write filters for these warnings). - -- A function's __dict__ (aka func_dict) will now always be a - dictionary. It used to be possible to delete it or set it to None, - but now both actions raise TypeErrors. It is still legal to set it - to a dictionary object. Getting func.__dict__ before any attributes - have been assigned now returns an empty dictionary instead of None. - -- A new command line option, -E, was added which disables the use of - all environment variables, or at least those that are specifically - significant to Python. Usually those have a name starting with - "PYTHON". This was used to fix a problem where the tests fail if - the user happens to have PYTHONHOME or PYTHONPATH pointing to an - older distribution. - -Library -------- - -- New class Differ and new functions ndiff() and restore() in difflib.py. - These package the algorithms used by the popular Tools/scripts/ndiff.py, - for programmatic reuse. - -- New function xml.sax.saxutils.quoteattr(): Quote an XML attribute - value using the minimal quoting required for the value; more - reliable than using xml.sax.saxutils.escape() for attribute values. - -- Readline completion support for cmd.Cmd was added. - -- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings. - -- Added function threading.BoundedSemaphore() - -- Added Ka-Ping Yee's cgitb.py module. - -- The 'new' module now exposes the CO_xxx flags. - -- The gc module offers the get_referents function. - -New platforms -------------- - -C API ------ - -- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added - which provide a cross-platform implementations for the - relatively new snprintf()/vsnprintf() C lib APIs. In contrast to - the standard sprintf() and vsprintf() C lib APIs, these versions - apply bounds checking on the used buffer which enhances protection - against buffer overruns. - -- Unicode APIs now use name mangling to assure that mixing interpreters - and extensions using different Unicode widths is rendered next to - impossible. Trying to import an incompatible Unicode-aware extension - will result in an ImportError. Unicode extensions writers must make - sure to check the Unicode width compatibility in their extensions by - using at least one of the mangled Unicode APIs in the extension. - -- Two new flags METH_NOARGS and METH_O are available in method definition - tables to simplify implementation of methods with no arguments and a - single untyped argument. Calling such methods is more efficient than - calling corresponding METH_VARARGS methods. METH_OLDARGS is now - deprecated. - -Windows -------- - -- "import module" now compiles module.pyw if it exists and nothing else - relevant is found. - - -What's New in Python 2.2a1? -=========================== - -*Release date: 18-Jul-2001* - -Core ----- - -- TENTATIVELY, a large amount of code implementing much of what's - described in PEP 252 (Making Types Look More Like Classes) and PEP - 253 (Subtyping Built-in Types) was added. This will be released - with Python 2.2a1. Documentation will be provided separately - through http://www.python.org/2.2/. The purpose of releasing this - with Python 2.2a1 is to test backwards compatibility. It is - possible, though not likely, that a decision is made not to release - this code as part of 2.2 final, if any serious backwards - incompatibilities are found during alpha testing that cannot be - repaired. - -- Generators were added; this is a new way to create an iterator (see - below) using what looks like a simple function containing one or - more 'yield' statements. See PEP 255. Since this adds a new - keyword to the language, this feature must be enabled by including a - future statement: "from __future__ import generators" (see PEP 236). - Generators will become a standard feature in a future release - (probably 2.3). Without this future statement, 'yield' remains an - ordinary identifier, but a warning is issued each time it is used. - (These warnings currently don't conform to the warnings framework of - PEP 230; we intend to fix this in 2.2a2.) - -- The UTF-16 codec was modified to be more RFC compliant. It will now - only remove BOM characters at the start of the string and then - only if running in native mode (UTF-16-LE and -BE won't remove a - leading BMO character). - -- Strings now have a new method .decode() to complement the already - existing .encode() method. These two methods provide direct access - to the corresponding decoders and encoders of the registered codecs. - - To enhance the usability of the .encode() method, the special - casing of Unicode object return values was dropped (Unicode objects - were auto-magically converted to string using the default encoding). - - Both methods will now return whatever the codec in charge of the - requested encoding returns as object, e.g. Unicode codecs will - return Unicode objects when decoding is requested ("äöü".decode("latin-1") - will return u"äöü"). This enables codec writer to create codecs - for various simple to use conversions. - - New codecs were added to demonstrate these new features (the .encode() - and .decode() columns indicate the type of the returned objects): - - +---------+-----------+-----------+-----------------------------+ - |Name | .encode() | .decode() | Description | - +=========+===========+===========+=============================+ - |uu | string | string | UU codec (e.g. for email) | - +---------+-----------+-----------+-----------------------------+ - |base64 | string | string | base64 codec | - +---------+-----------+-----------+-----------------------------+ - |quopri | string | string | quoted-printable codec | - +---------+-----------+-----------+-----------------------------+ - |zlib | string | string | zlib compression | - +---------+-----------+-----------+-----------------------------+ - |hex | string | string | 2-byte hex codec | - +---------+-----------+-----------+-----------------------------+ - |rot-13 | string | Unicode | ROT-13 Unicode charmap codec| - +---------+-----------+-----------+-----------------------------+ - -- Some operating systems now support the concept of a default Unicode - encoding for file system operations. Notably, Windows supports 'mbcs' - as the default. The Macintosh will also adopt this concept in the medium - term, although the default encoding for that platform will be other than - 'mbcs'. - - On operating system that support non-ASCII filenames, it is common for - functions that return filenames (such as os.listdir()) to return Python - string objects pre-encoded using the default file system encoding for - the platform. As this encoding is likely to be different from Python's - default encoding, converting this name to a Unicode object before passing - it back to the Operating System would result in a Unicode error, as Python - would attempt to use its default encoding (generally ASCII) rather than - the default encoding for the file system. - - In general, this change simply removes surprises when working with - Unicode and the file system, making these operations work as you expect, - increasing the transparency of Unicode objects in this context. - See [????] for more details, including examples. - -- Float (and complex) literals in source code were evaluated to full - precision only when running from a .py file; the same code loaded from a - .pyc (or .pyo) file could suffer numeric differences starting at about the - 12th significant decimal digit. For example, on a machine with IEEE-754 - floating arithmetic, - - x = 9007199254740992.0 - print long(x) - - printed 9007199254740992 if run directly from .py, but 9007199254740000 - if from a compiled (.pyc or .pyo) file. This was due to marshal using - str(float) instead of repr(float) when building code objects. marshal - now uses repr(float) instead, which should reproduce floats to full - machine precision (assuming the platform C float<->string I/O conversion - functions are of good quality). - - This may cause floating-point results to change in some cases, and - usually for the better, but may also cause numerically unstable - algorithms to break. - -- The implementation of dicts suffers fewer collisions, which has speed - benefits. However, the order in which dict entries appear in dict.keys(), - dict.values() and dict.items() may differ from previous releases for a - given dict. Nothing is defined about this order, so no program should - rely on it. Nevertheless, it's easy to write test cases that rely on the - order by accident, typically because of printing the str() or repr() of a - dict to an "expected results" file. See Lib/test/test_support.py's new - sortdict(dict) function for a simple way to display a dict in sorted - order. - -- Many other small changes to dicts were made, resulting in faster - operation along the most common code paths. - -- Dictionary objects now support the "in" operator: "x in dict" means - the same as dict.has_key(x). - -- The update() method of dictionaries now accepts generic mapping - objects. Specifically the argument object must support the .keys() - and __getitem__() methods. This allows you to say, for example, - {}.update(UserDict()) - -- Iterators were added; this is a generalized way of providing values - to a for loop. See PEP 234. There's a new built-in function iter() - to return an iterator. There's a new protocol to get the next value - from an iterator using the next() method (in Python) or the - tp_iternext slot (in C). There's a new protocol to get iterators - using the __iter__() method (in Python) or the tp_iter slot (in C). - Iterating (i.e. a for loop) over a dictionary generates its keys. - Iterating over a file generates its lines. - -- The following functions were generalized to work nicely with iterator - arguments:: - - map(), filter(), reduce(), zip() - list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API) - max(), min() - join() method of strings - extend() method of lists - 'x in y' and 'x not in y' (PySequence_Contains() in C API) - operator.countOf() (PySequence_Count() in C API) - right-hand side of assignment statements with multiple targets, such as :: - x, y, z = some_iterable_object_returning_exactly_3_values - -- Accessing module attributes is significantly faster (for example, - random.random or os.path or yourPythonModule.yourAttribute). - -- Comparing dictionary objects via == and != is faster, and now works even - if the keys and values don't support comparisons other than ==. - -- Comparing dictionaries in ways other than == and != is slower: there were - insecurities in the dict comparison implementation that could cause Python - to crash if the element comparison routines for the dict keys and/or - values mutated the dicts. Making the code bulletproof slowed it down. - -- Collisions in dicts are resolved via a new approach, which can help - dramatically in bad cases. For example, looking up every key in a dict - d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x - faster now. Thanks to Christian Tismer for pointing out the cause and - the nature of an effective cure (last December! better late than never). - -- repr() is much faster for large containers (dict, list, tuple). - - -Library -------- - -- The constants ascii_letters, ascii_lowercase. and ascii_uppercase - were added to the string module. These a locale-independent - constants, unlike letters, lowercase, and uppercase. These are now - use in appropriate locations in the standard library. - -- The flags used in dlopen calls can now be configured using - sys.setdlopenflags and queried using sys.getdlopenflags. - -- Fredrik Lundh's xmlrpclib is now a standard library module. This - provides full client-side XML-RPC support. In addition, - Demo/xmlrpc/ contains two server frameworks (one SocketServer-based, - one asyncore-based). Thanks to Eric Raymond for the documentation. - -- The xrange() object is simplified: it no longer supports slicing, - repetition, comparisons, efficient 'in' checking, the tolist() - method, or the start, stop and step attributes. See PEP 260. - -- A new function fnmatch.filter to filter lists of file names was added. - -- calendar.py uses month and day names based on the current locale. - -- strop is now *really* obsolete (this was announced before with 1.6), - and issues DeprecationWarning when used (except for the four items - that are still imported into string.py). - -- Cookie.py now sorts key+value pairs by key in output strings. - -- pprint.isrecursive(object) didn't correctly identify recursive objects. - Now it does. - -- pprint functions now much faster for large containers (tuple, list, dict). - -- New 'q' and 'Q' format codes in the struct module, corresponding to C - types "long long" and "unsigned long long" (on Windows, __int64). In - native mode, these can be used only when the platform C compiler supports - these types (when HAVE_LONG_LONG is #define'd by the Python config - process), and then they inherit the sizes and alignments of the C types. - In standard mode, 'q' and 'Q' are supported on all platforms, and are - 8-byte integral types. - -- The site module installs a new built-in function 'help' that invokes - pydoc.help. It must be invoked as 'help()'; when invoked as 'help', - it displays a message reminding the user to use 'help()' or - 'help(object)'. - -Tests ------ - -- New test_mutants.py runs dict comparisons where the key and value - comparison operators mutate the dicts randomly during comparison. This - rapidly causes Python to crash under earlier releases (not for the faint - of heart: it can also cause Win9x to freeze or reboot!). - -- New test_pprint.py verifies that pprint.isrecursive() and - pprint.isreadable() return sensible results. Also verifies that simple - cases produce correct output. - -C API ------ - -- Removed the unused last_is_sticky argument from the internal - _PyTuple_Resize(). If this affects you, you were cheating. - ---- **(For information about older versions, consult the HISTORY file.)** diff --git a/README b/README index c5cae18e2b3e..af1d7f874f5a 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ -This is Python version 2.3 release candidate 2 -============================================== +This is Python version 2.3 (final) +================================== Copyright (c) 2001, 2002, 2003 Python Software Foundation. All rights reserved. @@ -35,6 +35,7 @@ What's new in this release? See the file "Misc/NEWS". + If you don't read instructions ------------------------------ @@ -224,6 +225,7 @@ old K&R-C-only compilers is no longer possible. ANSI C compilers are available for all modern systems, either in the form of updated compilers from the vendor, or one of the free compilers (gcc). + Unsupported systems ------------------- @@ -247,6 +249,7 @@ longer: - Systems using --with-dl-dld - Systems using --without-universal-newlines + Platform specific notes ----------------------- -- 2.47.3