A neat Python debugger command
pdb
is a console-mode debugger built into Python. Out of the box,
it has basic features like variable inspection, breakpoints, and stack
frame walking, but it lacks more advanced capabilities.
Fortunately, it can be customized with a .pdbrc
file in the user's home
directory. Ned Batchelder has several helpful commands in his .pdbrc
file:
pl
: print local variablespi obj
: print the instance variables ofobj
ps
: print the instance variables ofself
Printing instance variables is great for quickly inspecting objects, but it shows only one half of the picture. What about the class-side of objects? Properties and methods are crucial for understanding what can actually be done with an object, in contrast to what data it encapsulates.
Since I couldn't find a readily available pdb command for listing class contents, I wrote my own:
# Print contents of an object's class (including bases).
alias pc for k,v in sorted({k:v for cls in reversed(%1.__class__.__mro__) for k,v in cls.__dict__.items() if cls is not object}.items()): print("%s%-20s= %-80.80s" % ("%1.",k,repr(v)))
pc
lists the contents of an object's class and its base classes. Typically,
these are the properties and methods supported by the object.
It is used like
this:
# 'proc' is a multiprocessing.Process() instance.
(Pdb) pc proc
...
proc.daemon = <property object at 0x036B9A20>
proc.exitcode = <property object at 0x036B99C0>
proc.ident = <property object at 0x036B9A50>
proc.is_alive = <function BaseProcess.is_alive at 0x033E4618>
proc.join = <function BaseProcess.join at 0x033E45D0>
proc.name = <property object at 0x036B99F0>
proc.pid = <property object at 0x036B9A50>
proc.run = <function BaseProcess.run at 0x033E4A98>
proc.start = <function BaseProcess.start at 0x033E4DB0>
proc.terminate = <function BaseProcess.terminate at 0x033E4DF8>
Note the difference to pi
, which lists the contents of the proc
instance:
(Pdb) pi proc # In contrast, here is the image dictionary.
proc._args = ()
proc._config = {'authkey': b'\xd0\xc8\xbd\xd6\xcf\x7fo\xab\x19_A6\xf8M\xd4\xef\x88\xa9;\x99c\x9
proc._identity = (2,)
proc._kwargs = {}
proc._name = 'Process-2'
proc._parent_pid = 1308
proc._popen = None
proc._target = None
In general, pc
focuses on the interface while pi
examines the state
of the object. The two complement each other nicely. Especially when working
with an unfamiliar codebase, pc
is helpful for quickly figuring out how to
use a specific class.
pc
works with both Python 2 and Python 3 (on Python 2 it only shows
new-style classes). Add it to your .pdbrc
and give it a try. Let me
know what you think!