我有一個字符串,類似(4*1+3)/2
,並且想用eval
來評估答案。我怎麼能知道我是否會在中間步驟中獲得剩餘部分?在這種情況下,我會在最後一步得到餘數,我將在這裏評估7/2。在Python中評估eval()時,我如何知道是否在某些中間步驟中得到了餘數?
假設所有參數都是整數,唯一允許的操作數是+, - ,*,/,(,)。
我有一個字符串,類似(4*1+3)/2
,並且想用eval
來評估答案。我怎麼能知道我是否會在中間步驟中獲得剩餘部分?在這種情況下,我會在最後一步得到餘數,我將在這裏評估7/2。在Python中評估eval()時,我如何知道是否在某些中間步驟中得到了餘數?
假設所有參數都是整數,唯一允許的操作數是+, - ,*,/,(,)。
如果你
from __future__ import division
你會得到新的,與Python 3風格劃分:
>>> eval("(4*1+3)/2")
3.5
,你會知道你有一個剩餘的地方,因爲輸出類型float
。
嘗試使用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>
請不要使用'eval'!它會執行任何被拋出的東西,包括有害的陳述。編寫你自己的解析器或找到一個庫。 – 2013-05-08 08:50:52
我是Python新手。使用eval有什麼潛在的風險?我使用eval,因爲它看起來方便和乾淨使用。 – chhung6 2013-05-08 18:07:53
假設您在Web服務器上使用此功能:讓用戶輸入表達式,然後發回結果。如果用戶輸入'print open('/ path/to/the/file/with/passwords')。read()'甚至導入shutils; shutils.rmtree( '/')'?你應該始終清理輸入。 'eval'比你在程序中使用的東西更像是一個調試/ kludge函數。 – 2013-05-08 18:26:10