14.1 Introduction
Credit: Mark Hammond, co-author of Python Programming on
Win32 (O'Reilly)
The first computer I had in my home was
a 64-KB Z80 CP/M machine. Having the machine available at home meant
I had much more time to deeply explore this exciting toy. Turbo
Pascal had just been released, and it seemed the obvious progression
from the various BASIC dialects and assemblers I had been using. Even
then, I was somehow drawn towards developing reusable libraries for
my programs, and as my skills and employment progressed, I remained
drawn to building tools that assist developers as much as building
end-user applications.
Building tools for developers means that debugging and testing are
often in the foreground. Although images of an interactive debugger
may pop into your head, the concepts of debugging and testing are
much broader than you may initially think. Debugging and testing are
sometimes an inseparable cycle. Your testing will often lead you to
discover bugs. You debug until you believe you understand the cause
of the error and make the necessary changes. Rinse and repeat as
required.
Often, debugging and testing are more insidious. I am a big fan of
Python's assert statement, and
every time I use it, I am debugging and testing my program. Large
projects will often develop strategies to build
debugging
and testing capabilities directly into the application itself, such
as centralized logging and error handling. In larger projects, it
could be argued that this style of debugging and testing is more
critical than the post mortem activities I just described.
Python, in particular, supports a variety of techniques to help
developers in their endeavors. The introspective and dynamic nature
of Python (the result of Guido's
"we are all consenting adults"
philosophy of programming) means that your opportunities for
debugging techniques are limited only by your imagination. You can
replace functions at runtime, add methods to classes, and extract
everything about your program that there is to know. All at runtime,
and all quite simple and Pythonic.
In this chapter, you will find a nice collection of recipes from
which even the most hardened critic will take gastronomic delight.
Whether you want customized error logging, deep diagnostic
information in Python tracebacks, or even help with your garbage, you
have come to the right place. So tuck in your napkin; your next
course has arrived!
|