【问题标题】:Serializing python object to python source code将python对象序列化为python源代码
【发布时间】:2011-05-30 03:19:38
【问题描述】:

我有一个 python 字典,我想将它序列化为初始化该字典的键和值所需的 python 源代码。

我正在寻找类似json.dumps() 的东西,但输出格式应该是 Python 而不是 JSON。

我的对象非常简单:它是一个字典,其值是以下之一:

  1. 内置类型文字(字符串、整数等)
  2. 文字列表

我知道我可以自己构建一个,但我怀疑存在涉及嵌套对象、关键字转义等的极端情况,所以我更愿意使用已经解决了这些问题的现有库。

【问题讨论】:

  • Python 不是 Json?你在说什么?
  • 'obj = json.loads(%r)' % json.dumps(some_dict)? ☃

标签: python json serialization code-generation


【解决方案1】:

在最一般的情况下,不可能将任意 Python 对象转储到 Python 源代码中。例如。如果对象是套接字,则无法在新对象中重新创建完全相同的套接字。

正如 aix 解释的那样,对于简单的情况,repr 明确设计用于生成可重现的源表示。作为一个简单的概括,pprint 模块允许通过PrettyPrinter 类进行选择性定制。

如果您希望它更通用,并且您唯一的要求是获得可执行的 Python 源代码,我建议将对象腌制成字符串,然后生成 源代码

obj = pickle.loads(%s)

%s 被替换为 repr(pickle.dumps(obj))

【讨论】:

  • PrettyPrinter 看起来正是我想要的。我试图序列化的对象非常简单——一个字典,其值要么是文字,要么是文字列表。谢谢!
【解决方案2】:

repr(d) 其中d 是您的字典可能是一个开始(虽然没有解决您提到的所有问题)。

【讨论】:

  • repr() 是否会处理嵌套,只要嵌套值是可以通过 repr() 正确发出元素的列表?
  • 也使用 import ast; ast.literal_eval(s) 读回字典
  • @Spike Nice,感谢您指出ast.literal_eval。我不知道。
【解决方案3】:

你可以使用yaml

http://pyyaml.org/

YAML 不会完全序列化为 python 源代码。但是yaml模块可以直接序列化和反序列化python对象。它是 JSON 的超集。

你到底想做什么?

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 2015-07-27
    • 2016-12-08
    • 2011-09-11
    • 2014-09-30
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多