Python- dill : Can't pickle decorated class

标签 python class decorator pickle dill

我有以下代码,用于装饰该类:

import dill
from collections import namedtuple
from multiprocessing import Process

def proxified(to_be_proxied):
    b = namedtuple('d', [])

    class Proxy(to_be_proxied, b):
        pass

    Proxy.__name__ = to_be_proxied.__name__
    return Proxy


@proxified
class MyClass:
    def f(self):
        print('hello!')


pickled_cls = dill.dumps(MyClass)


def new_process(clazz):
    dill.loads(clazz)().f()


p = Process(target=new_process, args=(pickled_cls,))
p.start()
p.join()

当我尝试 pickle 装饰类时,出现以下错误:

Traceback (most recent call last):
  File "/usr/lib/python3.5/pickle.py", line 907, in save_global
    obj2, parent = _getattribute(module, name)
  File "/usr/lib/python3.5/pickle.py", line 265, in _getattribute
    .format(name, obj))
AttributeError: Can't get local attribute 'proxified.<locals>.Proxy' on <function proxified at 0x7fbf7de4b8c8>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/carbolymer/example.py", line 108, in <module>
    pickled_cls = dill.dumps(MyClass)
  File "/usr/lib/python3.5/site-packages/dill/dill.py", line 243, in dumps
    dump(obj, file, protocol, byref, fmode, recurse)#, strictio)
  File "/usr/lib/python3.5/site-packages/dill/dill.py", line 236, in dump
    pik.dump(obj)
  File "/usr/lib/python3.5/pickle.py", line 408, in dump
    self.save(obj)
  File "/usr/lib/python3.5/pickle.py", line 475, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.5/site-packages/dill/dill.py", line 1189, in save_type
    StockPickler.save_global(pickler, obj)
  File "/usr/lib/python3.5/pickle.py", line 911, in save_global
    (obj, module_name, name))
_pickle.PicklingError: Can't pickle <class '__main__.proxified.<locals>.Proxy'>: it's not found as __main__.proxified.<locals>.Proxy

如何使用 dill 来 pickle 装饰类?我想通过将此类作为参数传递给单独的进程 - 也许有更简单的方法来做到这一点?

最佳答案

Gaël Varoquaux can be found here 提供的“为什么 pickling 修饰函数很痛苦”的一个很好的解释。 .

基本上使用 functools.wraps 重写类可以避免这些问题:)

关于Python- dill : Can't pickle decorated class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40026897/

相关文章:

java - Java中的泛型,返回泛型类Set<T>的集合

python - 当属性用作装饰器时,setter 不会引发异常

python - 我需要以 root 身份安装 python 包吗

python - 在 python 脚本中搜索并替换字符串中的多个模式

c++ - 重新启动游戏并重新实例化对象

python - 为什么在 Python Flask 中使用类与装饰器?

javascript - 无法访问传递给 Angular 组件的 @Input 字段的对象中的公共(public)方法

python - 有没有办法有条件地索引 3D-numpy 数组?

python - 读取一个zip并将其写入另一个文件python

c++在不知道扩展类的情况下调用存储在基类变量中的扩展类的构造函数