我有一个奇怪的要求。
我有一个方法(仅发布相关代码,而不是完整代码。)
def updateLevelFile(level, __data, mode='r+', encoding='utf-8'):
# I want this to be dynamic
__data[index]["tasks"][0]['choices'][0]["4"] = str(host['httporhttps'])
# I want this to be dynamic
需要# I want this to be dynamic
部分是动态的。
意味着我将传递此方法的更新键和值..
每次键都可以不同,在某些情况下,我们可以使用键["tasks"][2]["task_default_text"]
怎么做?
这个方法中的整个代码被使用了很多次,我不想复制它,我想让它成为一个方法并一次又一次地调用。
我做过什么?
我试过传递
'"tasks": [{"choices": [{"4": "1"}]}]'
等效于["tasks"][0]['choices'][0]["4"]
的JSON并解码为字典
然后执行__data[index]to_update
之类的操作,但语法显然无效。
答案 0 :(得分:2)
试试这个(假设我正确理解你的问题):
def set_value_for_path(obj, path, value):
for key in path[:-1]:
obj = obj[key]
# Note: will raise an exception if path is an empty list
obj[path[-1]] = value
并在您的函数中
set_value_for_path(
__data[index],
("tasks", 0, 'choices', 0, "4"),
str(host['httporhttps'])
)
现在您可以将set_value_for_path
函数的第二个参数转换为updateLevelFile
函数参数,例如。
def updateLevelFile(level, __data, mode='r+', encoding='utf-8', path):
# ...
set_value_for_path(__data[index], path, str(host['httporhttps']))
# ...
updateLevelFile(level, __data, 'r+', 'utf-8', ("tasks", 0, 'choices', 0, "4"))
答案 1 :(得分:2)
您可以使用kwargs,以下示例提供一个想法。
def updateLevelFile(level, __data, mode='r+', encoding='utf-8', **kwargs):
task_index = kwargs.pop('task_index')
key = kwargs.pop('key')
key_index = kwargs.pop('key_index')
__data[index]["tasks"][task_index][key][key_index]["4"] = str(host['httporhttps'])
#Example function call
updateLevelFile(level, __data, task_index=2, key="task_default_text", key_index=2)