python-sdk icon indicating copy to clipboard operation
python-sdk copied to clipboard

可否提供 load 方法,用于载入 dump 方法导出的数据,以便于用户缓存数据

Open Ma233 opened this issue 5 years ago • 5 comments

无法直接通过 __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

Ma233 avatar Aug 27 '20 08:08 Ma233

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"])

Ma233 avatar Aug 27 '20 08:08 Ma233

2.2.0 以前的 _merge_metadata 是坏掉的,上面那段代码仅能用于 2.2.0 以后~~o(>_<)o ~~

Ma233 avatar Aug 27 '20 10:08 Ma233

建议升级到最新版,2.2.0 和最新版之间基本没有破坏兼容性的改动。如果实在要用旧版的话,可以 fork 一份然后 cherry-pick 下 _merge_metadata 的修复 #419

weakish avatar Aug 27 '20 11:08 weakish

dump 中没有保存下来被 include 的 Pointer 字段的数据,可能需要单独实现一个 dump; 此外 load 也要可以识别被 dump 下来的 Pointer 字段,最上面那个 load 只会原封不动把 Pointer dump 成的字典存到对应字段上。(已作出修改并标注注释)

Ma233 avatar Sep 02 '20 03:09 Ma233

dump 中没有保存下来被 include 的 pointer 字段的数据

对,Pointer 不会展开 #399

weakish avatar Sep 02 '20 05:09 weakish