如何拆除用字符串扭曲的对象列表

时间:2016-02-25 22:57:24

标签: python-2.7

我有一个包含对象列表的字符串,我想"抓住"只有清单。我看到你可以使用ast.literal_eval()删除字符串,但它不能处理包含对象的列表。

class A ():
    def __init__(self):
        self.property = "hello"
objects_lst = [A()]   #original
objects_lst = str(object_lst)

我想返回' objects_lst'它的原始形式。 感谢

1 个答案:

答案 0 :(得分:0)

这不能在一般情况下完成。当Python将您的列表转换为字符串时,它将在您的实例上调用repr方法,并在其构建的字符串中包含返回值。如果您不编写自己的repr方法,Python的默认值将返回类似"<A object at 0xDEADBEEF>"的内容(其中我伪造的十六进制地址是Python用于该对象的内存中的位置) )。该字符串可能不足以重建您的对象,尤其是不在另一个系统上。

有两种合理的方法可以解决这个问题。第一个只适用于相当简单的对象的方法是编写一个__repr__方法,该方法返回一个字符串,该字符串可以eval来获取等效对象。对于您的示例,可能是"A()",但更常见的是,您需要在构造函数中包含参数(例如"A({}).format(self.property)",如果分配给self.property的值是__init__的参数{1}})。

另一种选择是使用比列表中的str更好的序列化系统。 Python的pickle模块适用于大多数类型的对象,但在某些复杂情况下可能会失败。 dill模块(不在标准库中)扩展pickle以做得更好。如果您想要人类可读的序列化输出,使用jsonyaml可能会更好。或者,您可以编写自己的序列化逻辑来处理您关心的案例(而不是其他内容)。序列化是一个很大的主题,所以如果这是你的代码的一个重要部分,做一些研究(如果它不是那么重要,我首先尝试pickle,只调查其他的东西如果它不起作用。)

最后要指出的一点是:从不受信任的来源反序列化数据可能会很危险。如果恶意客户端发送适当设置的有效负载,它可能能够在您的系统上运行任意代码。