使用可变数量命令行参数时的索引及其他错误排查
CS50 Python程序问题修复
问题根源分析
- 无参数时的IndexError:
sys.argv永远不会为空,其第一个元素是脚本自身的名称,无额外参数时len(sys.argv)为1而非0。原代码错误判断len(sys.argv) == 0,且在len(sys.argv) == 2的分支中尝试访问不存在的sys.argv[2],直接触发索引越界。 - 参数非法时sys.exit未正常执行:原代码对参数数量的判断逻辑错误(把2个额外参数当成
len(sys.argv) == 2,实际应为len(sys.argv) == 3),导致合法参数分支无法触发;且未给sys.exit()传入错误提示,用户无法感知具体错误原因。
修复后的代码
import sys import random fonts = ['fontA', 'fontB'] def main(): # 先校验参数合法性,避免用户输入文本后才报错 if len(sys.argv) not in (1, 3): sys.exit("错误:请传入0个或2个命令行参数") s = input("Text: ") if len(sys.argv) == 1: print_random(s) else: if sys.argv[1] not in ("-f", "--font"): sys.exit("错误:第一个参数必须是-f或--font") if sys.argv[2] not in fonts: sys.exit(f"错误:可用字体为{', '.join(fonts)}") print_argument(s) def set_font(font): print(f"已设置字体:{font}") # 替换为实际渲染逻辑 pass def print_random(s): selected_font = random.choice(fonts) set_font(font=selected_font) print(f"渲染文本:{s}(字体:{selected_font})") # 此处添加实际文本渲染逻辑 def print_argument(s): selected_font = sys.argv[2] set_font(font=selected_font) print(f"渲染文本:{s}(字体:{selected_font})") # 此处添加实际文本渲染逻辑 if __name__ == "__main__": main()
关键修改点
- 参数长度校验:先判断
len(sys.argv)是否为1(无额外参数)或3(2个额外参数),非法长度直接报错退出。 - 参数格式拆分校验:分别检查参数标识和字体合法性,给出明确错误提示,方便用户定位问题。
- 移除冗余print:原代码中
print(print_random(s))会打印None(函数无返回值),改为直接调用函数。 - 提前参数校验:将参数校验放在用户输入文本之前,避免无效输入操作。
- 添加错误提示:给
sys.exit()传入具体错误信息,提升用户体验。
内容的提问来源于stack exchange,提问作者RobG82
相关产品推荐
相关产品推荐

