如何在python中获取当前作用域

如何在python中获取当前作用域,python,scope,Python,Scope,是否有任何引用指向当前范围,我查阅了许多文章,但找不到答案,例如,我想打印当前范围内每个var的内容 for x in list(locals()): print(x) 但只给我这个,变量的名字 __builtins__ __file__ __package__ __cached__ __name__ __doc__ 我不想要这样的代码 print(__builtins__) print(__file__) print(__package__) print(__cached__) p

是否有任何引用指向当前范围,我查阅了许多文章,但找不到答案,例如,我想打印当前范围内每个var的内容

for x in list(locals()):
    print(x)
但只给我这个,变量的名字

__builtins__
__file__
__package__
__cached__
__name__
__doc__
我不想要这样的代码

print(__builtins__)
print(__file__)
print(__package__)
print(__cached__)
print(__name__)
print(__doc__)
....

要仅打印
locals()
中不以
''开头的变量名,请执行以下操作:

for local_var in list(locals()):
    if not local_var.startswith('__'): print local_var

要同时获取这些值,可以使用:

for symbol, value in locals().items():
    print symbol, value
locals()为您提供一个dict。对dict进行迭代将为您提供其键。要获取(键、值)对的列表,请使用items方法。

您所说的“当前范围”是什么意思?如果您仅指局部变量,则
locals()
是正确答案。 如果你指的是你可以使用的所有标识符[局部+全局+非局部],那么事情就会变得更混乱。也许更简单的解决方案是一个


如果你不想要
。..*.
变量,只需过滤掉它们。

大量的过度杀伤力。。。将本地名称空间的筛选和打印包装到函数中

我不推荐这个。我张贴它主要是为了表明它可以做到,并获得评论

import inspect

def print_local_namespace():
    ns = inspect.stack()[1][0].f_locals
    for k, v in ns.iteritems():
        if not k.startswith('__'):
            print '{0} : {1}'.format(k, v)


def test(a, b):
    c = 'Freely'
    print_local_namespace()
    return a + b + c


test('I', 'P')

下划线变量是当前范围的一部分。如果你不想要,就跳过它们。@gecco他想打印变量的值,而不是跳过它们。他文章中的for循环打印变量的名称,而不是在那里。如果你运行代码,就会显示这些,RuntimeError:dictionary在迭代过程中改变了大小你使用的是什么版本的python?我已将代码更改为使用2.7的代码。这在Python 3.6中失败,并出现相同的运行时错误。为了避免运行时错误:字典在迭代过程中更改了大小,请使用以下代码:d={k:v代表k,v在locals()中。items()if v}复制字典,然后像上面那样打印符号和值。获取Python2“f字符串”的好技巧,
“我希望我有f-strings”。format(**locals())
这在Python3中使用了tweak
print(local\u var)
。这是对调用堆栈帧的迭代,而不是定义范围。您希望访问父作用域,而不是父堆栈帧。