Python控制台条件判断异常:输入不匹配却执行elif分支
问题描述
我开发了一个Python控制台程序,预期输入任意内容会存入Console变量,输入未定义命令(如"vfdv")时应进入else分支,但实际触发了第二个elif的退出逻辑。
控制台输出
Console_ 2024-01-13 18:24:10.022254 C:\Users\Lenovo\Desktop\Username\Proj\vscript\Console_>> vfdv Session: 2024-01-13 18:24:10.022254 Exitting at: 2024-01-13 18:24:11.829106 PS C:\Users\Lenovo\Desktop\Username\Proj\vscript\Console_>
代码片段
print("Importing Required Libary...") import sys import os import datetime import logging version = "1.0.0a" session = datetime.datetime.now() dirnow = os.getcwd() os.system("cls") logging.basicConfig(level=logging.INFO, filename="py_log.log",filemode="w", format="%(asctime)s %(levelname)s %(message)s") print("Console_") print(session) while True: Console = None Console = input(dirnow + ">>") def Gettime(): nsession = datetime.datetime.now() #Get Time. print(nsession) #Show nsession = None #Clear if Console == "SendTest": Gettime() print("Test suscessful, return.") elif Console == "Exit" or "exit" or "EXIT" or "end" or "End" or "END": print("Session: ", session, " Exitting at:") Gettime() sys.exit() elif Console == "Return" or "return" or "RETURN" or Console == "pass" or "Pass" or "PASS": pass else: print("Error at:") Gettime() print("No Such Command as " + Console + ", return") logging.info("ERR NOCMD")
问题原因及修复
核心问题
第二个elif的判断逻辑完全错误:Console == "Exit" or "exit" or "EXIT" or "end" or "End" or "END"中,"exit"这类非空字符串在布尔判断里永远为True,不管Console是什么值,这个条件都会成立,直接触发退出逻辑。第三个elif也存在同样的问题。
修复方案
推荐用统一大小写+集合匹配的方式简化判断,同时处理输入前后的空格:
print("Importing Required Libary...") import sys import os import datetime import logging version = "1.0.0a" session = datetime.datetime.now() dirnow = os.getcwd() os.system("cls") logging.basicConfig(level=logging.INFO, filename="py_log.log",filemode="w", format="%(asctime)s %(levelname)s %(message)s") # 把函数定义放到循环外,避免重复定义 def Gettime(): nsession = datetime.datetime.now() print(nsession) print("Console_") print(session) while True: # 去除输入前后空格,转小写统一判断 Console = input(dirnow + ">>").strip() cmd = Console.lower() if cmd == "sendtest": Gettime() print("Test suscessful, return.") elif cmd in {"exit", "end"}: print("Session: ", session, " Exitting at:") Gettime() sys.exit() elif cmd in {"return", "pass"}: pass else: print("Error at:") Gettime() print(f"No Such Command as {Console}, return") logging.info("ERR NOCMD")
额外优化点
- 将
Gettime函数移到循环外,避免每次循环重复定义函数 - 使用
f-string替代字符串拼接,更简洁高效 - 用
strip()处理输入空格,避免用户输入带空格的命令时匹配失败
内容的提问来源于stack exchange,提问作者Inlandsteel
相关产品推荐
相关产品推荐

