python pickle 实践

2020/01/08 技术

python pickle 实践

魔术方法

pickle 提供了 __getstate____setstate__ 两个魔术方法, 用于定制 pickle 过程。

利用这两个方法, 可以解决 不能 pickle 对象的 pickle 问题。

import threading


class UnPickleObj(object):
    def __init__(self,):
        # unpickle obj
        self.lock = threading.Lock()

        # pickle obj
        self.name = self.__class__.__name__

    def __getstate__(self):
        """ 持久化: """
        state = self.__dict__.copy()

        # 处理不能 pickle 的对象
        state["lock"] = None

        return state

    def __setstate__(self, state: dict):
        """ 反持久化 """
        # 还原不能 pickle 的对象
        state["lock"] = threading.Lock()

        # 还原 obj
        self.__dict__.update(state)

持久化到数据库中

可以使用通用方法, 现将 pickle 对象持久化后得到的 bytes, 转为 字符串, 再入库。

例如利用 base64库, 实现转换方法

import base64
import pickle

def ojb2str(obj: object) -> str:
    return base64.b64encode(pickle.dumps(obj)).decode("utf-8")

def str2obj(text:str) -> object:
    return pickle.loads(base64.b64decode(text.encode("utf-8")))

对于 mongo等数据库,可以存储为二进制类型。如:

import pickle
from bson.binary import Binary


def ojb2bin(obj: object) -> Binary:
    return Binary(pickle.dumps(obj))

def str2obj(bin: Binary) -> object:
    return pickle.loads(bin)

参考

Search

    Table of Contents