如何在 python 应用程序中将条件指令块简化为一个 elif 语句?

How to simplify conditional instructions block to one elif statement in python app?

我编写了一个简单的应用程序,允许对我学校计算机实验室本地网络中的机器执行 ping 操作,然后 reboot/turn 将它们全部关闭,或者一台一台地关闭。应用程序运行良好,但它包含分配给实验室中指定机器(有 18 台计算机)的大块 elif 语句:

def shutdown_all():
    with open(os.devnull, "wb"):
        for computer in range(1, 19):
            ip = "pracownia{0}".format(computer)
            subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
    print("\nTask complete\n")


def shutdown_selected(ip):
    with open(os.devnull, "wb"):
        machine = "pracownia{0}".format(ip)
        subprocess.call('shutdown -s -t 0 /m \\%s' % machine)
    print("\nTask complete\n")


while True:
    mode = input()
    if mode == 'exit':
        break
    elif mode == "shutdown -all":
        shutdown_all()
    elif mode == "shutdown -ip 1":
        shutdown_selected(1)
    elif mode == "shutdown -ip 2":
        shutdown_selected(2)
    elif mode == "shutdown -ip 3":
        shutdown_selected(3) 

        ...

    else:
        print("Wrong mode. Type valid command.")

是否可以简化指令并将整个块减少为一个 elif 语句,允许用户输入他想要的计算机ping/reboot/shutdown?

你能不能不做这样的事:

mode = input()
if mode == 'exit'
    break
elif mode == 'shutdown -all'
    shutdown_all()
elif mode[:12] == 'shutdown -ip':
    shutdown_selected(int(mode[-1:]))

您可以在最后一个 elif 语句中添加一些内容,以确保他们输入的内容适用于您的功能 - 这是您需要的吗?

降低大型 if-else 树复杂性的常用方法是使用字典。但是,您会将复杂性卸载到其他地方。例如:

options = dict(foo = foo, bar = bar, foobar = foobar)
options.get(input("Enter an option"), print('Input is not an option'))

此示例表明您对三个不同的选项关键字具有三个不同的函数。 get 方法将在字典中查找选项,否则将打印错误消息。

关于您的代码,我会将复杂性卸载到一个函数中:

def shutdown(command):
    computers = set(str(i) for i in range(1,19))

    with open(os.devnull, "wb"):
        selecComputers = set(command.split(' ')[2:]) # or use regex
        if len(selectComputers) > 0:
           computers = computers.intersection(selectComputers)
        for computer in computers:
            ip = "pracownia{0}".format(computer)
            subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
    print("\nTask complete\n")

while True:
    mode = input()
    if mode == 'exit':
        break
    elif 'shutdown' in mode:
        shutdown(mode)
    else:
        print("Wrong mode. Type valid command.")

与之前的答案相同,但使用正则表达式进行解析,因为 IP 可以是 1-2 位数字。

import re
mode = input()
if mode == 'exit'
    break
elif mode == 'shutdown -all'
    shutdown_all()
elif mode[:12] == 'shutdown -ip':
    match = re.search(r'\d+', mode)
    if match:
        ip = match.group()
        shutdown_selected(ip)