从Python中调用命名空间获取本地人员

时间:2011-07-08 00:47:06

标签: python metaprogramming

我想从被调用的函数中检索Python中的局部变量。有没有办法做到这一点?我意识到这不适合大多数编程,但我基本上构建了一个调试器。例如:

def show_locals():
  # put something in here that shows local_1.

local_1 = 123
show_locals()  # I want this to show local_1.

我在show_locals的身体里放了什么?如果我必须修改调用语句,我可以进行的最小修改是什么?

注意:show_locals与其来电者位于不同的模块时,这必须有效。

3 个答案:

答案 0 :(得分:62)

如果您正在编写调试器,则需要大量使用inspect模块:

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

答案 1 :(得分:0)

也许值得指出的是,从呼叫者的堆栈框架读取的已接受答案中的技术:

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

还可以写入调用者的名称空间:

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

如果将其放在名为“ access_caller”的模块中,则

import access_caller
access_caller.write_in_caller('y', x)

是一种精心编写的方式

y = x

(我写这是一个新的答案,因为我没有足够的声誉点来发表评论。)

答案 2 :(得分:-3)

您使用python builtin,dir()或vars():

VARS(对象)

有关使用dir()的示例,请参阅:this post

使用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())
{}

一个可能存在问题的事实:新样式类不会返回相同的结果

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

另外:对于实例化的类(新旧样式),如果在实例化后添加变量,vars将返回对象的 dict ,如下所示:

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

请参阅:http://docs.python.org/library/functions.html#vars