如何构建可以在字典或对象内设置任意值的函数?换句话说,一个可以设置任何值的函数。通过对象和子对象下降来设置层次结构中的任意项目或属性
例如,假设你有一个这样的词典:
my_dict = {
'foo' : 'bar',
'subdict':{
'sub1' : 1,
'sub2' : 2
}
}
我想创建一个setter
功能,使用这样的:
x = 'x'
# I want to be able to set normal dictionary items
setter(lambda val: val['foo'], my_dict, x)
# And also set subdictionary items
setter(lambda val: val['subdict']['sub1'], my_dict, x)
# Setting items that don't exist would be great too
setter(lambda val: val['new_item'], my_dict, x)
# If my_dict was a class, I'd like to use the same function, like this
setter(lambda val: val.myproperty, my_dict, x)
# Would also be cool if it worked with lists
my_list = [1, 2]
setter(lambda val: val[1], my_list, x)
我没有看到一个明显这样做的方法。下面清楚地用简单的方式不起作用:
def setter(get_attr_func, param, x):
# This doesn't work, but I'd like something like it
get_attr_func(param) = x
我可以使用setattr
来建立一些有关类属性的作品。我可以构建其他可用于字典中的项目的其他内容。但是我不知道你会怎么做它的子词典或子对象。
答案不一定要用这种确切形式。相反,我只想编写一个函数,在对象层次结构中设置任意的属性/项目。
不错的尝试。除了更改调用约定的子字典之外,它对所有值都很有用。也许这是不可能的。像C中的指针会帮助你。 – speedplane 2012-03-29 14:06:07
@speedplane我用一个和你的问题中的例子完全一样的工具取代了我的答案。它完全是类型不可知的 - 它可以与任何可以获取的对象或设置属性或项目。 – agf 2012-03-31 12:28:04
这令人印象深刻。我发现你可以将任意一组操作串在一起,所以更有趣的东西可以工作,例如:'set_my_dict_to_x(LocationProxy()['item'] [0] .prop ['item2'] [3])''。很酷! – speedplane 2012-04-01 22:02:13