[英]Why does Python3 exec() raise an AttributeError when a variable is not in locals but is in gl
[英]Why does Python 3 exec() fail when specifying locals?
以下代碼在Python 3中執行時沒有錯誤:
code = """
import math
def func(x):
return math.sin(x)
func(10)
"""
_globals = {}
exec(code, _globals)
但是,如果我也嘗試捕獲局部變量dict,它將失敗並顯示NameError
:
>>> _globals, _locals = {}, {}
>>> exec(code, _globals, _locals)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-aeda81bf0af1> in <module>()
----> 1 exec(code, {}, {})
<string> in <module>()
<string> in func(x)
NameError: name 'math' is not defined
為什么會發生這種情況,如何在捕獲全局變量和局部變量的同時執行此代碼?
從exec()
文檔中 :
請記住,在模塊級別,全局變量和本地變量是同一字典。 如果
exec
獲得兩個單獨的對象作為globals和locals ,則代碼將像嵌入在類定義中一樣執行。
您傳入了兩個單獨的字典,但是嘗試執行需要使用模塊范圍全局變量的代碼。 在類中import math
將產生局部范圍屬性 ,並且您創建的函數將無法訪問該屬性 ,因為函數閉包不考慮類范圍名稱。
請參閱Python執行模型參考中的命名和綁定 :
在名稱解析的上下文中,
exec()
和eval()
類定義塊和參數是特殊的。 類定義是可以使用和定義名稱的可執行語句。 這些引用遵循通常的名稱解析規則,但在全局命名空間中查找未綁定的局部變量。 類定義的名稱空間成為該類的屬性字典。 在類塊中定義的名稱范圍僅限於該類塊。 它不會擴展到方法[。]的代碼塊
您可以通過嘗試在類定義中執行代碼來重現該錯誤:
>>> class Demo:
... import math
... def func(x):
... return math.sin(x)
... func(10)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in Demo
File "<stdin>", line 4, in func
NameError: name 'math' is not defined
只需傳遞一本字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.