我正在尝试实施的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)
任何人都可以帮助我解决逻辑中哪些部分无法正常工作?似乎是绕过选项中的值并且无论如何都要运行它们。
答案 0 :(得分:0)
您实际上是在进行函数调用,而不是使用对这些函数的引用。
如果您将字典定义如下:
switcher = {
1: func1(ips)
2: func2(ips)
}
您已拨打func1
和func2
。这里的解决方案只是引用这些函数,得到正确的函数并执行它:
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
功能。