Python 获取当前范围内所有变量及其值的dict

Python 获取当前范围内所有变量及其值的dict,python,Python,考虑一下这个片段: globalVar = 25 def myfunc(paramVar): localVar = 30 print "Vars: {globalVar}, {paramVar}, {localVar}!".format(**VARS_IN_SCOPE) myfunc(123) 其中,VARS\u IN_SCOPE是我所追求的目标,它将包含globalVar、paramVar和localVar,以及其他内容 我希望基本上能够引用字符串中当前作用域中的所有变量

考虑一下这个片段:

globalVar = 25

def myfunc(paramVar):
    localVar = 30
    print "Vars: {globalVar}, {paramVar}, {localVar}!".format(**VARS_IN_SCOPE)

myfunc(123)
其中,
VARS\u IN_SCOPE
是我所追求的目标,它将包含
globalVar
paramVar
localVar
,以及其他内容

我希望基本上能够引用字符串中当前作用域中的所有变量。因此,预期产出为:

Vars:2512330

我可以通过将
**dict(globals().items()+locals().items())
传递到
format()
来实现这一点。这是否总是正确的,或者该表达式是否会错误地处理某些特殊情况


重写以澄清问题。

这是否符合您的意图

d = dict(globals())
d.update(locals())
如果我正确阅读了文档,您可以创建一个
globals()
dict的副本,然后覆盖所有副本并从
locals()
dict插入新条目(因为
locals()
应该在您的范围内具有首选项)


我还没有找到一个合适的函数来返回调用函数范围内的完整变量字典。下面是代码(我只使用pprint对输出进行了良好的格式化):

以及输出:

 {'PrettyPrinter': <class pprint.PrettyPrinter at 0xb7d316ec>,
 '__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__file__': 'temp.py',
 '__name__': '__main__',
 '__package__': None,
 'allvars_bad': <function allvars_bad at 0xb7d32b1c>,
 'd': <Recursion on dict with id=3084093748>,
 'fake_temp_var': 1,
 'foo_bad': <function foo_bad at 0xb7d329cc>,
 'foo_good': <function foo_good at 0xb7d32f0c>,
 'isreadable': <function isreadable at 0xb7d32c34>,
 'isrecursive': <function isrecursive at 0xb7d32c6c>,
 'pformat': <function pformat at 0xb7d32bc4>,
 'pprint': <function pprint at 0xb7d32b8c>,
 'saferepr': <function saferepr at 0xb7d32bfc>}
{'PrettyPrinter': <class pprint.PrettyPrinter at 0xb7d316ec>,
 '__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__file__': 'temp.py',
 '__name__': '__main__',
 '__package__': None,
 'allvars_bad': <function allvars_bad at 0xb7d32b1c>,
 'd': <Recursion on dict with id=3084093884>,
 'fake_temp_var': 'good',
 'foo_bad': <function foo_bad at 0xb7d329cc>,
 'foo_good': <function foo_good at 0xb7d32f0c>,
 'isreadable': <function isreadable at 0xb7d32c34>,
 'isrecursive': <function isrecursive at 0xb7d32c6c>,
 'pformat': <function pformat at 0xb7d32bc4>,
 'pprint': <function pprint at 0xb7d32b8c>,
 'saferepr': <function saferepr at 0xb7d32bfc>,
 'x': 5}
-->

{'PrettyPrinter':,
“内置的”:,
“文件”:无,
“\uuuuuuuuuu文件”:“temp.py”,
“uuu name:”uuu main_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
“\uuuu包”:无,
"a":1,,
“allvars_bad”:,
“一切都很好”:,
“b”:2,
“foo_bad”:,
“福好”:,
“foo_good2”:,
“isreadable”:,
“isrecursive”:,
“pformat”:,
“pprint”:,
“saferepr”:,
'sys':}

您可以自己制作:

allvars = dict()
allvars.update(globals())
allvars.update(locals())
或者将前两行合并:

