gpt4 book ai didi

python - 不可能用 kwargs 解开新样式?

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:12 25 4
gpt4 key购买 nike

在我的类实例化过程中,我初始化了一些不可 picklable 的字段。因此,为了能够正确地(un)pickle 我的类,我希望在 unpickling 时调用我的 init 方法。这似乎是它处理旧式类的方式。

对于新样式类,我需要使用 __new____getnewargs__。这是我所做的:

import cPickle


class Blubb(object):

def __init__(self, value):
self.value = value


class Bla(Blubb):

def __new__(cls, value):
instance = super(Bla, cls).__new__(cls)
instance.__init__(value)
return instance

def __getnewargs__(self):
return self.value,

def __getstate__(self):
return {}

def __setstate__(self, dct):
pass

x = Bla(2)
print x.value
pickled = cPickle.dumps(x, 2)
x_ = cPickle.loads(pickled)
assert x_.value == 2

如果不是因为 obj = C.__new__(C, *args) 这一事实,这会很好。现在有 **kwargs。因此,我的 __new____init__ 方法中只能使用非关键字参数。

有谁知道解决这个问题的方法吗?这确实很不方便。

最佳答案

pickle 协议(protocol) 2 默认要调用 cls.__new__(cls, *args),但有一种方法可以解决这个问题。如果您使用 __reduce__,您可以返回一个函数,它将您的参数映射到 __new__。我能够修改您的示例以使 **kwargs 工作:

import cPickle

class Blubb(object):

def __init__(self, value, foo=None, bar=None):
self.value = value
self.foo = foo
self.bar = bar

def _new_Bla(cls, value, kw):
"A function to map kwargs into cls.__new__"
return cls.__new__(cls, value, **kw)

class Bla(Blubb):

def __new__(cls, value, **kw):
instance = super(Bla, cls).__new__(cls)
instance.__init__(value, **kw)
return instance

def __reduce__(self):
kwargs = {'foo': self.foo, 'bar': self.bar}
return _new_Bla, (self.__class__, self.value, kwargs), None

x = Bla(2, bar=[1, 2, 3])
pickled = cPickle.dumps(x, 2)
y = cPickle.loads(pickled)
assert y.value == 2
assert y.bar == [1, 2, 3]

关于python - 不可能用 kwargs 解开新样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com