将Python对象序列化为Python源代码

5
我有一个Python字典,想将其序列化为Python源代码,以便初始化该字典的键和值。
我正在寻找类似于json.dumps()的东西,但输出格式应为Python而不是JSON。
我的对象非常简单:它是一个字典,其值是以下之一:
1. 内置类型文字(字符串、整数等) 2. 文字列表
我知道我可以自己构建一个,但我怀疑会涉及嵌套对象、关键字转义等边角情况,因此我更喜欢使用已经解决这些问题的现有库。

Python不是Json?你在说什么呢? - SilentGhost
'obj = json.loads(%r)' % json.dumps(some_dict)` 的翻译是什么? ☃ - jfs
3个回答

3
在最一般的情况下,将任意Python对象转储到Python源代码中是不可能的。例如,如果对象是套接字,则无法通过创建一个新对象来重新创建完全相同的套接字。
正如aix所解释的那样,对于简单情况,repr明确设计为使可再生源表示。作为轻微的概括,pprint模块允许通过PrettyPrinter类进行选择性定制。
如果您希望更加通用,并且您的唯一要求是获得可执行的Python源代码,则建议将对象pickle成字符串,然后生成源代码。
obj = pickle.loads(%s)

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


PrettyPrinter看起来就是我一直在寻找的东西。我试图序列化的对象非常简单——一个字典,其值要么是文字,要么是文字列表。谢谢! - Justin Grant

2

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


repr()会处理嵌套吗,只要嵌套的值是列表,并且列表中的元素可以被repr()正确地输出? - Justin Grant
3
使用import ast; ast.literal_eval(s)来读取字典,并将以下英文文本翻译成中文。 - Spike Gronim
@Spike 很好,谢谢你指出 ast.literal_eval。我之前不知道它。 - NPE

0

你可以使用yaml

http://pyyaml.org/

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

你具体想做什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接