使用 ast.literal eval 評估包含 Python 文字的字串
如果你有一個包含 Python 文字的字串,比如字串,浮點數等,你可以使用 ast.literal_eval
來評估它的值,而不是 eval
。這具有僅允許某些語法的附加功能。
>>> import ast
>>> code = """(1, 2, {'foo': 'bar'})"""
>>> object = ast.literal_eval(code)
>>> object
(1, 2, {'foo': 'bar'})
>>> type(object)
<class 'tuple'>
但是,這對於執行不受信任的使用者提供的程式碼並不安全,並且通過精心設計的輸入使直譯器崩潰是微不足道的
>>> import ast
>>> ast.literal_eval('()' * 1000000)
[5] 21358 segmentation fault (core dumped) python3
這裡,輸入是一個重複一百萬次的 ()
字串,這會導致 CPython 解析器崩潰。CPython 開發人員不會將解析器中的錯誤視為安全問題。