【问题标题】:AttributeError: 'int' object has no attribute 'isdigit'AttributeError:“int”对象没有属性“isdigit”
【发布时间】:2018-01-12 18:51:43
【问题描述】:
numOfYears = 0
cpi = eval(input("Enter the CPI for July 2015: "))
if cpi.isdigit():
    while cpi < (cpi * 2):
        cpi *= 1.025
        numOfYears += 1
    print("Consumer prices will double in " + str(numOfYears) + " years.")
while not cpi.isdigit():
    print("Bad input")
    cpi = input("Enter the CPI for July 2015: ")

我收到以下错误。

AttributeError: 'int' 对象没有属性 'isdigit'

由于我是编程新手,我真的不知道它想告诉我什么。我正在使用if cpi.isdigit(): 来检查用户输入的数字是否有效。

【问题讨论】:

  • 为什么不使用int(input(...)),它将字符串转换为int
  • 您能否提供更多信息,例如您传递的价值是什么?你的python版本是什么?什么是堆栈跟踪?
  • 我正在输入一个整数“239”,但是当其他人运行该程序时,他们应该能够输入一个整数或浮点数。
  • 附加这个代码有一个巨大的Arbitrary code execution漏洞,因为它evaling用户输入,其中可能包含python代码。
  • 这段代码将永远循环,除非cpi 为负数,因为根据基本数学规则,非负数小于自身乘以二。

标签: python


【解决方案1】:

据记录,here isdigit() 是一个字符串方法。您不能为整数调用此方法。

这一行,

cpi = eval(input("Enter the CPI for July 2015: ")) 

evaluates 用户输入为整数。

>>> x = eval(input("something: "))
something: 34
>>> type(x)
<class 'int'>
>>> x.isdigit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'isdigit'

但是如果你删除eval 方法(你最好这样做),

>>> x = input("something: ")
something: 54
>>> type(x)
<class 'str'>
>>> x.isdigit()
True

一切都会好起来的。

顺便说一句,在没有 sanitizin 用户输入的情况下使用 eval 可能会导致问题

考虑一下。

>>> x = eval(input("something: "))
something: __import__('os').listdir()
>>> x
['az.php', 'so', 'form.php', '.htaccess', 'action.php' ...

【讨论】:

  • 但是你还是没有解释运行cpi *= 1.025cpistr时会发生什么...
  • 它会吐出TypeError,然后他会编辑问题,并会问“我还有另一个问题”:)
【解决方案2】:

使用这个:

if(str(yourvariable).isdigit()) :
    print "number"

isdigit() 仅适用于字符串。

【讨论】:

  • isdigit() 不适用于负数。它不会将 - 视为数字并返回 false。为了解决这个问题,你可以简单地使用这个...... yourString.replace("-","").isdigit()
【解决方案3】:
numOfYears = 0
# since it's just suppposed to be a number, don't use eval!
# It's a security risk
# Simply cast it to a string
cpi = str(input("Enter the CPI for July 2015: "))

# keep going until you know it's a digit
while not cpi.isdigit():
    print("Bad input")
    cpi = input("Enter the CPI for July 2015: ")

# now that you know it's a digit, make it a float
cpi = float(cpi)
while cpi < (cpi * 2):
    cpi *= 1.025
    numOfYears += 1
# it's also easier to format the string
print("Consumer prices will double in {} years.".format(numOfYears))

【讨论】:

  • 又名,用 str( ) 换行
【解决方案4】:

eval() is very dangerous!int() 内置函数可以将字符串转换为数字。

如果您想在用户未输入数字的情况下捕获错误,只需像这样使用try...except

numOfYears = 0

while numOfYears == 0:
    try:
        cpi = int(input("Enter the CPI for July 2015: "))
    except ValueError:
        print("Bad input")
    else:
        while cpi < (cpi * 2):
            cpi *= 1.025
            numOfYears += 1

print("Consumer prices will double in", numOfYears, "years.")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2021-11-30
    • 2020-03-26
    • 2013-04-15
    • 2021-01-18
    相关资源
    最近更新 更多