2017-06-28 10 views
0

で更新してください申し訳ありませんが、すでに尋ねられていてもナレッジベースで回答が見つかりませんでした。 私はあなたのコードを持って、ここの下に、再帰的な手続きを経て、辞書内の値を更新しようとしている:dictの値を再帰的プロシージャpython

import os 

incmds={ 
    'ip':{ 
     'link':{ 
      'show':[] 
     }, 
     'addr':{ 
      'show':[] 
     }, 
     'route':{ 
      'show':[] 
     } 
    } 
} 

cmd_list=[] 

def go_through_dict(parental_key,passeddict,cmd_list): 
    for k,v in passeddict.items(): 
     t=parental_key+' '+k 
     if isinstance(v, dict): 
      go_through_dict(t,v,cmd_list) 
     else: 
      t=t.strip() 
      cmd_list.append(t) 
      with os.popen(t) as f: 
#    print 'Issueing the command: '+t 
       v=f.readlines() 
#    print 'Result:',v 
## main ## 
cmd='' 
go_through_dict('',incmds,cmd_list) 

for cmd in cmd_list: 
    print cmd 

print incmds 

私はそれを実行したとき、私は辞書のincmdsの内側の値は更新されません参照してください。 は、実際には最終的に私が取得:

ip route show 
ip link show 
ip addr show 
{'ip': {'route': {'show': []}, 'link': {'show': []}, 'addr': {'show': []}}} 

私はそれは変更が外部に反映されるべきで終了したら、私はプロシージャ内で何かを変更した場合、デフォルトの変数によって、したがって、参照によって渡されると思います。事は、私はこれがちょうどPOCで、ゴールはdictのツリーとして説明し、いくつかのOSコマンドがあり、出力がに保存されている持っている確かにあるこの

incmds['ip']['addr']['show']=<output of the command> 

のような伝統的な方法で値を変更していないよということです葉。

私のツリーの葉を実際に変更するための手順を変更するにはどうすればよいですか(dictのもっとも重要な要素の値を意味する)?

私はツリー内のポイントを追跡してから、式を "評価"する必要がありますか?またはそれはどうですか?かかわらず、私の木の大きさのそれはコンパクトだったので、私は、再帰的手続きのアイデアを気に入ったが、今、私は私が事前に

感謝:-)値を更新できないという問題に直面してい冒頭

アレックス

答えて

2

それはあなたが辞書を反復処理するという事実に沸く:

for k,v in passeddict.items(): 

とを修正、あなたはではありません辞書項目を変更すると、新しい値をvに割り当てるだけです。あなたは交換する必要があります。

v=f.readlines() 

で:

passeddict[k] = f.readlines() 
+0

はところで、これは再帰とは全く無関係です。 –

+0

パーフェクト、私は明らかに見逃しました:-( – user2984629

+0

実際には関係がありません、私はそれが私がツリーの完全な経路を(私がそれを追跡しない限り)知らない値を更新したい時点であったと思ったが、今では必要ではないので、私はローカルキーと値が必要です。 – user2984629

関連する問題