【问题标题】:Object representation in PythonPython 中的对象表示
【发布时间】:2012-04-20 09:23:08
【问题描述】:

我想要一个 python 对象的字符串表示。我曾经用著名的泡菜来做,但我想知道它是否存在更好更便宜的东西。我不喜欢使用 repr 和 eval 因为它们不安全。

【问题讨论】:

  • Pickle 也不安全,请查看pickle docs 顶部的警告

标签: python string object representation


【解决方案1】:

使用repr()获取字符串表示,使用ast.literal_eval()恢复对象。

或者只是使用泡菜。如果您使用的是 Python 2.x,您可以import cPickle 获得更快的泡菜,但在 Python 3.x 中只有一个泡菜,它是 C 泡菜。

就个人而言,我喜欢将 JSON 用于简单对象;你可以试试import json 看看它是否适合你。

【讨论】:

  • ast.literal_eval() 和 eval() 不是精确的科学。用于复杂对象时失败。
  • ast.literal_eval() 不会从其repr() 重构对象,除非在少数有限的情况下。事实上,在一般情况下,__repr__ 没有重载,并且对象不能从其repr() 重构,因为它看起来就像<module.name_of_class instance at 0xdeadbeef>
  • 即使你有一个不可变的类,它总能推断出它是用什么参数构造的,并重载__repr__ 以生成一个看起来像构造函数调用的字符串,ast.literal_eval() 仍然获胜'不要处理它,因为这是一个表达式,而不是文字。您需要升级到 eval,这是不安全的。
【解决方案2】:

通过对象表示,如果您的意思是序列化,那么 pickle 是一个选项。如果您想要更快的实现,请尝试cPickle

【讨论】:

    【解决方案3】:

    YAML 是一种相当不错的序列化数据结构格式。它类似于 JSON,但更是如此。 PyYAML 库运行良好。除了让它猜测如何序列化数据结构之外,您还可以获得相当具体的信息。有关示例,请参阅他们的完整文档。

    【讨论】:

    • YAML 或 JSON 将是一个不错的选择。
    • JSON 除了在标准库中之外,还有一个好处是它是 YAML 的一个子集。因此,如果您从 JSON 开始并稍后迁移到 YAML,YAML 解析器仍然能够读取数据。不过,YAML 通常看起来更好,并且具有 JSON 缺乏的一些功能。如果import yaml 失败,我通常会尽可能让我的对象转储器回退到 JSON。
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2016-05-19
    • 2016-07-07
    • 2021-05-11
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多