首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中从调用命名空间中获取本地变量

在Python中从调用命名空间中获取本地变量
EN

Stack Overflow用户
提问于 2011-07-08 08:47:06
回答 3查看 10.6K关注 0票数 40

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

代码语言:javascript
复制
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和它的调用者在不同的模块中时,这必须起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-08 08:52:25

如果您正在编写调试器,您将希望大量使用inspect模块:

代码语言:javascript
复制
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
票数 77
EN

Stack Overflow用户

发布于 2020-07-14 06:21:13

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

代码语言:javascript
复制
import inspect
def read_from_caller(varname):
    frame = inspect.currentframe().f_back
    try:
        v = frame.f_locals[varname]
        return v
    finally:
        del frame

还可以写入调用方的命名空间:

代码语言:javascript
复制
import inspect
def write_in_caller(varname, v):
    frame = inspect.currentframe().f_back
    try:
        frame.f_locals[varname] = v
    finally:
        del frame

如果您将其放入名为"access_caller“的模块中,那么

代码语言:javascript
复制
import access_caller
access_caller.write_in_caller('y', x)

是一种精心设计的写作方式

代码语言:javascript
复制
y = x

(我写这篇文章是作为新的答案,因为我没有足够的名誉点来写评论。)

票数 2
EN

Stack Overflow用户

发布于 2011-07-08 09:36:24

您可以使用python内置的dir()或vars():

vars(对象)

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

使用vars的示例:

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

一个潜在的问题:新的样式类不会返回相同的结果

代码语言:javascript
复制
>>> class X(object):
...     a=1
...     def __init__(self):
...         b=2
... 
>>> 
>>> vars(X)
<dictproxy object at 0x1004a1910>
>>> vars(X())
{}

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

代码语言:javascript
复制
>>> x = X() 
>>> x.c = 1
>>> vars(x)
{'c': 1}
>>> 

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6618795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档