这个
defaultdict
类实现
object.__reduce__()
method
其中,返回元组的第二个元素(构造函数的参数)将始终是工厂对象:
>>> d = NestedDict()
>>> d.__reduce__()
(, (,), None, None, )
然后将该参数传递给
NestedDict()
调用以重新生成对象。引发异常的原因是
NestedDict
类不接受参数。
__reduce__
子类中的方法:
class NestedDict(defaultdict):
def __init__(self):
super().__init__(self.__class__)
def __reduce__(self):
return (type(self), (), None, None, iter(self.items()))
defaultdict.__reduce__()
返回,但第二个元素现在是空元组。
您也可以只接受和忽略一个参数:
class NestedDict(defaultdict):
def __init__(self, _=None): # accept a factory and ignore it
super().__init__(self.__class__)
这个
_
名字通常用来指
我忽略了这个值
.
另一个实现可以只是子类
dict
提供一个习惯
__missing__
method
;对于不在字典中的键调用此方法:
class NestedDict(dict):
def __missing__(self, key):
nested = self[key] = type(self)()
return nested
def __repr__(self):
return f'{type(self).__name__}({super().__repr__()})'
它的工作方式与您的版本完全相同,但不需要其他pickle支持方法:
>>> d = NestedDict()
>>> d['foo']
NestedDict({})
>>> d['foo']['bar']
NestedDict({})
>>> d
NestedDict({'foo': NestedDict({'bar': NestedDict({})})})
>>> pickle.loads(pickle.dumps(d))
NestedDict({'foo': NestedDict({'bar': NestedDict({})})})