递归dict的易出核计算
fdict的Python项目详细描述
与dict的差异
尽管最大程度的兼容性是主要目标,但不同的实现当然会带来不可避免的差异。
主要区别在于调用 items() , keys() , values() 和 view* 方法将返回所有在任何级别嵌套的子级,而dict只返回直接子级。此外,默认情况下,这些方法只返回leaves(非dict对象)而不返回nodes,尽管您可以通过支持 nodes=true 参数来覆盖它。
另一个区别是冲突:一个项既可以是一个叶,也可以是一个节点,因为如果不遍历所有项(即使用 viewitems() ,则无法检查是否没有节点,而这种方法是 fdict 数据结构的限制)。
这也意味着,当分配已经分配的项时,节点将不会被替换,但是单例将被正确替换。更明确地说:
这有效:
d=fdict({'a':1,'b':{'c':2}})d['a']=-1print(d)d['a']={'d':3,'e':4}print(d)
{'a': -1, 'b/c':2} {'a/d':3,'a/e':4,'b/c':2}
但这并不像预期的那样工作:
d=fdict({'a':1,'b':{'c':2}})d['b']=-1print(d)
{'a':1,'b': -1, 'b/c':2}
一个小的区别是对键的处理:为键分配一个空dict不会创建键(例如, d['a'] ={} 不会创建键 a ,它将保持不存在,直到它被分配一个非空dict值),并且分配不存在的子键exist没有任何先前的父dict创建(例如, d= fdict(); d['a']['b']['c']['d'['e'] =1 可以)。
类似地,遍历 keys() 、 values() 和 items() 将遍历任何嵌套级别的所有嵌套叶。为了便于探索,如果您希望类似于 dict 的行为仅探索仅显示直接子项的直接子项,则可以使用 viewkeys_restrict() , viewitems_restrict() , viewvalues_restrict() , firstkey() , firstitem() , firstvalue() 。不过,请注意,步行速度不会比步行所有项目快(因为在内部,这是正在进行的),因此您无法使用这些方法优化速度,这只是为了方便。
另一个小的区别是如何处理 pop() 和 popitem() :它们将在任何嵌套级别返回下一个叶,而从不返回节点。因此,您无法在特定级别获取下一项,而只能在任何嵌套级别获取下一项。