【问题标题】:Python: Using `copyreg` to define reducers for types that already have reducersPython:使用`copyreg`为已经有reducer的类型定义reducer
【发布时间】:2010-05-28 21:48:27
【问题描述】:

(请记住,我正在使用 Python 3,因此解决方案需要在 Python 3 中运行。)

我想使用copyreg 模块来教Python 如何腌制函数。当我尝试这样做时,_Pickler 对象仍会尝试使用save_global 函数来腌制函数。 (这对于未绑定的方法不起作用,这就是这样做的动机。)

似乎_Pickler 在查看copyreg.dispatch_table 之前首先尝试在其自己的dispatch 中查找要腌制的对象的类型。我不确定这是不是故意的。

我有什么方法可以告诉 Python 使用我提供的 reducer 来腌制函数吗?

【问题讨论】:

    标签: python function pickle


    【解决方案1】:

    以下 hack 似乎适用于 Python 3.1...:

    import copyreg
    def functionpickler(f):
      print('pickling', f.__name__)
      return f.__name__
    
    ft = type(functionpickler)
    copyreg.pickle(ft, functionpickler)
    
    import pickle
    pickle.Pickler = pickle._Pickler
    del pickle.Pickler.dispatch[ft]
    
    s = pickle.dumps(functionpickler)
    print('Result is', s)
    

    除此之外,两条粗俗的线是:

    pickle.Pickler = pickle._Pickler
    del pickle.Pickler.dispatch[ft]
    

    您需要删除函数类型的dispatch 条目,否则它会抢占copyreg 注册;而且我认为您无法在 C 编码的 Pickler 上执行此操作,因此您需要将其设置为 Python 编码的。

    _Pickler 子类化为您自己的类并创建自己的dispatch (复制父类并删除函数类型的条目),然后专门使用您的子类(及其转储方法)而不是pickle.dump;但是,这种泡菜本身的猴子补丁也不太方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      相关资源
      最近更新 更多