如何構建可以在字典或對象內設置任意值的函數?換句話說,一個可以設置任何值的函數。通過對象和子對象下降來設置層次結構中的任意項目或屬性
例如,假設你有一個這樣的詞典:
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