"""
"s" is a string containing a Python statement. "objstrlist" is a list of strings where each string is a python expression. An example is watch('x = 2 * [[]]', ['x[0]', 'x[1]'] """
import string

# "s" is a string containing a Python statement. "objstrlist" is a list of
# strings where each string is a python expression. An example is
#      watch('x = 2 * [[]]', ['x[0]', 'x[1]']
def watch(s, objstrlist):
    exec s in globals(), {}
    print 'After executing "%s"' % s
    for objstr in objstrlist:
        v = eval(objstr)
        t = str(type(v))[7:-2]
        print '%10s : value %10s, id %9i, type %-10s' % \
             (objstr, v, id(v), t)

# Executes the statement, or list of statements, s, then prints information
# about all the local variables that were created.
def watchall(s):
    if type(s) == type([]):
        lines = s
    else:
        lines = string.split(s, '\n')

    prog = string.join(lines, '\n')

    # It appears that some python programs need to end in a newline.
    if prog[-1] != '\n':
        prog = prog + '\n'

    loc = {}
    exec prog in globals(), loc

    print 'After executing'
    for line in lines:
        print '-> ', line

    for objstr in loc.keys():
        v = loc[objstr]
        t = str(type(v))[7:-2]
        print '%10s : value %10s, id %9i, type %-10s' % \
             (objstr, v, id(v), t)

# Same as watchall but prints information about elements of lists.
def watchall1(s):
    if type(s) == type([]):
        lines = s
    else:
        lines = string.split(s, '\n')

    prog = string.join(lines, '\n')
    # It appears that some python programs need to end in a newline.

    if prog[-1] != '\n':
        prog = prog + '\n'

    loc = {}
    exec prog in globals(), loc

    print 'After executing'
    for line in lines:
        print '-> ', line

    for objstr in loc.keys():
        v = loc[objstr]
        t = str(type(v))[7:-2]
        print '%10s : value %10s, id %9i, type %-10s' % \
             (objstr, v, id(v), t)
        if type(v) == type([]):
            for i in range(len(v)):
                t = str(type(v[i]))[7:-2]
                print '%7s[%i] : value %10s, id %9i, type %-10s' % \
                    (objstr, i, v[i], id(v[i]), t)

if __name__ == '__main__':
    prog = [
       "for i in range(3):",
       "    print i"
    ]
    watchall(prog)
#