2016-11-15 2 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": [{"choices": [{"4": "1"}]}]' эквивалент JSON из ["tasks"][0]['choices'][0]["4"] и декодируется в словаре

, а затем сделать что-то вроде __data[index]to_update, но его явно неправильного синтаксиса.

+0

Как определить новый метод 'to_update', который распакует JSON так, как вы хотите, а затем просто вызовите' to_update (__ data [index]) '? – zipa

+0

Локальный сторожевой таймер работает только с 'while True:'. 'Истина: если данные изменены: # update_everything'. Но ваш метод ошибочен, вам нужно настроить все на данные за исключением! 'Call_Local_FUNC ---> Call_Golbal_VAR ----> PUSH_TO_GLOBAL_FUNC -----> SET_GLOBAL_VAR', возьмите пистолет для попадания в компьютер! – dsgdfg

+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")) 
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) 
Смежные вопросы