如何调用任意深度python对象?

时间:2017-09-28 03:36:32

标签: python

我正在使用我使用的软件中的API处理脚本。我缺乏可用方法的文档,因此我无法控制自己拥有的内容。我想调用一个可以在对象中任意深埋的变量。我知道手头的深度,但它的范围很广。

示例:

index = ['foo','bar']
object['foo']['bar'].method()

我尝试过类似的事情:

temp = object[index[0]]
for ind in index[1:]:
    temp = temp[ind]
temp.method()

但是这个制作了一个副本(它不是根据我得到的回复)并没有正确应用该方法。索引可以任意长。

我唯一可行的解​​决方案是使用以下方法对此进行硬编码:

if lengthIndex == 1:
    object[index[0]].method()
if lengthIndex == 2:
    object[index[0]][index[1]].method()
if lengthIndex == 3:
    object[index[0]][index[1]][index[2]].method()
# and so on ...

对此进行编码的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

您的第一个代码示例不会复制该对象。在Python中,变量是引用(至少它是有效的工作原理),当你为变量赋值时,你只是复制一个内存地址,而不是复制事物本身。因此,如果您不使用它的唯一理由是您想避免制作不必要的对象副本,那么您无需担心。

您在代码示例中所做的是我处理重复索引的方式。

答案 1 :(得分:0)

如果问题的要点是要求索引任意嵌套词典的函数,请参阅以下内容:

def f():
    print('nested func')

def g():
    print('nested func 2')

def nested_value(nested_dict, keys):
    for k in keys:
        nested_dict = nested_dict[k]
    return nested_dict


nested_dict = {
    'foo': {
        'bar': {
            'baz': f
        },
        'taco': g
    }
}

keys = ['foo', 'bar', 'baz']
val = nested_value(nested_dict, keys)
val()

keys = ['foo', 'taco']
val = nested_value(nested_dict, keys)
val()

输出:

nested func
nested func 2

答案 2 :(得分:0)

In [5]: def get_deep_object(obj, index):
   ...:     for i in index:
   ...:         obj = obj[i]
   ...:     return obj
   ...: 

In [6]: l = ["foo", "bar"]

In [7]: get_deep_object(l, [1])
Out[7]: 'bar'

In [8]: get_deep_object(l, [1,1])
Out[8]: 'a'

In [9]: get_deep_object(l, [1,1]).capitalize()
Out[9]: 'A'

答案 3 :(得分:0)

您可以通过函数式编程获得更短(但不一定更易读)的解决方案:

from operator import getitem
from functools import reduce

reduce(getitem, index, object).method()
来自getitem

operator相当于lambda data, key: data[key]