__reduce__ 是否接受参数?
Does __reduce__ accept arguments?
当我阅读别人的代码时,我发现有人为 class 接受参数定义了 __reduce__
。例如,here。如果您不知道,__reduce__
魔术方法用于酸洗 Python 对象。
def __reduce__(self, args=(), kwargs=None):
kwargs = {} if not kwargs else kwargs
return (unpickle_backend, (self.__class__, args, kwargs))
所以我引用 document:
The interface is currently defined as follows. The __reduce__()
method takes no argument and shall return either a string or preferably a tuple (the returned object is often referred to as the “reduce value”).
有人帮我理解吗?
pickle 机器只会在没有参数的情况下调用 __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 机器直接进行的调用。
当我阅读别人的代码时,我发现有人为 class 接受参数定义了 __reduce__
。例如,here。如果您不知道,__reduce__
魔术方法用于酸洗 Python 对象。
def __reduce__(self, args=(), kwargs=None):
kwargs = {} if not kwargs else kwargs
return (unpickle_backend, (self.__class__, args, kwargs))
所以我引用 document:
The interface is currently defined as follows. The
__reduce__()
method takes no argument and shall return either a string or preferably a tuple (the returned object is often referred to as the “reduce value”).
有人帮我理解吗?
pickle 机器只会在没有参数的情况下调用 __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 机器直接进行的调用。