如果函数是在 exec 代码之外定义的(因此已经绑定到不同的__globals__),是否可以从函数内部访问 exec 提供的全局字典?换句话说,有没有办法让下面的例子工作?def f(): log("Hi")exec('f()', {'f': f, 'log': print})一般来说,是否可以替换__globals__函数的 ?
2 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
不确定我的解释是否完全正确。简而言之,该示例无法在 Python 3 中运行。
原因是 2 种情况的组合:[1] -exec是 Python 3 中的函数,[2] - 您尝试执行的代码包含函数调用。
当您为globals函数提供可选参数时,exec它是该函数的局部作用域。所以下面的例子有效:
exec('log("Hi")', {'log': print})
但是原版没有。因为在原始示例中,您调用了函数f. 它有自己的本地范围。Python 是做什么的?它检查全局作用域(程序的实际全局作用域)和最内层作用域(函数的局部作用域f)。两个范围都缺少log,你得到NameError.
您可以使用两个常规函数获得完全相同的行为(相同的错误):
def f():
log("Hi")
def f_():
log = print
f()
f_()
添加回答
举报
0/150
提交
取消