__reduce__是否接受参数?

时间:2020-05-18 08:08:20

标签: python pickle

当我从别人那里读取代码时,我发现有人为接受参数的类定义了__reduce__。例如,here。如果您不知道,则__reduce__魔术方法用于腌制Python对象。

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

所以我引用document

该接口当前定义如下。 __reduce__()方法不使用任何参数,并且应返回字符串,最好返回一个元组(返回的对象通常称为“减少值”)。

有人帮助我理解吗?

1 个答案:

答案 0 :(得分: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__的实现可以解决这个问题,但这并不是泡菜机械直接做出的选择。