python-distilled
python-distilled copied to clipboard
Resources for Python Distilled (Book)
Python Distilled

Welcome! This repo contains errata related to the Python Distilled book by David Beazley. If you'd like to contribute, please submit an issue or pull request.
Errata
-
Table 1.2, pg. 5. Description for
round(a, [n])should state that it rounds to the nearest multiple of 10 to the -nth power. -
Section 1.6, pg. 10. Comment in code sample mid-page should read
# g = 'Hello Cruel World'. -
Table 1.6, pg. 10. Description for
s.endswith(prefix [,start [,end]])would be better if it usedsuffixinstead ofprefix. -
Section 1.8, pg. 15.
['SYM', '123', '456.78']should include the newline and be['SYM', '123', '456.78\n'] -
Section 1.10, pg. 17-18. There is somewhat inconsistent use of variable names in this section. The
names1variable should besand thenames2variable should bet. -
Section 1.15, pg. 26.
print "Going away..."should beprint("Going away...") -
Section 2.1, pg. 38. Typo mid-page should read "Tuple, list, set, and dictionary literals are written as follows:"
-
Section 2.7, pg. 43. Truthiness should be expanded to include sets and any non-empty container. "... any nonzero number, a nonempty string, list, tuple, set, dictionary, or container is taken to be true."
-
Section 2.7, pg. 44. The function invocation of
foo(3, a)should bef(3, a). -
Section 2.14, pg. 52. The list comprehension example should use
squaresinstead ofnums.
nums = [1, 2, 3, 4, 5]
squares = [ ]
for n in nums:
squares.append(n*n)
- Section 2.15, pg. 55. The code example should use slicing
t[:1]instead of indexingt[0]to avoid a possibleIndexErrorexception.
comments = (t for t in lines if t[:1] == '#') # All comments
-
Section 4.8, pg. 88.
compute_cost(prices, quantities)should becompute_cost(prices, units). -
Section 5.8, pg. 106. The docstring in the
factorial()function should usefactorial(5)instead offactorial(6)to get a result of 120. -
Section 5.16, pg. 121. The first function signature for
after()should be changed to the following:
def after(seconds, func, /, *args, debug=False, **kwargs):
...
- Section 6.4, pg. 145. The code for
print_matching()should be as follows:
def print_matching(lines, substring):
for line in lines:
if substring in line: # line instead of lines
print(substring)
- Section 7.1, pg. 153. An extra line should probably be added to the example to show the effect of mutation:
>>> names[1] = 'Tom'
>>> names
[ 'Paula', 'Tom', 'Lewis' ]
>>>
-
Section 7.3, pg. 156. Missing right parenthesis on
b.withdraw(50.0). -
Section 7.7, pg. 160. Perhaps the class should be called
MyAccountinstead ofMyAcount. Although, it's inheritance--you can call the class whatever you want! -
Section 7.12, pg. 172. Comment in code right before section 7.13 should read
# Calls Date.today(Date). -
Section 7.21, pg. 194. The code for
register_decoder()should usemtinstead ofmt.mimetype. For example:
_registry = { }
def register_decoder(cls):
for mt in cls.mimetypes:
_registry[mt] = cls
return cls
- Section 7.23, pg. 200. Typo in constructor example at the top. Should be
a = Account.__new__(Account, 'Guido', 1000.0)
if isinstance(a, Account):
a.__init__('Guido', 1000.0)
The example that follows should also be corrected to:
a = Account.__new__(Account)
a.__init__('Guido', 1000.0)
- Section 7.23, pg. 200. Typos in the date
today()constructor. Should be
@classmethod
def today(cls):
t = time.localtime()
self = cls.__new__(cls) # Make instance
self.year = t.tm_year
self.month = t.tm_mon
self.day = t.tm_mday
return self
-
Section 7.23, pg. 201. NOT a typo. The
__new__()method of a class is, in fact, properly defined as a@staticmethodeven though it looks like it ought to be a class method. This is strange, but you can see this in examples where__new__()is invoked directly. For example,a = Account.__new__(Account)on the previous page. Here,Accountis passed directly as theclsargument as would be required with a@staticmethod. -
Section 7.26, pg. 208. Typo (missing "that"). "A proxy is an object that exposes..."
-
Section 7.28, pg. 212.
del f.ownershould bedel a.ownerin example. -
Section 8.7, pg. 234. It should be noted that the
PYTHONPATHenvironment variable is a colon-separated list of paths. -
Section 8.14, pg. 241. Typo ("is" should be "if"). "For example, if your package looks like this:"
-
Section 9.3, pg. 250.
format(x, '<*10.2f')should beformat(x, '*<10.2f'). -
Section 9.3, pg. 250. "The general format of the format specifier should be
[fill][align][sign][0][width][,][.precision][type]where each part enclosed in[]is optional." -
Section 9.3, pg, 252.
'Value is {val:<*10.2f}'.format(val=x)should be'Value is {val:*<10.2f}'.format(val=x). -
Section 9.3, pg, 253. Comment in code sample at bottom third of the page should be changed from
# b'The value is 123.46'to# b'Value is 123.46'. -
Section 9.9, pg. 264.
for filename in path.Path('dirname').glob('*.txt')should befor filename in pathlib.Path('dirname').glob('*.txt'). -
Section 9.15.9, pg. 279. Typo, missing "to" in the sentence "Go to a directory with a collection of files and type the following:"
-
Section 9.15.12, pg. 281. Typo in code comment ("one" should be "once").
# Configuration of logging (occurs once at program startup)
-
Section 9.15.15, pg. 283. There is an extra
return pathname.stat().st_sizestatement that can be removed (because there is areturnstatement right above it). -
Section 9.15.19, pg. 285.
servshould beserverin the SMTP example:
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
- Section 9.15.21, pg. 288. The output of
struct.pack()should be as follows:
>>> struct.pack(">HIff", 123, 456, 1.23, 4.56)
b'\x00{\x00\x00\x01\xc8?\x9dp\xa4@\x91\xeb\x85'
>>>
-
Section 10.1, pg. 308. The description of
round()should start with "Returns the result of rounding the floating-point number..." -
Table 10.9, pg. 311. The description for
format_map()should use "taken" instead of "taking". "Formatsswith substitutions taken from the mapping m." -
Table 10.10, pg. The description for
s + tshould read "Concatenation iftis a tuple." -
Table 10.10, pg, 313. The
s.append(x)method should be deleted.
Acknowledgements
The following individuals have contributed errata:
- Jonathan Oberländer
- Lucas Plaetevoet
- Chris Gibson
- Lawrence Wu
- Andy Lester
- Siavash Tavakoli
- Said van de Klundert
- David Dyck
- Scythal
- Feng Guo
- Xavier Noria
- Evan Friedenberg
- Karthik-d-k
- Marc Hertzog
- Jack Rubin
- Paul Barry
- @physadair
- @phils4000
- @michrag
- Sam Kramer
- @wildekat
- Shivam Parke
- Olivia Nelson
- @occoder
- @yatcui