如何将这些参数传递给方法 - Python 2.7

时间:2016-11-15 11:11:21

标签: python-2.7

我有一个奇怪的要求。

我有一个方法(仅发布相关代码,而不是完整代码。)

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之类的操作,但语法显然无效。

2 个答案:

答案 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)