pickle无法序列化动态创建的class,要怎么做才能存储动态创建的类?

发布于 2022-09-13 00:18:35 字数 989 浏览 23 评论 0

import pickle

class B:
    a = 1
    b = 2
    c = 3
    my = []

def you():
    with open("you.pkl", "wb") as f:
        pickle.dump(B, f)

def my():
    conf_txt = """
class A:
    a = 1
    b = 2
    c = 3
    my = []
    """
    glob, loc = {}, {}
    exec(conf_txt, glob, loc)
    with open("conf.pkl", "wb") as f:  # 'loc': {'A': <class 'A'>}
        # error, _pickle.PicklingError: Can't pickle <class 'A'>: attribute lookup A on builtins failed
        pickle.dump(loc["A"], f) 

def that():
    C = type("C", (B, ), {"hello":"tom"})
    print("hello:", C.hello)
    with open("c.pkl", "wb") as f:
        # _pickle.PicklingError: Can't pickle <class '__main__.C'>: attribute lookup C on __main__ failed
        pickle.dump(C, f)


if __name__ == "__main__":
    you()    # it works
    my()     # 有问题
    # that() # 有问题

对于my()、that(),一个是从conf.txt里加载信息,exec后将配置类保存但是失败。另一个通过type动态创建class,pickle序列化还是失败。我应该怎么做才能序列化动态类?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜空下最亮的亮点 2022-09-20 00:18:35

我只见过你这样写类:文字转类,换一种编码方式

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文