在我被'eval是邪惡'的人羣擊斃之前,在這種情況下這是一個必要的罪惡,我無法改變它。 Eval有它的用途,並且在嚴格控制的環境中它非常強大。Dash in dictionary key and eval
但是,我有一個問題沒有明顯的解決方案,我希望在盒子外面思考。
>>> mydict = {"a-b": "woohoo"}
>>> mydict["a-b"]
'woohoo'
>>> eval('mydict["a-b"]')
'woohoo'
>>> eval('a-b', mydict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'a' is not defined
Unfortuately,最後一種情況是一個我被迫使用,顯然這是行不通的。任何想法如何將表達式評估到我的「全局變量」或「本地」對象中,而不是將它解釋爲 - 作爲負運算符?我的'全局變量'對象中的一些鍵在關鍵字名稱中確實有破折號,這是我無法控制的數據。
下面的評論。
- 數據來自外部來源。我無法指定或控制數據的格式。
- 我正在評估的'條款'是從存儲的用戶配置中找到我的。
這是一個較大系統的一部分,用戶可以通過api來推送JSON數據,我們將數據作爲字典在內部處理,然後我們將某些規則應用於數據。規則由管理員從Web界面進行配置。
最終,我需要允許用戶給我一個(可能是複雜的)python一班,並評估它對字典。這不正是eval
的目的嗎?如果有更好的方式,我不能口述數據的格式,並且必須允許用戶給我一個字符串以評估? Eval是驚人的,因爲它可以讓用戶做很多很酷的事情,比如使用.get()
和len()
,但顯然它也有不利之處,就像前面提到的無法區分或逃避-
一樣。
謝謝!
這裏我們需要更多的上下文。你爲什麼不得不使用'eval'? 'mydict'和''a-b「'從哪裏來?你被允許改變'mydict'的結構嗎?你可以改變這個系統的哪些部分? 'eval'顯然不適合你想要執行的任務。 – user2357112
您是否知道,即使您評估的表達式是非變性的,即使使用像這樣的'eval'變異'mydict'?它在'mydict'中插入一個新的'__builtins__'條目,這可能是非常不可取的。 – user2357112
@ user2357112 1)eval是所有我能找到的工作2)數據來自不受控制的外部來源3)我無法改變結構4)我可以寫任何我喜歡的代碼來完成我更新中陳述的目標題。是的,我很確定eval會改變它,事實上這很好,因爲我們希望在評估中允許儘可能多的python關鍵字。謝謝! – hikaru