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

CS50 Python塔可店任务:EOF输入导致程序退出码异常求助

CS50 Python塔可店任务:EOF处理修复与check50报错解决

问题情况

正在完成哈佛大学CS50 Python课程的塔可店任务,程序基本能正常处理输入,但check50检测时报错:

:( input of EOF halts program   Cause   expected exit code 0, not 1

同时在GitHub的VS Code环境中,无法通过ctrl+z或ctrl+d触发EOFError,没法测试异常处理逻辑。

原代码如下:

menu = {
    "Baja Taco": 4.00,
    "Burrito": 7.50,
    "Bowl": 8.50,
    "Nachos": 11.00,
    "Quesadilla": 8.50,
    "Super Burrito": 8.50,
    "Super Quesadilla": 9.50,
    "Taco": 3.00,
    "Tortilla Salad": 8.00
}

def main():
    item = get_dish("Item: ")
    total = 0
    try:
        while True:
            try:
                total += menu[item.title()]
                print("$" + str(round(total, 3)))
                item = get_dish("Item: ")
            except KeyError:
                item = get_dish("Item: ")
                pass
    except EOFError:
        pass

def get_dish(prompt):
    dish = input(prompt)
    while dish.lower() in menu == False:
        dish = input(prompt)
    else:
        return dish

main()

代码问题分析

  1. get_dish函数判断逻辑错误:dish.lower() in menu永远为False,因为menu的键是首字母大写格式(比如"Baja Taco"),全小写字符串无法匹配,导致循环无限要求输入,无法正确返回有效内容。
  2. EOFError未被完整捕获:main函数中第一次调用get_dish("Item: ")在外层try块之外,触发EOF时,这个位置的input()会直接抛出EOFError,无except块捕获,导致程序以非0状态退出,这就是check50报错的核心原因。

修复后的代码

menu = {
    "Baja Taco": 4.00,
    "Burrito": 7.50,
    "Bowl": 8.50,
    "Nachos": 11.00,
    "Quesadilla": 8.50,
    "Super Burrito": 8.50,
    "Super Quesadilla": 9.50,
    "Taco": 3.00,
    "Tortilla Salad": 8.00
}

def main():
    total = 0
    try:
        while True:
            item = input("Item: ").title()
            if item in menu:
                total += menu[item]
                print(f"${total:.2f}")
    except EOFError:
        pass

main()

修复说明

  • 移除冗余的get_dish函数,直接在循环内处理输入,简化代码层级
  • 输入后直接转成title()格式,与menu的键匹配,准确判断是否为有效菜品
  • 将所有输入操作放在try块内,确保EOFError能被捕获,程序正常退出(退出码0)
  • 使用格式化字符串f"${total:.2f}"保证金额显示两位小数,符合任务输出要求

触发EOFError的测试方法

  1. 终端直接运行:
    • Linux/macOS:运行程序后输入若干菜品,按Ctrl+D触发EOF
    • Windows:运行程序后输入若干菜品,按Ctrl+Z再按回车触发EOF
  2. 管道输入测试:
    在终端执行命令,用echo传递输入内容,结束后自动触发EOF:
    echo -e "Taco\nBurrito" | python your_program.py
    
  3. 文件重定向输入:
    创建文本文件input.txt,每行写一个测试菜品,然后执行:
    python your_program.py < input.txt
    
    文件读取完毕后自动触发EOF

内容的提问来源于stack exchange,提问作者Mikołaj Przygoda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:50:33