Python代码校验时触发EOF Error的原因咨询
EOFError在validateDay函数测试中的原因与修复
报错原因分析
在线课程的自动化测试系统通过预设输入流验证代码逻辑,和你本地手动输入的运行环境存在核心差异:
- 你的
validateDay函数循环条件存在逻辑错误:当前判断是while not (0 < day < number_of_days),这意味着当day等于当月最大天数时(比如1月的31号),会被判定为无效值,强制进入循环要求重新输入。 - 测试系统的用例中,可能已经输入了符合要求的日期(比如31号),但你的代码会继续等待输入,而测试系统没有准备额外的输入数据,导致
input()函数读取不到内容,触发EOFError。
修复方案
修正validateDay函数中的循环条件,把日期范围改为正确的1 <= day <= number_of_days:
def validateDay(month, day, year): if (month == 1) or (month == 3) or (month == 5) or (month == 7) or (month == 8) or (month == 10) or (month == 12): number_of_days = 31 elif (month == 4) or (month == 6) or (month == 9) or (month == 11): number_of_days = 30 elif (month == 2) and (leap_year(year) == 1): number_of_days = 29 else: number_of_days = 28 # 修正循环条件,允许day等于当月最大天数 while not (1 <= day <= number_of_days): day = int(input("Invalid day. Please enter value from 1-" + str(number_of_days) + ": ")) return(day)
额外优化建议
leap_year函数返回1/0可以改为返回布尔值True/False,更符合Python习惯,后续判断也更直观:
def leap_year(year): if ((year % 100 == 0) and (year % 400 == 0)) or (year % 4 == 0): return True else: return False
调用时直接写leap_year(year)即可,无需判断是否等于1。
内容的提问来源于stack exchange,提问作者YugtramsEmosewa
相关产品推荐
相关产品推荐

