python 为什么会出现属性错误:int对象没有属性“isnumeric”?

hrysbysz  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(330)

我目前正在创建一个程序,它会要求用户输入一个年份,然后通过查看年份是否可被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
mwngjboj

mwngjboj1#

您可以在此处将year设置为int

else:
        year = int(year)

然后while循环继续执行假定year仍然是str的代码,包括以下行:

else:
    if year.isnumeric() == False:

请注意,isnumericstr对象上的一个方法,它告诉您这些对象是否包含至少一个字符,并且仅由具有Unicode属性Numeric_Type=Digit、Numeric_Type=Decimal或Numeric_Type=Numeric的字符组成。它不是测试对象是否为数字,或者字符串是否表示数字-例如,'-1''1.5'isnumeric报告Falseint对象不是字符串,所以它们没有这样的方法。
为了避免这个问题,我建议将获得有效year的代码部分(作为int)与计算是否是闰年的代码部分分开:

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")

# First get the year.
while True:
    try:
        year = int(input("Please enter a year\n"))
        if len(str(year)) != 4:
           raise ValueError("wrong number of digits!")
        break
    except ValueError:
        print("Error. Please enter a year - it should be 4 digits long.")

# year is now an int with 4 digits.  Now figure out if it's leap.
if year % 4 == 0:
    print(f"{year} is a leap year")
    # Note: there is a bug here, leap year calculation
    # is actually more complicated than this!
else: 
    print(f"{year} is not a leap year, unfortunately")

关于“get a valid int”循环的一些一般性说明,以及如何比最初尝试的更简单地完成这种事情:
1.不需要将input()的结果转换为str或decodeinput只返回str(在现代版本的Python中--我看到你在那里潜伏,学究)。
1.与其试图 * 预测 * 将字符串转换为int失败的所有原因并编写一堆if来防止它们,只需try转换并使用except来捕获失败时引发的ValueError。这样您只需编写一个错误检查,你不需要通过逆向工程来实现它,在它执行之前,其他函数会做什么。
1.一旦你已经写了一个try/except,你可以在你的try的主体中使用一个raise来自动跳转到相应的except,而不必写两次相同的错误处理代码。

相关问题