Although not directly an answer to the OP question, there is a pretty sweet way of finding out what variables are in scope in a function. take a look at this code:
>>> def f(x, y):
    z = x**2 + y**2
    sqrt_z = z**.5
    return sqrt_z
>>> f.func_code.co_varnames
('x', 'y', 'z', 'sqrt_z')
>>> 
The func_code attribute has all kinds of interesting things in it. It allows you todo some cool stuff. Here is an example of how I have have used this:
def exec_command(self, cmd, msg, sig):
    def message(msg):
        a = self.link.process(self.link.recieved_message(msg))
        self.exec_command(*a)
    def error(msg):
        self.printer.printInfo(msg)
    def set_usrlist(msg):
        self.client.connected_users = msg
    def chatmessage(msg):
        self.printer.printInfo(msg)
    if not locals().has_key(cmd): return
    cmd = locals()[cmd]
    try:
        if 'sig' in cmd.func_code.co_varnames and \
                       'msg' in cmd.func_code.co_varnames: 
            cmd(msg, sig)
        elif 'msg' in cmd.func_code.co_varnames: 
            cmd(msg)
        else:
            cmd()
    except Exception, e:
        print '\n-----------ERROR-----------'
        print 'error: ', e
        print 'Error proccessing: ', cmd.__name__
        print 'Message: ', msg
        print 'Sig: ', sig
        print '-----------ERROR-----------\n'