有没有类似于反向eval()函数的东西?

7
假设你遇到了这个问题:你有一个Python字典并希望生成可以创建此字典的Python代码。 (类似于eval但是反过来) 有什么工具可以做到这一点吗?
情景: 我正在使用远程Python解释器。 我可以将源文件提供给它,但无法输入任何内容。 所以我现在正在寻找一种将我的输入数据编码为Python源文件的方法。
例子:
d = {'a': [1,4,7]}
str_d = reverse_eval(d)
# "{'a': [1, 4, 7]}"
eval(str_d) == d

2
你能否提供一个例子,让问题更具体化一些? - Vasilis G.
最好反转ast.literal_eval - Jean-François Fabre
不太确定你为什么要这样做。这可能是一个XY问题,而pickle则是未被问到的X问题的解决方案。 - John Coleman
@JohnColeman,请不要随意使用“pickle”。我们正在给新手留下这样的印象,即pickle可以解决他们的问题,而没有提到它会打开程序的任意代码执行漏洞。这就是为什么我们最终会看到人们在未加保护的套接字连接上发送腌制数据的原因。 - Aran-Fey
@Aran-Fey 不错的观点——但是当然,eval也有同样的问题。幸运的是,我链接的pickle文档有一个非常清晰的警告,格式化得让你看到它时第一件事。 - John Coleman
@JohnColeman 很好的观点。但我认为最好询问您所寻找的功能,因为这样其他需要该功能的人也可以找到它。即使他们有不同的问题要解决。 - Christian
2个回答

9
repr(thing)

将输出一段执行后会(在大多数情况下)重现该字典的文本。


具体来说:repr目的是返回一个字符串,该字符串在传递给 eval 时,如果可能的话将重构等效对象。这就是为什么 Python REPL 在打印对象时使用 repr - Daniel Pryden
这个方法不适用于类。例如:eval(repr(Klass)) 会引发 SyntaxError 错误。 - raquelhortab

2
实际上,重要的是你想为哪些类型的数据创建这个反向函数。如果你谈论的是内置/标准类,通常它们的`.__repr__()`方法返回你想要访问的代码。但如果你的目标是以人类可读的格式保存某些内容,并使用类似eval的功能在Python中使用这些数据,那么有一个json库。
出于安全原因最好使用json,因为使用eval不安全。JSON的问题是它无法保存任何类型的数据,它只能保存标准对象,但是如果我们谈论的是非内置类型的数据,你永远不知道其`.__repr__()`中包含什么,因此不能使用repr-eval处理此类数据。
所以并不存在适用于所有数据类型的反向函数,对于内置数据类型可以使用repr-eval,但对于内置数据类型来说,至少json库更安全。

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