I’m starting to code in various projects using Python (including Django web development and Panda3D game development).
To help me understand what’s going on, I would like to basically ‘look’ inside the Python objects to see how they tick – like their methods and properties.
So say I have a Python object, what would I need to print out its contents? Is that even possible?
Python has a strong set of introspection features.
Take a look at the following built-in functions:
dir() are particularly useful for inspecting the type of an object and its set of attributes, respectively.
I’m surprised no one’s mentioned help yet!
In : def foo(): ...: "foo!" ...: In : help(foo) Help on function foo in module __main__: foo() foo!
Help lets you read the docstring and get an idea of what attributes a class might have, which is pretty helpful.
First, read the source.
Second, use the
If this is for exploration to see what’s going on, I’d recommend looking at IPython. This adds various shortcuts to obtain an objects documentation, properties and even source code. For instance appending a “?” to a function will give the help for the object (effectively a shortcut for “help(obj)”, wheras using two ?’s (“
func??“) will display the sourcecode if it is available.
There are also a lot of additional conveniences, like tab completion, pretty printing of results, result history etc. that make it very handy for this sort of exploratory programming.
For more programmatic use of introspection, the basic builtins like
getattr etc will be useful, but it is well worth your time to check out the inspect module. To fetch the source of a function, use “
inspect.getsource” eg, applying it to itself:
print inspect.getsource(inspect.getsource) def getsource(object): """Return the text of the source code for an object. The argument may be a module, class, method, function, traceback, frame, or code object. The source code is returned as a single string. An IOError is raised if the source code cannot be retrieved.""" lines, lnum = getsourcelines(object) return string.join(lines, '')
inspect.getargspec is also frequently useful if you’re dealing with wrapping or manipulating functions, as it will give the names and default values of function parameters.
If you’re interested in a GUI for this, take a look at objbrowser. It uses the inspect module from the Python standard library for the object introspection underneath.
You can list the attributes of a object with dir() in the shell:
dir(object()) ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Of course, there is also the inspect module: http://docs.python.org/library/inspect.html#module-inspect
"""Visit http://diveintopython.net/""" __author__ = "Mark Pilgrim (email@example.com)" def info(object, spacing=10, collapse=1): """Print methods and doc strings. Takes module, class, list, dictionary, or string.""" methodList = [e for e in dir(object) if callable(getattr(object, e))] processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) print "n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList]) if __name__ == "__main__": print help.__doc__