我不是python的專家,所以當我嘗試瞭解變量作用域的細微差別時,請耐心等待。模塊和變量作用域
作爲一個簡單的例子,描述了我面臨的問題,說我有以下三個文件。
第一個文件是outside_code.py。由於某些限制,我無法修改此文件。它必須照原樣。它包含了一些代碼,在某些時候運行eval(是的,我知道eval是撒旦的產卵,但是這是一個討論的一天)。例如,假設它包含以下幾行代碼:
def eval_string(x):
return eval(x)
第二個文件是一組用戶定義的函數。我們稱之爲functions.py。它包含一些未知數量的函數定義,例如,讓我們說,functions.py包含一個函數,定義如下:
def foo(x):
print("Your number is {}!".format(x))
現在我寫的第三個文件,姑且稱之爲main.py.其中包含以下代碼:
import outside_code
from functions import *
outside_code.eval_string("foo(4)")
我導入所有的函數定義從functions.py帶*,所以他們應該是main.py訪問,而不需要像做functions.foo()。我還導入outside_code.py,以便可以訪問其核心功能,即包含eval的代碼。最後,我在outside_code.py中調用該函數,傳遞一個與functions.py中定義的函數相關的字符串。
在簡化示例中,我希望代碼打印出「您的號碼是4!」。但是,我收到一個錯誤,指出'foo'未定義。這顯然意味着outside_code.py中的代碼無法訪問main.py中存在的相同foo函數。所以不知何故,我需要讓foo可以訪問它。任何人都可以告訴我到目前爲止foo的範圍,以及如何擴展它以覆蓋我真正想要使用它的空間?解決我的問題的最佳方法是什麼?
謝謝。我試圖理解變量(函數)。當我查看它內部的內容時,我得到一個包含functions.py中定義的變量的字典,但它還包含許多其他隨機內容,如\ _ \ _ doc \ _ \ _,\ _ \ _builtins \ _ \ _,EOFError和SyntaxError等錯誤,以及eval,hex等內置函數。 如何獲取我在代碼中實際定義的內容,而沒有額外的東西? –
@ K.Mao:那是該模塊的* full namespace *。所有這些名稱都可用於在該模塊中執行的表達式。你可以建立一個新的字典限制,只限於不以'_'開始的名字或者在__all__中列出的字典。 –
將另一個文件的完整名稱空間作爲參數傳遞給eval會有什麼不好嗎?我會不小心覆蓋一些內置的重要內容,還是很好? –