| #! /usr/bin/env python | 
 |  | 
 | import marshal | 
 | import dis | 
 | import types | 
 |  | 
 | def dump(obj): | 
 |     print obj | 
 |     for attr in dir(obj): | 
 |         if attr.startswith('co_'): | 
 |             val = getattr(obj, attr) | 
 |             print "\t", attr, repr(val) | 
 |  | 
 | def loadCode(path): | 
 |     f = open(path) | 
 |     f.read(8) | 
 |     co = marshal.load(f) | 
 |     f.close() | 
 |     return co | 
 |  | 
 | def walk(co, match=None): | 
 |     if match is None or co.co_name == match: | 
 |         dump(co) | 
 |         print | 
 |         dis.dis(co) | 
 |     for obj in co.co_consts: | 
 |         if type(obj) == types.CodeType: | 
 |             walk(obj, match) | 
 |  | 
 | def load(filename, codename=None): | 
 |     co = loadCode(filename) | 
 |     walk(co, codename) | 
 |  | 
 | if __name__ == "__main__": | 
 |     import sys | 
 |     if len(sys.argv) == 3: | 
 |         filename, codename = sys.argv[1:] | 
 |     else: | 
 |         filename = sys.argv[1] | 
 |         codename = None | 
 |     if filename.endswith('.py'): | 
 |         buf = open(filename).read() | 
 |         co = compile(buf, filename, "exec") | 
 |         walk(co) | 
 |     else: | 
 |         load(filename, codename) |