python-sdk
python-sdk copied to clipboard
可否提供 load 方法,用于载入 dump 方法导出的数据,以便于用户缓存数据
无法直接通过 __init__ 方法还原一个 dump 出来的数据,所以自己做了一个:
class Object:
@classmethod
def load(cls, attrs):
obj, meta_date = cls(), dict()
for k in ("createdAt", "updatedAt"):
v = attrs.pop(k, None)
if v is not None:
meta_date[k] = v
obj._attributes[k] = utils.decode(k, v)
obj._merge_metadata(meta_date)
# 此处不能直接 obj.set(attrs),否则 Pointer 类型会被当做字典设置到字段上
for k, v in attrs.items():
obj.set(k, v)
return obj
leancloud 对象的实现无法 pickle,忧桑... 基于上面的实现,可以将原生对象转为可 pickle 的数据:
class Object:
def dump_picklable(self):
return {"class": self._class_name, "dump": self.dump()}
@classmethod
def load_picklable(cls, data):
return cls.extend(data["class"]).load(data["dump"])
2.2.0 以前的 _merge_metadata 是坏掉的,上面那段代码仅能用于 2.2.0 以后~~o(>_<)o ~~
建议升级到最新版,2.2.0 和最新版之间基本没有破坏兼容性的改动。如果实在要用旧版的话,可以 fork 一份然后 cherry-pick 下 _merge_metadata 的修复 #419
dump 中没有保存下来被 include 的 Pointer 字段的数据,可能需要单独实现一个 dump; 此外 load 也要可以识别被 dump 下来的 Pointer 字段,最上面那个 load 只会原封不动把 Pointer dump 成的字典存到对应字段上。(已作出修改并标注注释)
dump 中没有保存下来被 include 的 pointer 字段的数据
对,Pointer 不会展开 #399