Python AST与JSON:将字符串转换为字典的比较

4

我有一段代码,它接收一个格式为Python字典的字符串。

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

我需要将其转换为一个合适的字典格式,已经尝试过两种方法,分别是使用json.loads(s)ast.literal_eval(s)。后者似乎更加健壮,可以接受字符串中的任何引号形式并且能够正常工作,而前者则对引号格式非常挑剔,只要有一种引号格式不正确就会失败。我希望输入尽可能灵活,因此更喜欢使用ast,但我的一些同事认为它可能不安全。

请问有人能就 ast 和 ast.literal_eval() 的安全性提供建议吗?尤其是与 json.loads() 相比?

谢谢


引用符号是否与您的问题中一致?单引号不匹配。 - user647772
你说得对,让我来修复一下... - dyasny
2
只有在数据源是JSON时才使用json.loads。如果只是一个repr(python_dict),即使有时它能工作,语义上也是不正确的。 - agf
1个回答

8
使用`ast.literal_eval()` - 它的设计目的就是做你想要的事情。JSON恰好适用于此语法匹配,但这不是你应该依赖的东西。
至于安全性,`literal_eval()`被专门设计为可以安全地用于来自不可信来源的数据。实际上,文档的第一个单词就是“安全”:
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,布尔值和None。
这可以用于从不可信来源安全地评估包含Python表达式的字符串,而无需解析自己的值。
那些建议你不要使用它的人可能在考虑`eval()`,这确实是不安全的。

完美,谢谢。我会等待几个回复,并设置答案。 - dyasny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接