使用 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 开发人员不会将解析器中的错误视为安全问题。