使用 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 開發人員不會將解析器中的錯誤視為安全問題。