簡體   English   中英

指定本地人時,為什么Python 3 exec()失敗?

[英]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獲得兩個單獨的對象作為globalslocals ,則代碼將像嵌入在類定義中一樣執行。

您傳入了兩個單獨的字典,但是嘗試執行需要使用模塊范圍全局變量的代碼。 在類中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM