Get locals from calling namespace in Python Get locals from calling namespace in Python python python

Get locals from calling namespace in Python


If you're writing a debugger, you'll want to make heavy use of the inspect module:

def show_callers_locals():    """Print the local variables in the caller's frame."""    import inspect    frame = inspect.currentframe()    try:        print(frame.f_back.f_locals)    finally:        del frame


Perhaps it is worth pointing out that the technique from the accepted answer that reads from the caller's stack frame:

import inspectdef read_from_caller(varname):    frame = inspect.currentframe().f_back    try:        v = frame.f_locals[varname]        return v    finally:        del frame

can also write into the caller's namespace:

import inspectdef write_in_caller(varname, v):    frame = inspect.currentframe().f_back    try:        frame.f_locals[varname] = v    finally:        del frame

If you put that in a module called "access_caller", then

import access_calleraccess_caller.write_in_caller('y', x)

is an elaborate way of writing

y = x

(I am writing this as a fresh answer because I don't have enough reputation points to write a comment.)


You use the python builtin, dir() or vars():

vars(object)

For examples using dir(), see: this post

Examples using vars:

>>> class X:...     a=1...     def __init__(self):...         b=2... >>> >>> vars(X){'a': 1, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x100488848>}>>> >>> vars(X()){}

A potentially problematic fact: New style classes not return the same result

>>> class X(object):...     a=1...     def __init__(self):...         b=2... >>> >>> vars(X)<dictproxy object at 0x1004a1910>>>> vars(X()){}

Also: for an instantiated class (new and old style), if you add a variable after instantiating, vars will return the object's dict like this:

>>> x = X() >>> x.c = 1>>> vars(x){'c': 1}>>> 

See: http://docs.python.org/library/functions.html#vars