避免嵌套 If Else 语句中的重复

Avoiding repetition in nested If Else statements

提问人:Japs6901 提问时间:7/5/2023 最后编辑:DataJanitorJaps6901 更新时间:7/5/2023 访问量:67

问:

我正在尝试通过 / 管理命令行语句。下面的代码有效,但感觉很长。尤其是每个嵌套/级别中的重复语句。有没有办法简单地留下任何内部级别并服从外部语句来整理代码?调用了两个函数,以及 。我没有包括这些,因为我真的只是想整理主要功能。我知道这个函数应该全部缩进,但这就是它从我的文件中粘贴的方式。ifelseelseifelseelserndm()spcfc()def main()

def main():
    if len(sys.argv) == 1:
        txt = input("Input: ")
        rndm(txt)
    if len(sys.argv) == 3:
        if sys.argv[1] == "-f" or sys.argv[1] == "--font":
            if sys.argv[2] in figlet.getFonts():
                txt = input("Input: ")
                spcfc(txt)
            else:
                print("Invalid usage")
                sys.exit
        else:
            print("Invalid usage")
            sys.exit
    else:
        print("Invalid usage")
        sys.exit
python if-statement 嵌套

评论

4赞 deceze 7/5/2023
FWIW,使用该模块,您可以免费获得这些检查。另外,不调用它就不做任何事情。argparsesys.exit
0赞 matszwecja 7/5/2023
如果你在子句中,那么,根据定义,子句不应该发生。ifelse
0赞 Michael Butscher 7/5/2023
您可以将嵌套的 if 移动到一个单独的函数中,该函数在成功时返回(从最内层的 if)并在该代码之后打印错误(并退出)(仅在之前没有成功时执行)。
0赞 Japs6901 7/6/2023
@deceze。如果你说我应该先导入sys,那么我确实在原始代码中导入了它。对不起,我没有在这里展示。我不知道“argparse”模块。谢谢
1赞 deceze 7/6/2023
不,我是说你需要像这样调用函数:.sys.exitsys.exit()

答:

3赞 Zero 7/5/2023 #1

您可以使用逻辑组合嵌套的 s。ifand

import sys

def main():
    if len(sys.argv) == 1:
        txt = input("Input: ")
        rndm(txt)

    if (len(sys.argv) == 3) and (sys.argv[1] == "-f" or sys.argv[1] == "--font") and (sys.argv[2] in figlet.getFonts()):
        txt = input("Input: ")
        spcfc(txt)
        
    else:
        print("Invalid usage")
        sys.exit()

此外,正如您在此处看到的,不再需要嵌套的 else 重复。

评论

0赞 Japs6901 7/6/2023
谢谢。我想过逻辑,但不确定是否可以使用括号进行分组。这极大地简化了我的代码。
1赞 Julien 7/5/2023 #2

请参阅@deceze的评论,但除此之外(以及概念也适用于您还没有免费解决方案的情况)您可以做这样的事情吗?

def main():
    if len(sys.argv) == 1:
        txt = input("Input: ")
        rndm(txt)
    if len(sys.argv) == 3:
        if sys.argv[1] == "-f" or sys.argv[1] == "--font":
            if sys.argv[2] in figlet.getFonts():
                txt = input("Input: ")
                spcfc(txt)
                return
    print("Invalid usage")
    sys.exit()

请注意,使用这种方法的一个好处是它也可以与更复杂的分支一起使用......

评论

0赞 Japs6901 7/6/2023
谢谢。这很有效。我不知道使用“return”语句,除非从函数返回某些内容。请问,您的退货声明在这里到底是做什么的?我假设它只是默认为函数的第 1 级并打印无效用法 txt?
1赞 Julien 7/6/2023
return只是在到达函数的任何地方结束函数执行。它不会跳出块(例如,像一个),它真的退出了函数(但不是整个程序,就像)。当返回“nothing”时,默认情况下实际上会返回 a(您可以忽略)。因此,如果所有 pass 都被调用,然后函数停止(返回)。但除此之外,执行只是跳过失败的检查,永远不会看到任何检查,因此最终会到达指令。breakexit()Noneifspcfc(txt)ifreturnprint("Invalid usage")