使用pythonast库来执行诸如将字符串转换为di之类的操作是否是最佳实践

2024-04-26 07:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试转换下面给出的字典对象字符串

"{'Cmd': None, 'Hostname': None, 'Entrypoint': None, 'Env': None,     'OpenStdin': False, 
'Tty': False, 'Domainname': None, 'Image': u'nginx:latest', 'HostConfig':   
{'Binds': None, 'RestartPolicy': {}, 'NetworkMode': u'bridge', 'Dns': None, 
'Links': [], 'PortBindings': {}, 'DnsSearch': None, 'Privileged': False,
'VolumesFrom': []}, 'ExposedPorts': {}, 'User': None}"

到python字典。在

但是在搜索时出现的解决方案建议使用python-ast库。作为

^{pr2}$

而且效果很好。但是ast库是缩进的来解决这样的问题吗?除此之外,还有什么好办法可以解决这个问题吗?在


Tags: 对象字符串imageenvcmdnonefalse字典
1条回答
网友
1楼 · 发布于 2024-04-26 07:32:51

But is ast library is built indented to solve problems like this ?

你的担心是有道理的。ast.literal_eval和普通的eval一样,主要不是为了反序列化数据而设计的。这是因为Python代码从一开始就不是用来序列化数据的。在

但实际上它并没有什么异国情调:在幕后,它使用了解释器内置的compile()(这是CPython用来解析正常代码的相同函数),但是{}也会生成并通过AST,如果它包含文本以外的任何内容,则会引发异常。在

在实践中,有两个问题需要考虑:安全性和性能。对于您发布的示例,性能应该不是什么大问题,所以您应该坚持使用ast.literal_eval(到目前为止,thought非常安全)。但是,如果你要处理(大得多)的字典,那么你很可能会遇到一些内存问题。在

在这种情况下,如果可能的话,到目前为止更明智的选择是避免将数据序列化为Python代码,而使用JSON之类的东西。如果不是,请考虑在解析字符串之前将其转换为其他形式;例如,可以先使用regex将其转换为JSON(格式非常类似),然后使用json.loads对其进行解析。但只要你没有性能问题,坚持使用ast.literal_eval,你应该没事。在

在任何情况下,无论你做什么,永远不要,从不使用eval。它只会留下一个巨大的安全漏洞,只会带来微乎其微的好处。在

相关问题 更多 >