我正在使用我使用的软件中的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 ...
对此进行编码的正确方法是什么?
答案 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]
。