【问题标题】:Is it a best practice to use python ast library for operations like converting string to dict将 python ast 库用于将字符串转换为 dict 等操作是否是最佳实践
【发布时间】:2016-01-03 05:20:18
【问题描述】:

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

"{'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 库。作为

import ast
ast.literal_eval(string)

而且效果很好。但是 ast 库是为了解决这样的问题而构建的吗?除了这个有什么好的方法来解决这个问题吗?

【问题讨论】:

  • 一个更好的问题可能是:你如何以 "a string of dictionary objects" 结束?如果您要将数据持久化到文件中,请考虑使用 JSON(人类可读但仅限于某些数据类型)或 pickle(不可读但几乎适用于任何对象)。
  • @jonrsharpe 这是我从文本区域字段的表单帖子中获得的数据。我无法将其解析为 json
  • 你为什么要这样输入?这样做的目的是什么?
  • 为什么需要 ast 库?你不能只使用常规的 eval() 吗?
  • @EspenHaugsdal 关于通过网络表单提交的数据?你疯了吗?参见例如stackoverflow.com/q/1832940/3001761, stackoverflow.com/q/1933451/3001761

标签: python json type-conversion


【解决方案1】:

但是 ast 库是为解决此类问题而构建的吗?

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

但它并没有什么特别之处:在底层,它使用解释器的内置 compile()(这与 CPython 用于解析普通代码的函数相同),但 literal_eval 也会生成和通过 AST,如果它包含文字以外的任何内容,则会引发异常。

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

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

无论如何,无论你做什么,永远,永远使用eval。它只会留下一个巨大的安全漏洞,只获得微不足道的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多