__reduce__是否接受参数?

问题描述 投票:0回答:1

我在阅读别人的代码时,发现有人定义了 __reduce__ 为接受参数的类。例如: 此处. 如果你不知道。__reduce__ 神奇的方法是用于pickling一个Python对象。

    def __reduce__(self, args=(), kwargs=None):
        kwargs = {} if not kwargs else kwargs
        return (unpickle_backend, (self.__class__, args, kwargs))

所以我引用了 文件:

该接口目前定义如下。该接口的定义如下: __reduce__() 方法采取 毫无争议 并应返回一个字符串或最好是一个元组(返回的对象通常被称为 "reduce value")。

谁能帮我理解一下?

python pickle
1个回答
1
投票

腌制机制只会调用 __reduce__ 没有参数。Celery选择了过载他们的 __reduce__ 实现来支持参数;这些参数由Celery内部使用,而不是由pickle机制提供。由于额外的参数是可选的,这些 __reduce__ 方法仍然可以处理无参数调用,而且它们仍然与 __reduce__ 协议。

例如: celery.backends.rpc.RPCBackend.__reduce__ 看起来像这样。

def __reduce__(self, args=(), kwargs={}):
    return super(RPCBackend, self).__reduce__(args, dict(
        kwargs,
        connection=self._connection,
        exchange=self.exchange.name,
        exchange_type=self.exchange.type,
        persistent=self.persistent,
        serializer=self.serializer,
        auto_delete=self.auto_delete,
        expires=self.expires,
    ))

它通过一个非空的 kwargs 争论 super().__reduce__. 委托给 __reduce__ 实现可以处理这个问题,但这不是pickle机器会直接调用的。

© www.soinside.com 2019 - 2024. All rights reserved.