为何出现AttributeError: 'int'对象无isnumeric属性?如何解决?
错误原因分析
- 核心触发点:类型不匹配+循环未终止
当程序校验通过4位数字年份后,会执行year = int(year)将字符串转为整数,但此时代码里写的是valid == True(这是比较操作,不是赋值),valid仍然是False,循环会继续执行。下一次循环时,year已经是整数类型,调用只有字符串才有的isnumeric()方法,自然抛出AttributeError。 - 其他拖后腿的错误
- 多处
valid == False都是无效的比较,根本改不了valid的状态,循环会一直重复执行。 year.decode(year)完全是错误用法:input()返回的本来就是字符串,不需要解码,而且decode()的参数是编码格式,不是字符串本身。
- 多处
修复方案
针对问题逐一修正:
- 修正赋值逻辑:把所有
valid == 布尔值改成valid = 布尔值,确保能正确控制循环启停。 - 删掉错误的解码代码:直接用
input()返回的字符串就行,不需要额外解码。 - 调整循环终止时机:在完成闰年判断后,立即把
valid设为True,让循环停下来,避免后续对整数类型的year做字符串操作。
修复后的完整代码:
print("Did you know that the last leap year was in 2020?") print("To find out if a year is a leap year, use this program") year = input("Please enter a year\n") valid = False while not valid: if year == "": print("Error. Please enter a year - it should be 4 digits long.") year = input("Please enter a year\n") valid = False elif not year.isnumeric(): print("Error. Please enter a year - it should be 4 digits long.") year = input("Please enter a year\n") valid = False elif len(year) != 4: print("Error. Please enter a year - it should be 4 digits long.") year = input("Please enter a year\n") valid = False else: year_int = int(year) # 采用严谨的闰年判断规则 if (year_int % 4 == 0 and year_int % 100 != 0) or year_int % 400 == 0: print(f"{year_int} is a leap year") else: print(f"{year_int} is not a leap year, unfortunately") valid = True
额外优化提示
原代码的闰年判断只检查了能否被4整除,这是不严谨的。严格的闰年规则是:能被4整除但不能被100整除,或者能被400整除,上面的修复代码已经补上了这个逻辑。
内容的提问来源于stack exchange,提问作者Azalea-Delphinium
相关产品推荐
相关产品推荐

