我想从被调用的函数中检索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
与其来电者位于不同的模块时,这必须有效。
答案 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}
>>>