Dive Into Python 3 will cover Python 3 and its differences from Python 2. Compared to the original Dive Into Python, it will be about 50% revised and 50% new material. I will publish drafts online as I go. The final version will be published on paper by Apress. The book will remain online under the CC-BY-3.0 license.

There is a changelog, a feed, and discussion on Reddit. The final version will be downloadable as HTML and PDF. During development, the only way to download it is to clone the Mercurial repository:

you@localhost:~$ hg clone http://hg.diveintopython3.org/ diveintopython3

Below is the draft table of contents. It is not finalized. Only a few chapters have been written so far. The rest is just stubs and random notes to myself.

Installing Python

Python on Windows

Python on Mac OS X

Python on Linux

Python from source

The interactive shell

Summary

Your first Python program

Diving in

Declaring functions

How Python's datatypes compare to other programming languages

Writing readable code

Why bother?

Docstrings

Function annotations

Style conventions

Everything is an object

The import search path

What's an object?

Indenting code

Testing modules

Summary

Native Python datatypes

Lists

Differences from Python 2

Creating new a list

Modifying a list

Searching a list

Deleting elements from a list

List operators

Looping through a list (list comprehensions)

Tuples

Dictionaries

Differences from Python 2

Creating a new dictionary

Modifying a dictionary

Deleting items from a dictionary

Looping through a dictionary (dictionary comprehensions)

Dictionary views

Sets

Differences from Python 2

Creating a new set

Modifying a set

Deleting elements from a set

Common set operations: union, intersection, and difference

Frozen sets

Numbers

Differences from Python 2

Integers

Long integers

Floating point numbers

Complex numbers

Common numerical operations

Iterators

Generators

Views

...

Strings

There ain't no such thing as "plain text"

A brief history of character encoding

What's a character?

How strings are stored in memory

Converting between different character encodings

Differences from Python 2

Formatting strings

What's my string?

Lists and strings

Historical note on the string module

Byte streams

Summary

The power of introspection

Diving in

Using optional and named arguments

Keyword-only arguments

Using type, str, dir, and other built-in functions

The type function

The str function

Built-in functions

Getting object references with getattr

getattr with modules

getattr as a dispatcher

Filtering lists

The peculiar nature of and and or

Using the and-or trick

Using lambda functions

Real-world lambda functions

Putting it all together

Summary

Objects and object-orientation

...major changes afoot...

...stuff about decorators...

...stuff about importing modules...

...mention why "from module import *" is only allowed at module level

Exceptions

...

Files

File objects

Reading files

Close your files... or don't

Handling I/O errors

Writing to files

Regular expressions

Diving in

Case study: street addresses

Case study: Roman numerals

Checking for thousands

Checking for hundreds

Using the {n,m} syntax

Checking for tens and ones

Verbose regular expressions

Case study: parsing phone numbers

Summary

HTML processing

Diving in

html5lib

Installing html5lib

Using html5lib

Extracting data from HTML documents

Building HTML documents

Putting it all together

Summary

XML Processing

...major changes afoot...

HTTP web services

Diving in

How not to fetch data over HTTP

Features of HTTP

User-Agent

Redirects

Last-Modified/If-Modified-Since

ETag-If-None-Match

Compression

Differences from Python 2

httplib2 (note: needs port)

Installing httplib2

Why httplib2 is better than http.client

Debugging HTTP web services

Setting the User-Agent

Handling Last-Modified and ETag

Handling redirects

Handling compressed data

Putting it all together

Summary

Unit testing

Introduction to Roman numerals

Diving in

Introducing romantest.py

Testing for success

Testing for failure

Testing for sanity

Test-first programming

roman.py, stage 1

roman.py, stage 2

roman.py, stage 3

roman.py, stage 4

roman.py, stage 5

Refactoring your code

Handling bugs

Handling changing requirements

The art of refactoring

Postscript

Summary

Dynamic functions

Diving in

plural.py, stage 1

plural.py, stage 2

plural.py, stage 3

plural.py, stage 4

plural.py, stage 5

plural.py, stage 6

Summary

Metaclasses

...once I figure out WTF metaclasses are...

Performance tuning

Diving in

Using the timeit module

Optimizing regular expressions

Optimizing dictionary lookups

Optimizing list operations

Optimizing string manipulation

Summary

Case study: porting chardet to Python 3

Introducing chardet: a mini-FAQ

What is character encoding auto-detection?

Isn't that impossible?

Who wrote this detection algorithm?

Yippie! Screw the standards, I'll just auto-detect everything!

Why bother with auto-detection if it's slow, inaccurate, and non-standard?

Diving in

UTF-n with a BOM

Escaped encodings

Multi-byte encodings

Single-byte encodings

windows-1252

Running 2to3

Fixing what 2to3 can't

False is invalid syntax

No module named constants

Name 'file' is not defined

Can't use a string pattern on a bytes-like object

Can't convert 'bytes' object to str implicitly

Packaging Python libraries

A brief history of packaging (and why it's harder than you think)

setuptools

distutils

Eggs

pip

Platform-specific packaging

Packaging by Linux distributions

Py2exe

Creating graphics with the Python Imaging Library

...will likely get ported in time...

Where to go from here

Tentative because most of these have not been ported to Python 3 yet.

WSGI

Django

Pylons

TurboGears

AppEngine

IronPython

Jython

PyPy

Stackless Python

Scripts and streams

...will be folded into other chapters...

Functional programming

...bits and pieces will be folded into other chapters...

SOAP web services

...no one will miss you...

Appendix A. Porting code to Python 3 with 2to3

  1. Diving in
  2. print statement
  3. Unicode string literals
  4. unicode() global function
  5. long data type
  6. <> comparison
  7. has_key() dictionary method
  8. Dictionary methods that return lists
  9. Modules that have been renamed or reorganized
    1. http
    2. urllib
    3. dbm
    4. xmlrpc
    5. Other modules
  10. Relative imports within a package
  11. next() iterator method
  12. filter() global function
  13. map() global function
  14. reduce() global function (3.1+)
  15. apply() global function
  16. intern() global function
  17. exec statement
  18. execfile statement (3.1+)
  19. repr literals (backticks)
  20. Exceptions
  21. try...except statement
  22. raise statement
  23. throw method on generators
  24. xrange() global function
  25. raw_input() and input() global functions
  26. func_* function attributes
  27. xreadlines() I/O method
  28. lambda functions with multiple parameters
  29. Special method attributes
  30. __nonzero__ special class attribute
  31. Octal literals
  32. sys.maxint
  33. callable() global function
  34. zip() global function
  35. StandardError() exception
  36. types module constants
  37. isinstance() global function (3.1+)
  38. basestring datatype
  39. itertools module
  40. sys.exc_type, sys.exc_value, sys.exc_traceback
  41. List comprehensions over tuples
  42. os.getcwdu() function
  43. Metaclasses
  44. Matters of style
    1. set() literals
    2. buffer() global function
    3. Whitespace around commas
    4. Common idioms

This site is optimized for Lynx just because fuck you.
I’m told it also looks good in graphical browsers.

© 2001-4, 2009 ark Pilgrim, CC-BY-3.0