用于交互式菜单的switch-dictionary中的for循环

时间:2016-09-15 19:24:54

标签: python for-loop switch-statement

我正在尝试实施的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,它都为每个选项运行for。输出是这样的(当选择选项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)

任何人都可以帮助我解决逻辑中哪些部分无法正常工作?似乎是绕过选项中的值并且无论如何都要运行它们。

1 个答案:

答案 0 :(得分: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功能。