2016-11-15 8 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(__ data [index]) 'を呼び出すのはどうでしょうか? – zipa

+0

ローカルウォッチドッグは 'while True:'のみで動作します。 'Trueの場合:データが変更された場合:#update_everything'。しかし、あなたの方法は間違っている、データを除いてすべてを設定する必要があります! 'Call_Local_FUNC ---> Call_Golbal_VAR ----> PUSH_TO_GLOBAL_FUNC -----> SET_GLOBAL_VAR'、あなたのコンピュータに命中するための銃を取る! – dsgdfg

+0

ゴールデンOOPルールの1つは、「複雑さを低く抑える」と言います。完全なリスト、配列、キーなどではなく、メソッドに文字列(キー、値)を渡すか、イテレータを使用します。 –

答えて

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']) 
) 

今、あなたは、例えば、updateLevelFile関数のparamにset_value_for_path関数の第二引数を変えることができます

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) 
関連する問題