【问题标题】:for loop in a switch-dictionary for interactive menu用于交互式菜单的切换字典中的 for 循环
【发布时间】:2016-09-15 19:24:53
【问题描述】:

我在尝试实现的 SWITCH /CASE 字典中遇到问题。我从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())

我面临的问题是,在运行程序时,它会为每个选项运行 for,无论您的选项是 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)

谁能帮助我解决我的逻辑的哪一部分工作不正常?似乎这是绕过选项中的值,并且无论如何都运行它们。

【问题讨论】:

    标签: python for-loop switch-statement


    【解决方案1】:

    您实际上是调用函数,而不是使用对这些函数的引用。

    如果您将字典定义如下:

    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 函数。

    【讨论】:

    • FunkySayu,感谢您的回复。它工作得很好,你很棒。也有人提到我遇到的主要问题是我应该使用 RETURN 而不是打印,这是问题之一。至于ZIP,我留下了它,因为for中的原始代码我使用它来进入许多数组并连续运行它以进行比较和匹配。
    • 还要提到您的解决方案帮助我解决了我在以不同方式应用它时遇到的性能问题。谢谢
    • 好吧,我想您可以将返回值存储在一个列表中,并在每个函数调用时填充该列表。你想挑选所有的结果吗?预期的回报形式是什么?你的问题不是很清楚:)
    • 对于其中的函数X_pick,我调用了其他函数,这些函数调用了回显请求和SNMP get,我也在其他代码中使用了这些函数。我只是以打印为例,但我意识到这是问题之一。但主要是你在那里建立的 SWITCH/Case 帮助我正确地调用它们,它也帮助我提高了调用的性能(它调用它们更快)。返回值只是布尔值,因此我可以将它们用于主程序中的其他决策。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多