Python 201
Intermediate Python
Michael Driscoll
Contents
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Reader Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Errata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Part I - The Intermediate Modules . . . . . . . . . . . . . . . . . 4
Chapter 1 - An Intro to Argument Parsing using
argparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Adding Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Short Options and Long Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Options that Conflict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Chapter 2 - The collections module . . . . . . . . . . . . . . . . 10
ChainMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
defaultdict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
deque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
namedtuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
OrderedDict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Chapter 3 - Context Managers . . . . . . . . . . . . . . . . . . . . . 23
Creating a Context Manager class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Creating a Context Manager using contextlib . . . . . . . . . . . . . . . . . . . . . . . . 24
contextlib.closing(thing) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
contextlib.suppress(*exceptions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
contextlib.redirect_stdout / redirect_stderr . . . . . . . . . . . . . . . . . . . . . . . . . . 27
ExitStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Reentrant Context Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Chapter 4 - The functools module . . . . . . . . . . . . . . . . . 30
Caching with functools.lru_cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
functool.partial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Function Overloading with functools.singledispatch . . . . . . . . . . . . . . . . . . . . . 34
functools.wraps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Wraps to the Rescue! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Chapter 5 - All About Imports . . . . . . . . . . . . . . . . . . . . . 40
Regular Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Using “from module import something” . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Relative Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Optional Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Local Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Import Pitfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Chapter 6 - The importlib Module . . . . . . . . . . . . . . . . . 49
Dynamic Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Module Import Checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Import From Source File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
import_from_github_com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Chapter 7 - Iterators and Generators . . . . . . . . . . . . . . 54
Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Creating Your Own Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Chapter 8 - The itertools Module . . . . . . . . . . . . . . . . . . 61
The Infinite Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Iterators That Terminate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
CONTENTS
The Combinatoric Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Chapter 9 - Regular Expressions . . . . . . . . . . . . . . . . . . . 76
The Matching Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Pattern Matching Using search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Escape Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Compiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Compilation Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Finding Multiple Instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Backslashes Are Complicated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Chapter 10 - The typing Module . . . . . . . . . . . . . . . . . . . 84
Type Hints and Overloaded Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Part II - Odds and Ends . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Chapter 11 - Python Built-ins . . . . . . . . . . . . . . . . . . . . . . 90
any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
eval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Chapter 12 - Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Encoding / Decoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Chapter 13 - Benchmarking . . . . . . . . . . . . . . . . . . . . . . . . 101
timeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Importing timeit for Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Use a decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Create a Timing Context Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
cProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
line_profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
memory_profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
profilehooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Chapter 14 - Encryption and Cryptography . . . . . . . . 113
Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Key Derivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
PyCrypto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
The cryptography Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Chapter 15 - Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Basic SQL Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
adodbapi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
pyodbc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
pypyodbc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Object Relational Mappers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Chapter 16 - The super built-in . . . . . . . . . . . . . . . . . . . . 130
Python 2 vs Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Method Resolution Order (MRO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Chapter 17 - Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The Descriptor Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Calling a Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Descriptor Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Chapter 18 - Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Local Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Global Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
nonlocal Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Part III - Working with the Web . . . . . . . . . . . . . . . . . . . 147
Chapter 19 - Web Scraping . . . . . . . . . . . . . . . . . . . . . . . . 148
Tips for Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Preparing to Scrape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
BeautifulSoup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Scrapy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Chapter 20 - Web APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Twitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Reddit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Wikipedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Other API Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Chapter 21 - Working with FTP . . . . . . . . . . . . . . . . . . . . 165
Connecting to an FTP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Navigating Directories with ftplib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Downloading a File via FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Uploading Files to an FTP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Chapter 22 - The urllib Module . . . . . . . . . . . . . . . . . . . . 170
urllib.request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
urllib.parse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
urllib.robotparser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Part IV - Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Chapter 23 - The doctest Module . . . . . . . . . . . . . . . . . . 177
How it Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Check Your Test With a Text File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Option Flags and Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Chapter 24 - The unittest Module . . . . . . . . . . . . . . . . . . 183
A Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Command-Line Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Creating a More Complex Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Creating Test Suites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
How to Skip Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Integrating with doctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Chapter 25 - The mock Module . . . . . . . . . . . . . . . . . . . . 198
Simple Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Side Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Autospeccing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
The Patch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Chapter 26 - An Intro to coverage.py . . . . . . . . . . . . . . 203
Additional Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Part V - Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Chapter 27 - The asyncio Module . . . . . . . . . . . . . . . . . . 211
Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
async and await . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
A Coroutine Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Scheduling Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Chapter 28 - The threading Module . . . . . . . . . . . . . . . . 218
Intro to threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Locks and Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Other Thread Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Thread Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Chapter 29 - The multiprocessing Module . . . . . . . . . 231
Getting Started With Multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
The Pool Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Process Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Chapter 30 - The concurrent.futures Module . . . . . . . 239
Creating a Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Deadlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
- Log in to post comments