You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用可变数量命令行参数时的索引及其他错误排查

CS50 Python程序问题修复

问题根源分析

  1. 无参数时的IndexError:sys.argv永远不会为空,其第一个元素是脚本自身的名称,无额外参数时len(sys.argv)为1而非0。原代码错误判断len(sys.argv) == 0,且在len(sys.argv) == 2的分支中尝试访问不存在的sys.argv[2],直接触发索引越界。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:38:11