如何在python中获取当前作用域
是否有任何引用指向当前范围,我查阅了许多文章,但找不到答案,例如,我想打印当前范围内每个var的内容如何在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
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中使用了tweakprint(local\u var)
。这是对调用堆栈帧的迭代,而不是定义范围。您希望访问父作用域,而不是父堆栈帧。