allvars = dict(globals())
allvars.update(locals())

插入字符串是最简单的方法。只需列出您的变量。Python为您检查局部和全局

globalVar = 25

def myfunc(paramVar):
    localVar = 30
    print "Vars: %d, %d, %d!" % ( globalVar, paramVar, localVar )

myfunc(123)

合并两个dict的最佳方法(局部变量覆盖全局变量)是
dict(globals(),**locals())

合并全局变量和局部变量的方法缺少的是(a)内置变量(我想这是故意的,也就是说,你不认为内置变量是“变量”…但是,如果你这样选择的话,它们可能是!-),和(b)如果你在嵌套函数中,任何封闭函数的局部变量(没有真正好的方法来获取包含所有这些内容的dict,而且——无论如何,只有那些在嵌套函数中显式访问的内容(即其中的“自由变量”)作为闭包中的单元存在)

我想这些问题对您的预期用途来说没什么大不了的,但您确实提到了“角落案例”;-)。如果你需要覆盖它们,有几种方法可以获得内置的(这很容易)和(不那么容易)所有的单元(来自嵌套函数中明确提到的封闭函数的变量--
thefunction.func\u code.co\u freevars
获取名称,
thefunction.func\u closure
获取单元格,
cell\u contents
获取每个单元格的值)。(但是,请记住,这些变量只能是嵌套函数代码中显式访问的封闭函数中的变量!)。

Python 3.5或更高版本:

globalVar = 25

def myfunc(paramVar):
    localVar = 30
    print("Vars: {globalVar}, {paramVar}, {localVar}!".format(**{**locals(), **globals()}))

myfunc(123)

为什么要这样做?很可能,有一种更好的方法可以做你想做的任何事情。我想这段代码会很清楚。我想在字符串中插入变量。当然,可能有更好的方法。请随意建议一种方法作为答案。抱歉,这段代码没有解释你为什么需要这样的东西。另外,参数只是局部的——它不是一个单独的作用域。好吧,你是对的,重写了,希望能让它更清晰。没有太多。你仍然没有解释为什么要这样做,这使得你很难告诉你做你想做的事情的最佳方式是什么。我只能想到一种情况,那就是如果你想做模板,在这种情况下,有一个y是Python的大量模板解决方案。为了回答你的问题,我不知道:)这实际上是我想知道的-仅仅结合两者是否是正确的做法。是的,不幸的是,局部变量()必须在那里。与globals()类似-它必须在同一个模块中工作。我想知道是否有一些sys.\u getframe()可以改用诡计。这不是插值。--Python没有插值,但使用.format()函数可以非常接近。如果您想知道我为什么不喜欢它,请考虑以下内容:打印“{path}/myscript.py--input{path}/file1--output{path}/file2”。format(**locals())-带“%”我需要传递路径三次。由于变量太多,这将成为一场彻头彻尾的噩梦。@romkyns:事实并非如此。字符串
%
运算符可以接受dict参数,而无需使用
**
将其解包,就像
格式
那样:打印“%(path)s/myscript.py--input%(path)s/file1--output%(path)s/file2”%locals()奇怪的是,无法从嵌套函数中获取所有变量。有人知道为什么
locals()
不起作用吗?似乎应该!
allvars = dict(globals())
allvars.update(locals())
globalVar = 25

def myfunc(paramVar):
    localVar = 30
    print "Vars: %d, %d, %d!" % ( globalVar, paramVar, localVar )

myfunc(123)
globalVar = 25

def myfunc(paramVar):
    localVar = 30
    all_vars = locals.copy()
    all_vars.update(globals())
    print "Vars: {globalVar}, {paramVar}, {localVar}!".format(all_vars)

myfunc(123)
globalVar = 25

def myfunc(paramVar):
    localVar = 30
    print("Vars: {globalVar}, {paramVar}, {localVar}!".format(**{**locals(), **globals()}))

myfunc(123)