我目前正在创建一个程序,它会要求用户输入一个年份,然后通过查看年份是否可被4整除来说明它是否是闰年。它也有一个类型检查,存在检查和长度检查。我一直得到AttributeError:“int”对象没有属性“isnumeric”
总而言之,程序运行得很好,正如我所希望的(代码如下),但当程序完成时,它会显示上述属性错误。为什么它会显示该消息,我如何解决它?
验证码:
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")
year = str(year)
valid = False
while valid == False:
if year == "":
print("Error. Please enter a year - it should be 4 digits long.")
year = input("Please enter a year\n")
year = year.decode(year)
valid == False
else:
if year.isnumeric() == False:
print("Error. Please enter a year - it should be 4 digits long.")
year = input("Please enter a year\n")
year = str(year)
valid == False
else:
if len(year) != 4:
print("Error. Please enter a year - it should be 4 digits long.")
year = input("Please enter a year\n")
year = str(year)
valid == False
else:
year = int(year)
rem = year%4
if rem == 0:
print(f"{year} is a leap year")
else:
print(f"{year} is not a leap year, unfortunately")
valid == True
1条答案
按热度按时间mwngjboj1#
您可以在此处将
year
设置为int
:然后
while
循环继续执行假定year
仍然是str
的代码,包括以下行:请注意,
isnumeric
是str
对象上的一个方法,它告诉您这些对象是否包含至少一个字符,并且仅由具有Unicode属性Numeric_Type=Digit、Numeric_Type=Decimal或Numeric_Type=Numeric的字符组成。它不是测试对象是否为数字,或者字符串是否表示数字-例如,'-1'
和'1.5'
为isnumeric
报告False
。int
对象不是字符串,所以它们没有这样的方法。为了避免这个问题,我建议将获得有效
year
的代码部分(作为int
)与计算是否是闰年的代码部分分开:关于“get a valid int”循环的一些一般性说明,以及如何比最初尝试的更简单地完成这种事情:
1.不需要将
input()
的结果转换为str或decode
。input
只返回str
(在现代版本的Python中--我看到你在那里潜伏,学究)。1.与其试图 * 预测 * 将字符串转换为
int
失败的所有原因并编写一堆if
来防止它们,只需try
转换并使用except
来捕获失败时引发的ValueError
。这样您只需编写一个错误检查,你不需要通过逆向工程来实现它,在它执行之前,其他函数会做什么。1.一旦你已经写了一个
try/except
,你可以在你的try
的主体中使用一个raise
来自动跳转到相应的except
,而不必写两次相同的错误处理代码。