为什么减少嵌套数据结构上的getitem失败?

时间:2018-10-19 03:02:42

标签: python python-3.x reduce functools

设置:我想编写一个方法,该方法将使用嵌套的数据对象和路径字符串,并尝试使用路径组件来取消引用数据对象内部的位置。

例如,您将拥有/alpha/bravo/0/charlie之类的路径,并且如果该路径是已定义的位置,则该方法将返回data_obj['alpha']['bravo'][0]['charlie']或执行其他操作(引发异常,记录警告,返回None(如果不是)。

尝试:我觉得可能有一种相当简单的方法来做,当我环顾四周时,发现this answer,这建议将functools.reduce与{{ 1}}遍历任意深度的字典。我想对其进行调整以涵盖可能具有嵌套列表的字典,所以我玩了一段时间,发现嵌套的operator.getitem调用可以正常工作,但是getitemgetitem的组合结果令人困惑的类型不匹配,如下所示。

问题:在下面显示的代码片段中,为什么reduce调用会导致异常,而其他进行嵌套调用的方式却没有呢?

我没有根据的猜测:reducefunctools中的某个内容将operator标识符设置为指向* {* 1 *}或getitem,而当被要求与list.__getitem__玩得很好时,它会卡在一个或另一个上,并且无法来回切换。

代码

dict.__getitem__

1 个答案:

答案 0 :(得分:3)

因此,应该 reduce(getitem, node_keys, data_obj)

reduce的签名为def reduce(function, sequence, initial=None) 其中initial是第三个参数。您的对象是初始的。