【发布时间】:2012-04-20 09:23:08
【问题描述】:
我想要一个 python 对象的字符串表示。我曾经用著名的泡菜来做,但我想知道它是否存在更好更便宜的东西。我不喜欢使用 repr 和 eval 因为它们不安全。
【问题讨论】:
-
Pickle 也不安全,请查看
pickledocs 顶部的警告
标签: python string object representation
我想要一个 python 对象的字符串表示。我曾经用著名的泡菜来做,但我想知道它是否存在更好更便宜的东西。我不喜欢使用 repr 和 eval 因为它们不安全。
【问题讨论】:
pickle docs 顶部的警告
标签: python string object representation
使用repr()获取字符串表示,使用ast.literal_eval()恢复对象。
或者只是使用泡菜。如果您使用的是 Python 2.x,您可以import cPickle 获得更快的泡菜,但在 Python 3.x 中只有一个泡菜,它是 C 泡菜。
就个人而言,我喜欢将 JSON 用于简单对象;你可以试试import json 看看它是否适合你。
【讨论】:
ast.literal_eval() 不会从其repr() 重构对象,除非在少数有限的情况下。事实上,在一般情况下,__repr__ 没有重载,并且对象不能从其repr() 重构,因为它看起来就像<module.name_of_class instance at 0xdeadbeef>。
__repr__ 以生成一个看起来像构造函数调用的字符串,ast.literal_eval() 仍然获胜'不要处理它,因为这是一个表达式,而不是文字。您需要升级到 eval,这是不安全的。
通过对象表示,如果您的意思是序列化,那么 pickle 是一个选项。如果您想要更快的实现,请尝试cPickle
【讨论】:
YAML 是一种相当不错的序列化数据结构格式。它类似于 JSON,但更是如此。 PyYAML 库运行良好。除了让它猜测如何序列化数据结构之外,您还可以获得相当具体的信息。有关示例,请参阅他们的完整文档。
【讨论】:
import yaml 失败,我通常会尽可能让我的对象转储器回退到 JSON。