3

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

for x in list(locals()):
    print(x)

但只给我这个,var的名字

__builtins__
__file__
__package__
__cached__
__name__
__doc__

我不想要这样的代码

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

4 回答 4

4

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

for symbol, value in locals().items():
    print symbol, value

locals() 给你一个字典。迭代一个 dict 会给你它的键。要获取 (key, value) 对的列表,请使用 items 方法。

于 2012-08-31T09:11:10.533 回答
4

大量的矫枉过正......将本地命名空间的过滤和打印包装在一个函数中。

我不推荐这个。我发布它主要是为了表明它可以完成并获得评论。

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')
于 2012-08-31T09:56:29.420 回答
2

“当前范围”是什么意思?如果您的意思只是局部变量,那么locals()是正确的答案。如果您指的是可以使用的所有标识符 [locals + globals + nonlocals ],那么事情就会变得更加混乱。可能更简单的解决方案就是这个

如果您不想要__.*__变量,只需将它们过滤掉即可。

于 2012-08-31T09:44:05.673 回答
2

locals()只打印那些不以 开头的变量名'__'

for local_var in list(locals()):
    if not local_var.startswith('__'): print local_var
于 2012-08-31T09:01:33.807 回答