2016-11-15 67 views
0

我有一個奇怪的要求。如何將這些參數傳遞給方法 - 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"][0]['choices'][0]["4"]

'"tasks": [{"choices": [{"4": "1"}]}]'相當於JSON和解碼成字典

,然後像做__data[index]to_update但它顯然無效的語法。

+0

有關定義新方法'to_update',將解壓JSON你想它,然後順便什麼就叫'to_update(__數據[指數])'? – zipa

+0

本地看門狗只能用'while True:'工作。 '雖然是真的:如果數據改變了:#update_everything'。但是你的方法是錯誤的,需要設置一個數據除外! 'Call_Local_FUNC ---> Call_Golbal_VAR ----> PUSH_TO_GLOBAL_FUNC -----> SET_GLOBAL_VAR',拿着槍打你的電腦! – dsgdfg

+0

一個黃金OOP規則說「保持複雜性低水平」。將字符串(鍵,值)傳遞給方法,而不是完整的列表,數組,鍵等。或者使用迭代器... –

回答

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功能PARAM,例如

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")) 
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)