如果函數是在 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
提交
取消