请考虑以下代码段:
globalVar = 25
def myfunc(paramVar):
localVar = 30
print "Vars: {globalVar}, {paramVar}, {localVar}!".format(**VARS_IN_SCOPE)
myfunc(123)
VARS_IN_SCOPE
是我之后要使用的命令,其中包含globalVar
,paramVar
和localVar
等。
我希望基本上能够引用字符串内当前作用域内的所有变量。因此,预期的输出将是:
Vars: 25, 123, 30
我可以通过将**dict(globals().items() + locals().items())
传递到format()
来实现。这始终是正确的,还是在某些极端情况下此表达式将无法正确处理?
重写以澄清问题。
[在合并时合并两个字典的最佳方法是dict(globals(), **locals())
。
合并全局变量和本地变量的方法缺少(a)内置函数(我想这是故意的,即您不认为内置函数是“变量” ...但是,如果您选择这样做,它们可能就是这样!- )和(b)(如果您使用的是[[nested)函数,则是封闭函数局部的任何变量(没有一种很好的方法来获取所有those的字典,再加上-仅那些在嵌套函数中显式访问的函数(即其“自由变量”)无论如何都作为闭包中的单元生存)。]
我想这些问题对您的预期用途并不重要,但是您确实提到了“拐角案例” ;-)。如果您需要覆盖它们,可以使用多种方法来获取内置的(很简单)和(不是那么容易)所有单元格(来自您在嵌套函数中明确提到的封闭函数的变量)thefunction.func_code.co_freevars
以获取名称,thefunction.func_closure
获取单元格,每个单元格上的cell_contents
获取其值)。 (但是,请记住,这些将只是来自嵌套函数代码中显式访问
的封闭函数中的变量!)。