python defaultdict 递归_无法选取递归嵌套的defaultdict

这个

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({})})})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值