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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:48:30