我想从被调用的函数中检索 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
与其调用者位于不同的模块中时,这必须有效。
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
也许值得指出的是,从调用者的堆栈框架中读取的已接受答案中的技术:
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
(我写这个作为一个新的答案,因为我没有足够的声誉点来写评论。)
您使用 python 内置的 dir() 或 vars():
变量(对象)
有关使用 dir() 的示例,请参阅:这篇文章
使用变量的例子:
>>> 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}
>>>