【问题标题】:General way to convert python objects to dicts and other serializations将 python 对象转换为 dicts 和其他序列化的一般方法
【发布时间】:2014-11-30 21:53:13
【问题描述】:

我正在编写一个类来存储我最终想要序列化/反序列化到磁盘的数据。此类的任何对象都可以明确表示为包含存储在对象属性中的数据的字典。因此,序列化和反序列化相当于将对象转换为字典表示(或使用字典表示初始化新对象),然后使用 json.dump()、json.read() 等对字典进行序列化/反序列化。

调用obj.__dict__ 是不可接受的,因为我使用@property 装饰器包装公共属性以构建一次写入功能,并将实际值存储在非公共变量中,例如_attribute。因此,调用 obj.__dict__ 会返回一个字典,其中包含像“_attribute”这样的键,这不是我想要的。

构建这样一个类的“正确”方法是什么?我应该有一个obj.to_dict() 方法(可能是非公开的),还是编写一个使dict(obj) 有效的类?扩展这个问题,我应该有一个obj.json_dumps() 方法,还是编写一个使json.dumps(obj) 有效的类?

我最初的想法是使用__repr__ 方法来创建对象的dict 表示,然后返回dict 的字符串表示,但似乎这种方法需要太多步骤。根据之前的stackoverflow question__repr__ 应该是对象的明确表示,所以我很高兴__repr__ 返回 dict 的字符串表示,但转换 dict -> str -> dict 似乎不是- 最佳方式。

我试图避免糟糕的架构模式,并且我还希望拥有尽可能通用的架构,以便将来可以轻松实现其他类型的序列化,例如 yaml 或 pickle。

【问题讨论】:

  • 为什么不现在就使用pickle

标签: python serialization dictionary


【解决方案1】:

我可能理解错了,但是你考虑过JSON吗?

with open(output_file, 'w') as ff:
      json.dump(obj, ff)
with open(output_file) as ff:
      obj = json.load(ff)

另一个选项可能是模块PICKLE

with open("mierda.txt", 'w') as ff:
     pickle.dump(a, ff)
with open("mierda.txt") as ff: 
     obj = pickle.load(ff)

【讨论】:

  • 我已经考虑过 json 和 pickle。我的问题是:最pythonic的做事方式是什么?我应该编写我的类以使其与这些模块兼容,还是我的类应该具有诸如obj.json_dump()之类的方法?
  • 那么显然我遗漏了一些东西......您究竟需要如何编写您的类以“与 JSON 兼容”?我只是写了一个方法“save(file)”(或类似的),它在 self 上调用 json.dump 和另一个在文件上调用 json.load 的“read(file)”。
猜你喜欢
  • 2016-04-15
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多