亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python exec 的函數鏈產生 NameError

Python exec 的函數鏈產生 NameError

梵蒂岡之花 2024-01-27 15:06:08
考慮以下腳本,它用于exec定義兩個函數,其中一個調用另一個:def run_code():  code = """def foo():  print('foo')  return 1def bar():  print('bar calls foo')  return 1 + foo()result = bar()"""  exec(code, globals(), locals())  print('Result: {}'.format(locals()['result']))run_code()我希望看到以下輸出:bar calls foofooResult: 2但相反,我得到以下輸出+堆棧跟蹤:bar calls fooTraceback (most recent call last):  File "minimal.py", line 17, in <module>    run_code()  File "minimal.py", line 14, in run_code    exec(code, globals(), locals())  File "<string>", line 10, in <module>  File "<string>", line 8, in barNameError: name 'foo' is not defined有趣的是,如果將 的內容run_code移至模塊級別,那么它就可以正常工作。但是,如果我隨后用新的空字典替換globals()or locals(),它會再次中斷。我也知道,放進def foo體內bar就能發揮作用。為什么會發生此錯誤?正確的解決方法是什么?(我知道這exec通常會讓人皺眉。我使用它是有充分理由的。)
查看完整描述

2 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

從文檔中:

如果提供的話,局部變量可以是任何映射對象。請記住,在模塊級別,全局變量和局部變量是相同的字典。如果 exec 獲取兩個單獨的對象作為全局對象和局部對象,則代碼將像嵌入在類定義中一樣執行。

并且類定義不會創建封閉范圍,請注意,這就是為什么您不能在不使用 的情況下從另一個方法調用方法self。所以只要把字典傳過去就可以了globals()?;蛘邔蓚€相同的字典傳遞給兩個參數。

In [4]: def run_code():

? ?...:? ? ?code = """

? ?...: def foo():

? ?...:? ?print('foo')

? ?...:? ?return 1

? ?...:

? ?...: def bar():

? ?...:? ?print('bar calls foo')

? ?...:? ?return 1 + foo()

? ?...:

? ?...: result = bar()

? ?...: """

? ?...:? ? ?namespace = {}

? ?...:? ? ?exec(code, namespace)

? ?...:? ? ?print('Result: {}'.format(namespace['result']))

? ?...:


In [5]: run_code()

bar calls foo

foo

Result: 2


查看完整回答
反對 回復 2024-01-27
?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

code = """  

def foo():

  print('foo')

  return 1


def bar():

  global foo;

  print('bar calls foo')

  return 1 + foo()


result = bar()

"""

def run_code():

    exec(code, globals(), locals())

    print('Result: {}'.format(locals()['result']))



run_code()

輸出:


bar calls foo

foo

Result: 2


查看完整回答
反對 回復 2024-01-27
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號