2013-05-08 43 views
0

我有一個字符串,類似(4*1+3)/2,並且想用eval來評估答案。我怎麼能知道我是否會在中間步驟中獲得剩餘部分?在這種情況下,我會在最後一步得到餘數,我將在這裏評估7/2。在Python中評估eval()時,我如何知道是否在某些中間步驟中得到了餘數?

假設所有參數都是整數,唯一允許的操作數是+, - ,*,/,(,)。

+4

請不要使用'eval'!它會執行任何被拋出的東西,包括有害的陳述。編寫你自己的解析器或找到一個庫。 – 2013-05-08 08:50:52

+0

我是Python新手。使用eval有什麼潛在的風險?我使用eval,因爲它看起來方便和乾淨使用。 – chhung6 2013-05-08 18:07:53

+0

假設您在Web服務器上使用此功能:讓用戶輸入表達式,然後發回結果。如果用戶輸入'print open('/ path/to/the/file/with/passwords')。read()'甚至導入shutils; shutils.rmtree( '/')'?你應該始終清理輸入。 'eval'比你在程序中使用的東西更像是一個調試/ kludge函數。 – 2013-05-08 18:26:10

回答

1

如果你

from __future__ import division 

你會得到新的,與Python 3風格劃分:

>>> eval("(4*1+3)/2") 
3.5 

,你會知道你有一個剩餘的地方,因爲輸出類型float

+0

所以除了檢查值是否有小數部分之外,還有沒有更乾淨的方法可以做到這一點?如果數字變大,則可能存在精度錯誤。 – chhung6 2013-05-08 18:06:44

+1

@ chhung6:肯定有一種乾淨的方式,但不是一件容易的事。 defuz的答案將是一個乾淨的解決方案的開始,但你必須自己做評估。 – 2013-05-08 19:35:14

+0

順便說一下,它似乎不會捕捉到這種情況:eval(「1/2 * 2」) – chhung6 2013-05-09 04:44:28

1

嘗試使用ast.parse功能:

>>> import ast 
>>> x = ast.parse('(4*1+3)/2', mode='eval') 
>>> x.body.left 
<_ast.BinOp object at 0x> 
>>> x.body.right 
<_ast.Num object at 0x100613590> 
>>> x.body.op 
<_ast.Div object at 0x10060d2d0> 
0

如果沒有爲你工作,你可以嘗試一些自定義代碼來評估綴表達式。請參閱example使用堆棧來評估中綴表達式。或者查看這個blog的一些代碼。

似乎沒有圖書館或模塊或組件可以幫助你做你想做的事情。你可能必須自己寫。

相關問題