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

CS50P PSET8疑问:date.today()是否必要?本地正常但check50无输出报错

CS50P PSET8 问题排查与解决方案

问题描述

我在完成CS50P的PSET8作业时遇到以下问题:

  • 本地运行程序能输出正确结果,pytest测试全部通过,但使用check50检测时出现大量错误且无输出
  • 尝试过硬编码check50所用的“今日日期”,但因测试日期多样无法解决
  • 想请教datetime.date.today()是否是完成该作业的必要项

附原代码:

from datetime import date
import sys
import re
# pip imported library to convert numbers into word format
from num2words import num2words


def main():
    print(convert(input("Date of Birth: ")))


def convert(dob):
    # Validates user input
    if re.search(r'^([1-2][0-9][0-9][0-9])-([0-1][0-9])-([0-3][0-9])$', dob):
        today = date.today()
        try:
            # Validate date format
            input_date = date.fromisoformat(dob)
        except ValueError:
            sys.exit("Invalid Date")
    # Calulations
    minus = today - input_date
    calculation = minus.days * 24 * 60
    word_form = num2words(calculation)

    # removes the word 'and'
    final = re.sub(r' and', '', word_form)

    return f'{final.capitalize()} minutes'

else:
    sys.exit("Invalid Date")


if __name__ == "__main__":
    main()

问题分析与修复

1. 语法错误导致check50无输出

你的代码存在缩进错误:else语句没有与对应的if对齐,而是被放在了convert函数外部,这属于语法错误。check50运行时会因该错误直接终止,因此没有输出。

修复方法:

  • 将else缩进至与if re.search同级
  • 把计算逻辑移到if块内部,确保只有输入格式验证通过后才执行计算;若输入格式错误,进入else分支处理

2. datetime.date.today()的必要性问题

date.today()不是完成作业的必要项,反而会导致check50测试失败:

  • check50的测试用例使用固定的日期对(如指定出生日期和对应的“参考日期”),而date.today()会获取真实的当前日期,导致计算结果与测试预期不符
  • 正确的做法是让程序接收两个日期输入(出生日期和参考日期),或者让convert函数支持传入参考日期参数,而非硬编码当前日期

3. 其他逻辑问题修复

  • 不要在convert函数中使用sys.exit():函数应通过返回错误信息或抛出异常处理错误,直接退出程序会导致check50测试中断
  • 避免未定义变量:若输入格式不合法,today和input_date未被定义,执行计算会触发NameError

修复后的示例代码

from datetime import date
import re
from num2words import num2words


def main():
    dob_input = input("Date of Birth: ")
    # 可根据作业要求,让用户输入参考日期,或由测试用例传入
    reference_date = date.today()
    result = convert(dob_input, reference_date)
    if result:
        print(result)
    else:
        print("Invalid Date")


def convert(dob, reference_date):
    # 验证输入格式
    if not re.search(r'^([1-2][0-9]{3})-([0-1][0-9])-([0-3][0-9])$', dob):
        return None
    
    try:
        input_date = date.fromisoformat(dob)
    except ValueError:
        return None
    
    # 确保出生日期不晚于参考日期
    if input_date > reference_date:
        return None
    
    # 计算分钟数
    days_diff = (reference_date - input_date).days
    total_minutes = days_diff * 24 * 60
    word_form = num2words(total_minutes)
    
    # 移除"and"并格式化结果
    final_str = re.sub(r' and', '', word_form).capitalize()
    return f'{final_str} minutes'


if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Ejay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:20:39