为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以从函数内访问 exec 提供的全局字典?

是否可以从函数内访问 exec 提供的全局字典?

qq_遁去的一_1 2021-08-05 16:10:34
如果函数是在 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_()


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信