我一直在尝试转换下面给出的字典对象字符串
"{'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库是缩进的来解决这样的问题吗?除此之外,还有什么好办法可以解决这个问题吗?在
你的担心是有道理的。
ast.literal_eval
和普通的eval
一样,主要不是为了反序列化数据而设计的。这是因为Python代码从一开始就不是用来序列化数据的。在但实际上它并没有什么异国情调:在幕后,它使用了解释器内置的}也会生成并通过AST,如果它包含文本以外的任何内容,则会引发异常。在
compile()
(这是CPython用来解析正常代码的相同函数),但是{在实践中,有两个问题需要考虑:安全性和性能。对于您发布的示例,性能应该不是什么大问题,所以您应该坚持使用
ast.literal_eval
(到目前为止,thought非常安全)。但是,如果你要处理(大得多)的字典,那么你很可能会遇到一些内存问题。在在这种情况下,如果可能的话,到目前为止更明智的选择是避免将数据序列化为Python代码,而使用JSON之类的东西。如果不是,请考虑在解析字符串之前将其转换为其他形式;例如,可以先使用regex将其转换为JSON(格式非常类似),然后使用
json.loads
对其进行解析。但只要你没有性能问题,坚持使用ast.literal_eval
,你应该没事。在在任何情况下,无论你做什么,永远不要,从不使用
eval
。它只会留下一个巨大的安全漏洞,只会带来微乎其微的好处。在相关问题 更多 >
编程相关推荐