2016-09-15 50 views
1

我正在嘗試執行SWITCH/CASE Disctionary中的問題。我從here用於交互式菜單的開關字典中的循環

得到一個例子我只是創建一個交互式菜單,您可以在其中按照您選擇的順序同時選擇多個選項。

ip = ["10.10.10.1","10.10.10.2"] 

def display_menu(): 
    os.system('clear') 
    main_title = "***** MENU *****" 
    print main_title.center(50,' ') 
    print("\n\n\t1. Ping Check\n\t2. CPU Load.") 

#Allows you to choose more than one option 
def pick_the_order(): 
    display_menu() 
    order = map(int,raw_input("Choose (separated by spaces if more than one): ").split()) 
    return order 

一旦選擇它調用選項的正確功能:

def echo_pick(ips1): 
    print "ECHO call", ips1 

def snmp_pick(ips1): 
    print "SNMP Call", ips1 

def numbers_to_functions_to_strings(argument): 
    global ip  
    for ips, option in zip(ip, argument): 
    print "Ip:",ips 
    print "option:", option 
    switcher = { 
     1: echo_pick(ips), 
     2: snmp_pick(ips) 
    } 
    switcher.get(option, "That is not a valid option") 

print numbers_to_functions_to_strings(pick_the_order()) 

我現在面臨的問題是,在運行程序時,它運行的每一個選項,無論你的選擇是1或2的輸出是這樣的(選擇選項1時和2):

Ip: 10.10.10.1 
option: 1 
ECHO call 10.10.10.1 
SNMP Call 10.10.10.1 
Ip: 10.10.10.2 
option: 2 
ECHO call 10.10.10.2 
SNMP Call 10.10.10.2 
None 

我期待的輸出是這樣的(選擇時選擇1和2):

Ip: 10.10.10.1 
option: 1 
ECHO call 10.10.10.1 
ECHO call 10.10.10.2 
Ip: 10.10.10.2 
option: 2 
SNMP Call 10.10.10.1 
SNMP Call 10.10.10.2 
None 

什麼使得FOR可以通過所有選項?即使我只選擇1個選項,比如說ECHO呼叫,它應該只呼叫echo_pick(ips1),但它仍然呼叫snmp_pick(ips)

任何人都可以幫助我瞭解我的邏輯部分工作不正常嗎?它似乎是繞過選項中的值,並只是運行它們。

回答

0

你實際上做了函數調用,而不是使用這些函數的引用。

如果你定義字典如下:

switcher = { 
    1: func1(ips) 
    2: func2(ips) 
} 

你已經取得的呼叫func1func2。這裏的解決方案只是對這些功能進行參考,找到正確的並執行它:

def numbers_to_functions_to_strings(argument): 
    # global ip: no need to make it global since you do not modify them. 

    switcher = { 
     1: echo_pick, # <-- reference to the function 
     2: snmp_pick 
    } 

    for option in arguments: 
     if option not in swticher: 
      print("Invalid option:", option) 
      continue 

     func_to_call = switcher[option] # <-- pick the right function 
     for ips in ip: # NOTE: you should reverse ips and ip. Naming convention :) 
      func_to_call(ips) # <-- call the function 

請注意,我沒有壓縮參數。也許這是因爲我不明白這個問題,但我認爲你在這裏誤用zip函數。

+0

FunkySayu,謝謝你的回覆。它工作得很好,你很棒。 另外這將是字提到,我的主要問題是,而不是打印我本來應該使用返回,這是其中一個問題。 至於ZIP,我把它留在原來的代碼中,因爲我使用它來進入許多數組並連續運行,以便進行比較和匹配。 – Pines

+0

另外要提到的是,您的解決方案幫助我解決了性能問題,並以不同的方式應用它。謝謝 – Pines

+0

嗯,我想你可以將返回值存儲在列表中,並在每個函數調用時填充列表。你想挑選所有結果嗎?什麼是預期回報合成?它在你的問題中不是很清楚:) – FunkySayu