4

我有一段代码接收格式化为 python 字典的字符串

"{'a':'1','b':'2',...}"

我需要将其转换为正确的字典。

我尝试了两种方法, usingjson.loads(s)ast.literal_eval(s) ast 似乎更加健壮,接受字符串中的任何形式的引号并且“正常工作”,而 json 似乎对引用细节非常挑剔,并且不会仅在一种形式上失败的报价格式。我真的希望输入尽可能灵活,因此更喜欢使用ast,但是,我的一些同事声称它可能不是一个“安全”的模块和函数来使用。

谁能就 ast 和 ast.literal_eval() 的安全性提出建议,尤其是与 json.loads() 相比?

谢谢

4

1 回答 1

8

使用ast.literal_eval()- 它旨在做你想做的事。JSON 恰好在语法匹配时起作用,但这不是您应该依赖的。

至于安全性,literal_eval()专门设计用于安全地使用来自不受信任来源的数据。事实上,文档的第一个词是“安全地”:

安全地评估表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

这可用于安全地评估来自不受信任来源的包含 Python 表达式的字符串,而无需自己解析值。

那些建议您不要使用它的人可能正在考虑eval(),这确实是不安全的。

于 2012-10-04T20:13:22.183 回答