2016-05-30 44 views
0

假設,我創建了一個包含許多函數和其他東西的python文件(FirstFile.py)名稱。其中一個功能是這個(當然,它是簡化的):如何使用另一個文件中定義的變量在文件中使用包含eval的函數?

def func(string): 
    assert eval(string) 

此外,我已經創建了從文件進口FUNC()上述的Python文件。然後第二個Python文件嘗試執行以下過程:

from FirstFile import func 
amk = 1 
func("amk == 1") 

當變量「AMK」是第一個文件,沒有問題的揭示。然而,當變量「AMK」是第二個文件,這是在這裏說明,錯誤顯示:

NameError: name 'amk' is not defined 

你想請你幫我解決這個問題?

+0

它是'amk'還是'ask',因爲你的錯誤顯示'ask',但是無論哪種方式,變量都在第二個文件的範圍內,第一個文件不能訪問。爲了給予第一個文件訪問權限,我將它作爲一個變量傳遞給func()。 func被定義爲'def func(string,* args):' – TheLazyScripter

+0

@TheLazyScripter它不能與'def func(string,* args)'一起工作。 – Luis

+0

@Kivi Kivit你能詳細說明你需要執行什麼嗎?如果需要,可以通過某種方式解決變量範圍的問題... – Luis

回答

0

默認eval執行當前的局部/全局範圍,如果要指定一個不同的環境中,你可以這樣做:

eval("x == 1", {"x":1}) 

所以你的功能可能需要一個可選environ參數:

def func(string, environ=None): 
    assert eval(string, environ) 

那麼你可以從通過locals()的環境中的其他模塊調用函數

作爲一個便箋,我建議不要評估任意代碼,特別是如果它來自另一個源/模塊,因爲它可能會意外地包含有害代碼。

+0

'func'中的'if'語句不是必需的。將'None'作爲全局參數傳遞給'eval'也會起作用。 –

+0

所以你是對的,我不確定,並知道有沒有其他內置的功能,抱怨時給予無。 –

+0

另外,根據問題作者的具體問題,通過全局變量和本地變量也許是有意義的。但是,如果'func'不是從模塊級調用的,它只會有所不同。 –

相關問題