This page lists all known errata in the first edition of the book Programming Python. Corrections are listed by increasing page numbers, and entries added recently are marked with the word "NEW" (search the page to find these updates). A few very recent additions appear at the end of this page.
Notes: some of the items below are more like wishes than errors. Most were fixed in later printings of the book, so you may or may not find these in yours. In fact, most or all of the items listed below have been fixed in the last few printings of the book. At this writing, the English version of the book is currently in the sixth printing of the first edition (4/99).
Related pages:
Last updated: February 1999
Here are the problems uncovered so far, in the first printing of the book. Most have been fixed in later printings of the book, but new issues still pop up from time to time. This list was recently reordered by page numbers, in response to reader requests; it's no longer ordered by severity, but the vast majority of these are minor corrections. Newly added entries will have the word "NEW" in their first line for at least a month after I post them (search on NEW to find recent additions) and/or may be added at the end.
There probably are a few mistakes yet to be uncovered (in a 900-page book, there's plenty of room for error). If you find one that's not on this list, please drop me (or O'Reilly) a line; we want to make the book as accurate as possible, and will be correcting bugs each time the book is printed. You can send a bug report by email (see the end of this page). I'm also interested in any and all suggestions about new material for future editions.
Thanks to everyone who took time to send in comments and problem reports.
1) Type: Acknowledgements adjustment Where: page xxii, preface, last paragraph Fix: The set of kids names mentioned in the last paragraph needs to be expanded to include the name "Roxanne"; another case of concatenation in action... 2) Type: Adjustment: spacing Where: Page 16, "Methods" paragraph, second sentence, after comma Fix: Shorten to ", the self argument receives the implied instance object:" Notes: Just a suggestion--the word spacing looks a little odd, so we may shorten this sentence this way if it helps 3) Type: Printing glitch Where: Page 22, just before "Tuple packing" paragraph label Fix: Change ":186" to ":" (delete the "186") 4) Type: Technical adjustment Where: Page 22, start of example at bottom Fix: Change "% Python" to "% python" Notes: Not serious (there are many ways to start the interpreter), but I use lower case "% python" in all other places 5) Type: Adjustment: code indentation Where: Page 62, end of example 2-39 Fix: The two lines that start with "cc " should be indented the same Notes: Not serious, but these usually both start with a tab in a makefile, so they should look the same in terms of indenting 6) Type: Production adjustment Where: Page 64, end of sidebar "Towards automated integration" Fix: Change "..." at end to "!" Notes: I'm being picky on this one, but there are now 2 sidebars on facing pages that both end in "..."; should probably differ. The "What's in a Name" sidebar originally appeared on a separate (non-facing) page. 7) Type: Spelling Where: Page 103 (table 4-1), and page 764 (last list item) Fix: Change "Hexidecimal" to "Hexadecimal" [note the "a"] Notes: My spell checker says it's wrong with the "i" 8) Type: Inaccurate wording: "ref" Where: Page 143, 1st bullet item at top, AND Page 855, 5th paragraph (labeled "Ref parameters") Fix: Change the word "ref" to "reference" on both pages, in both the text and the paragraph label Notes: "ref" is a common abbreviation; but as used, it makes it look like it's a C++ keyword (it's not). These pages are talking about C++ "&" reference parameters. 9) Type: Program error: bad variable name Where: Page 154, code near middle of page Fix: Change "y, y = 1, 2" to "y, z = 1, 2" Notes: I broke this with a last-minute attempt to save a line. As is, there's an undefined name error if "z" is used. 10) Type: Ambiguous wording Where: page 233, line -12 (12th from bottom) Fix: change "within class members:" --> "within class methods:" 11) Type: Typo Where: page 233, line -3 Fix: change ". namespace" --> ". Namespace" 12) Type: Bad figure reference Where: Page 237, start of last full (non-bullet) paragraph Fix: Change "In Figure 9-4" to "In Figure 9-5" 13) Type: Bad label in figure (NEW: added 8/13/97) Where: Page 328, in figure 11-17, in bottommost rectangle Fix: Change two "Menubutton" in bottom frame to "Button" 14) Type: Tkinter incompatibility in Python 1.4: ScrolledText options Where: page 331, "guimixin.py" example in chapter 11 Fix: change "text = ScrolledText(new, {'height':30, 'width':90, Pack:{}})" to "text = ScrolledText(new, height=30, width=90); text.pack()" Notes: This is also only an issue when using Python version 1.4 (the book and CD are based on version 1.3). But the new ScrolledText widget in 1.4 is not backward compatible with the 1.3 creation signature: 1.3 supports only configuration option dictionaries, and 1.4 supports only keywords. Hence, the call above needs to be changed to use keywords for 1.4. Unfortunately, this will break the example for 1.3 users. Release 1.5 might support both schemes (like most other widgets), but for now users need to pick either dictionaries (for 1.3) or keywords (for 1.4): Python 1.2 and 1.3 (dictionaries only) >> class ScrolledText(Text): >> def __init__(self, master=None, cnf={}): Python 1.4 (keywords only) >> class ScrolledText(Text): >> def __init__(self, master=None, **cnf): Python 1.5?? (both) >> class ScrolledText(Text): >> def __init__(self, master=None, cnf={}, **kw): The example must be updated on the CD-ROM too. UPDATE: Guido says this will be fixed in 1.5 to support both schemes; the example in the first printing will work as is. See the example diffs page for specific changes required. 15) Type: Wording Where: Page 380, second paragraph from the end, last sentence Fix: Change "Bibliography," to "The bibliography" 16) Type: Typo Where: page 390, table 12-1, line 1 Fix: change "Get dbm, gbmd, ..." --> "Get dbm, gdbm, ..." 17) Type: Tkinter incompatibility in Python 1.4: Variable get/set Where: page 394, "formgui.py" example in chapter 12 Fix: For all StringVar() objects used, change call styles: text() --> text.get() text(value) --> text.set(value) Notes: The same problem as in calcgui2 (p688), and only an issue when running the example under Python release 1.4 (works okay under 1.3). FormGui uses the 1.3 call style more heavily than calcgui2. To make it work under 1.4, change all the calls to the: 1) "self.keytext" member 2) "text" variables in methods "display", "onStore", "onNew" to use the new get/set styles above. This will be updated in the book for the next printing. Please see the example diffs page for specific changes required, and a patch file. 18) Type: Typo Where: page 413, line 13 Fix: (Looks like an extra space before the last close-parenthesis.) 19) Type: Bad figure reference Where: Page 428, first real paragraph Fix: Change "(Example 12-11)" to "(Example 12-12)" 20) Type: Production adjustment Where: Page 461, before code example near top of page Fix: Seems to be an extra blank line that could be deleted here 21) Type: Punctuation Where: Page 470, just before example 13-20 Fix: Needs a ":" or "." at the end of the paragraph 22) Type: Adjustment: code indentation Where: Page 481, example 13-25, inside "class BinaryTree" Fix: Align the code on the right (in the 4 "def" lines, after ":") Notes: Off by very little, and it's not an error, but looks a bit odd 23) Type: Punctuation Where: Page 489, first paragraph, just before last sentence Fix: Change "). we'll revisit" to "); we'll revisit" [needs a ";", not a "."] 24) Type: Inaccurate wording Where: Page 495, last paragraph on page (starts with "Combinations are") Fix: Change ", and order matters here:" to ", and order does not matter here:" Notes: Note the "not"; this is implied on the prior page. 25) Type: Bogus paragraph label Where: Page 528, "References" paragraph label at bottom of page Fix: Change "References" label to "Exceptions" Notes: It's repeated again on the next page; the second "References" label is correct--the first is the one to be changed 26) Type: Bogus code line Where: Page 552, last line on the page Fix: Delete the line "The test driver." Notes: A printing glitch. It's a heading on the next page, not part of example 14-3; remove it from example at bottom of page 552. 27) Type: Output alignment Where: Page 554, labeled program outputs Fix: In output lines that start with a label ("label:"), the numbers to the right must be aligned on their first digits, not on their decimal point: Python module: 17.94 C ext module: 7.323 Notes: There's always at least one blank after a label's ":". It actually looks better as shown in the book, but that's not what the programs being run really print 28) Type: Inaccurate wording (NEW: added 7/31/97) Where: page 560, near end of chapter 14, integer type discussion Fix: The book says: "In user-defined numeric types, we can pick and choose operators to respond to. If a slot is left as zero, the type doesn't respond to the corresponding operation and we'll get an exception at run-time." Not 100% true (in Python1.4 and earlier): some operations check for NULL (zero) and raise the exception, but some don't. Those that don't can cause a crash at run-time if you leave the slot NULL, so you need to store a pointer to a real C function which raises an exception manually (if desired). This is going back two years now, but I suspect the missing NULL tests were something that was supposed to be fixed but hasn't been yet (much like the "Great Renaming"--still pending as of 1.4). For instance, 1.4's "object.h" header file implies that only 'dealloc' need be non-NULL (as the book says): >> Methods are optional, a >> nil pointer meaning that particular kind of access is not >> available for this type. The Py_DECREF() macro uses the >> tp_dealloc method without checking for a nil pointer; it >> should always be implemented except if the implementation >> can guarantee that the reference count will never reach >> zero (e.g., for type objects). Guido may add the missing NULL tests later on, but for now, change these sentences to: "In user-defined numeric types, we can pick and choose operators to respond to, but need to provide a pointer to a dummy function for all unimplemented operations (Python may or may not test for NULL pointers)." UPDATE: the missing NULL pointer tests should be added in Python1.5. With the fix, you'll be able to use NULL pointers instead of dummy functions, for all unimplemented C type ops. You'll get an exception instead of a crash, and performance impacts should be negligible. So this section should now say: "In user-defined numeric types, we can pick and choose operators to respond to. In Python1.5 (and later), use NULL pointers in unimplemented operation slots: Python will raise an exception when they are attempted. But in Python releases 1.4 and earlier, NULL pointers may or may not be detected; to be safe, provide pointers to dummy functions for all unimplemented operations instead of NULLs." XX) Type: API function name changed in 1.5 (NEW, 10/98) Where: Page 576 Fix: Change "PyArgs_VaParse" to "PyArg_VaParse" (for 1.5 only) Notes: Actually, this function must be called PyArgs_VaParse in Python versions 1.2, 1.3, and 1.4, but was apparently renamed to PyArg_VaParse (without the "s") in Python 1.5. It's only mentioned in the API functions list in the book, and isn't used in any example code, so this is a minor diff. It's also just version skew, not a typo: it really was called PyArgs_VaParse up until 1.5. The reason for the name change in 1.5 is too complex to explain well here. The short story is that it broke during the "Grand Renaming". It was called "PyArgs_VaParse" in the old rename2.h header file in Python 1.2 - 1.4; but as of 1.5 the function was physically renamed to be PyArg_VaParse in getargs.c, despite the older rename2.h name. 29) Type: Wording error Where: Page 584, first sentence in sidebar at top of page Fix: Change "__builtin__" to "__builtins__" (add an "s") 30) Type: Technical clarification Where: Page 622, last paragraph on page Fix: Change "global variables," to "global variables, mutable objects," Notes: I should have also mentioned changing passed-in objects 31) Type: Printing glitch Where: Page 644, near end of interaction at top of page Fix: Change ">>>;" to ">>>" (delete the ";") 32) Type: Typo Where: page 646, line -9, in object.search paragraph Fix: change "Like regex.match" --> "Like regex.search" 33) Type: Typo Where: page 648, line -8 Fix: change ", For instance" --> ". For instance" 34) Type: Output alignment Where: Page 653, program output near bottom of page Fix: The '%' must align (that's what is really output): "interactive: % pygrep1.py command line: % pygrep1.py ..." 35) Type: Typo Where: page 680, line 7 Fix: change "top-level program. the" --> "top-level program, the" 36) Type: Tkinter incompatibility in Python 1.4: Variable get/set Where: page 688, "calcgui2.py" example at the end of chapter 16 Fix: change all "self.text()" --> "self.text.get()" change all "self.text(X)" --> "self.text.set(X)" Notes: This is only a concern when using Python release 1.4; since the book is based on 1.3, and all the binaries on the CD-ROM are Python 1.3, this isn't a bug per-se. But starting with release 1.4, we need to call set/get explicitly, instead of calling the Variable instance with/without an argument. Why? Guido took out the 1.3 Variable.__call__ method that made the two forms above work. To retain the 1.3 interface, you can add this method to class Variable in Lib/tkinter/Tkinter.py: >> class Variable: >> ... >> def __call__(self, value=None): >> if value == None: >> return self.get() >> else: >> self.set(value) Of course, this makes your Tkinter non-standard, so using get/set is a better solution. For an overview of both forms, see "Linking variables to entry fields" in chapter 11 (this section needs to be updated too). See the example diffs page for specific changes required. 37) Type: Bad backreference (GuiMixin) Where: Page 692, section "Running the new calculator", end of last sentence in first paragraph Fix: Change "earlier in this chapter" to "earlier in this book" 38) Type: Adjustment: tense Where: Page 703, second paragraph from botton, first sentenence Fix: Change "Python geared" to "Python is geared" Notes: Just a suggestion; the original was "Python's geared". It's really not an error as is and I can live with it, but the prior sentence uses present tense; these should probably match. 39) Type: CD directory reference Where: Page 732, CD directory for the Holmes package is wrong Fix: As given, it's the FTP site's dir; on the CD, it is really in directory "ftp.python.org/contrib/Misc" 40) Type: Wording adjustment (non-error) Where: Page 760, "Expressions" section, first list item Fix: Change "egs" to "eggs" Notes: Not an error, but embarrassing enough to fix :-) 41) Type: Spelling error Where: Page 765, twice--in "Lists" and "Tuples" item lists Fix: Change "repitition" to "repetition" (in both places) 42) Type: Typo (NEW: added 8/13/97) Where: Page 828, near start of paragraph 3 Fix: Change "contains and items" to "contains items" 43) Type: Program error: missing comma in single-item tuple Where: Page 834, examples at end of page, third line up Fix: Change "(firstFunction, ('Hello world!'))" to "(firstFunction, ('Hello world!',))" Notes: This was correct in a very early draft, but the comma was lost in some cut-and-paste along the way. The need for the comma is implied elsewhere in the book (appendix C, chapter 7, etc.) This also needs to be fixed on the CD: the bad example code was cut-and-paste from the book. The files where it occurs: "/examples/{dos,unix}/examples/other/tutor/func1.py" 44) Type: Printing glitch Where: Page 845, last line in code of "class SecondClass" Fix: The line: "x = SecondClass()" should begin in column 1 (just like the following line). It's not part of the class definition. Notes: This may be obvious to most readers, given that this line isn't even aligned with the class def properly, and similar lines appear in most of the prior examples. The code for this example is correct on the CD too (examples/other/tutor/class1.py), so it isn't a problem if you're running the examples. But in strict conformance with Murphy's Law, this glitch wasn't discovered until 3 days after the second printing was run off; unless someone else caught it, it may not be fixed until the third printing. 45) Type: Bogus output line Where: Page 847, interpreter interaction just before last paragraph Fix: A superfluous line snuck into the output--'legs': >>> x = Hacker('Data') [delete this line]-> 'legs' >>> print x.stance, x.name, x.legs Notes: Introduced during production: seems to have been repeated from the end of the line-comment on the preceding line. The code line "x = Hacker('Data')" doesn't produce any output. 46) Type: Bad string constant (NEW: added 8/13/97) Where: Page 852, String missing quotes, in printings 1 and 2 Fix: Change: file = open('data', r) to: file = open('data', 'r') 47) Type: Bad backquote Where: Page 868, Index, entry for "backquote" Fix: Needs a real backquote in the parenthesis: (`), not (") 48) Type: Index addition Where: Index Fix: Add "__call__" to the index. It's mentioned in appendix A, in particular. 49) Type: Index entry Where: Index, "S" list Fix: "__getitem__" appears under "S" (should be "__setitem__") 50) Type: Index addition Where: Index, "getattr" entry Fix: "getattr" should list a reference to chapter 10 appearance 51) Type: Index additions (NEW: added 8/13/97) Where: Index, need expansion in general Fix: add entries for "==", "is" 52) Type: CD file permissions, name case conflicts Where: CD ROM Fix: Some of the README files apparently had root-level access protections. This doesn't matter if the CD is read on PCs, but some UNIX users may not be able to access the files. Please see O'Reilly's FTP site, at ftp.ora.com/pub/examples/nutshell/python for a description and a fix. There was also an issue with some HTML files having the same name but different case (which means you can't see both of the files on some platforms). This only occurs in the www.python.org/doc directory. Again, see the FTP site above for more details. 53) Type: CD addition: windows usage note Where: CD: "/readme" file Fix: I'd like to add a note telling MS-Windows users to try the PythonWin package in "/pc", not the (older) version in the "/ftp.python.org" directory. The older one has known install problems not present in the "/pc" version. The NT executable in "/special.bin" can also be used on PC's to run Tkinter GUI programs under Windows. (Also see the updates and additions section at the bottom of this page). 54) Type: CD additions: updated versions Where: CD Fix: There are newer releases of many of the CD's packages, which would be nice to include with the next printing. Python-1.4 source code is now officially released, for example, along with new versions of SWIG, PythonWin, etc. All new versions can be had by ftp, but it would be good to update the CD too. 55) Type: Extend filename for UNIX examples Where: CD, /examples/unix/examples/dstruct/basic/faststac.py Fix: This file should be renamed "faststack.py"--no point in making UNIX users conform to DOS filename limits. Some examples won't work unless this file is renamed (they import a module called "faststack", not "faststac").
Items added on 2/99; they need to be added to the main list above when I have time, but I wanted to post them asap:
A) NEW -- rand module replaced with random in 1.5.2 Page 690, 691 (ch16) Replace the statement from rand import * in the example code on page 690 with from random import *. You'll get an import error if you don't, because "rand" no longer exists. As of Python 1.5.2, the "rand" module is now officially deprecated, and has been replaced by the "random" module. Page 691 mentions "rand", and should now mention "random". B) NEW -- anydbm.open requires a 'c' second argument in 1.5.2 Pages: 39, 41 (twice), 390?, 411, 412, 422, As of Python version 1.5.2, the anydbm.open function requires you to pass a 'c' as a secod argument, to get the behavior shown in the book--that is, you must use anydbm.open('file', 'c'), rather than the anydbm.open('file') form in the book. The 'c' flag tells anydbm to create the file if and only if it doesn't yet exist, and open it in read/write mode. This is a non-backward-compatible change that impacts a few anydbm examples in chapters 2 and 12. Specifically, on all the pages listed above, change all anydbm.open('xxx') calls to be anydbm.open('xxx', 'c'). Discussion: It looks like this change happened sometime between versions 1.4 and 1.5.2. In 1.5.2 you need to use a 'c' as the second argument to the anydbm.open function. As long as you do, it works the same as in versions 1.4. and earlier. You can use more specific second arguments too (e.g., 'r' for input only (the default), 'w' for output only) but 'c' now does what passing no second argument used to do. I'm not sure why anydbm was changed in an incompatible way like this, but suspect it has something to do with the bsd interface on Windows, which requires the argument anyhow (requiring it always makes code more portable). Note that this change does not impact the shelve interface at all; shelve.open still works as advertised with just one argument, the external file name. (shelve.open passes the 'c' flag to anydbm.open internally.) Shelves are used in the book much more than raw dbm files, so this isn't as big an issue as it might have been. C) NEW -- Pythons and geography Pages: colophon description, backmatter And last but not least, I'd like to underscore a seemingly critical zoological paradox in the book, pointed out recently on comp.lang.python by a reader: Andrew Dalke wrote in message 36C30D37.A49915E5@bioreason.com... : I'm wearing my O'Reilly Python shirt today. Someone asked me : where Pythons are from. I pulled out Lutz's book and read: : : "The animal featured on the cover ... is a South American rock : python, one of approximately 18 species of python. Pythons ... : live in tropical regions of Africa, Asia, Australia and some : Pacific islands." : : I was then asked "so the South American rock python doesn't : live in South America?" : : Looks like another bit of errata to add to : http://shell.rmi.net/~lutz/errata-book-fixes.html : : :) :) Update: Per the suggestion of another reader who really knows something of snakes, O'Reilly plans to change this as follows: Change: The animal featured on the cover of Programming Python is a South American rock python, one of approximately 18 species of python. To: The animal featured on the cover of Programming Python is an African rock python, one of approximately 18 species of python.
Back to the errata page
Back to my homepage