2011-07-15 58 views
2

我有一個字符串表達式,我需要做eval。該表達式可能具有來自給定詞典的鍵名,並且這些鍵的值可能是或可能不是字符串。對於我的評估能夠評估這些名稱,我使用該詞典中出現的鍵名創建變量,並如下例所示爲詞典中的值賦予它。但從我讀的here,應該不使用vars()。這讓我擔心我已經實施的穩定性和風險。任何想法或建議如何以更好的方式暗示這一點?使用變量是不是很好()

def test(e1,d1): 
for k,v in d1.iteritems(): 
    if k in e1: 
     vars()[k]=v 
return eval(e1) 

test('x+y', {'x':1, 'y':2}) 

謝謝!!

+0

更大的問題:使用'eval()'是個壞主意。你真的想做什麼? – SingleNegationElimination

回答

2

有一個更好的方法做你想要什麼得到相同的效果要做的事:可選globalslocals參數到eval

def test(e1, d1): 
    return eval(e1, globals(), d1) 

做同樣的事情,你的代碼,但無需與vars渣土。如果您可以通過傳遞空字典作爲第二個參數而不是globals(),這將使您免受e1的副作用。

+0

謝謝大家!是的,@MRAB和@ murgatroid99 eval(e1,d1)確實有效。但爲了能夠使用模塊中的某些功能,我必須使用@Zack建議的eval(e1,globals(),d1)。但是,再次,是不是通過全球風險的事情? – Rinks

+0

評估不可信的字符串是有風險的事情。不通過全局並不會降低風險。 –

+0

你也可以用同樣的方法只允許你想要的功能。比使用所有全局變量更好。 – utdemir

2

爲什麼不能做到這一點:

>>> eval('x+y', {'x':1, 'y':2}) 
3 
1

this,它看起來像你可以通過做

def test(e1, d1): 
    return eval(e1, locals=d1) 
相關問題