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

新手上路,请多包涵
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序列化还是失败。我应该怎么做才能序列化动态类?

阅读 2.5k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题