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
相关产品推荐
相关产品推荐

