【问题标题】:ValueError: invalid literal for int() with base 10 -- how to guard against invalid user input?ValueError: int() 以 10 为底的无效文字——如何防止无效的用户输入?
【发布时间】:2011-09-17 15:05:46
【问题描述】:

我制作了一个程序,用户输入一个数字,该程序将计数到该数字并显示花费了多少时间。但是,每当我输入字母或小数(即 0.5)时,都会出现错误。以下是完整的错误信息:

Traceback (most recent call last):
  File "C:\Documents and Settings\Username\Desktop\test6.py", line 5, in <module>
    z = int(z)
ValueError: invalid literal for int() with base 10: 'df'

我能做些什么来解决这个问题?

这里是完整的代码:

import time
x = 0
print("This program will count up to a number you choose.")
z = input("Enter a number.\n")
z = int(z)
start_time = time.time()
while x < z:
    x = x + 1
    print(x)
end_time = time.time()
diff = end_time - start_time
print("That took",(diff),"seconds.")

请帮忙!

【问题讨论】:

  • 预期的行为是什么? z 在输入中应该包含“df”或“0.5”而不是数字?

标签: python validation user-input


【解决方案1】:

嗯,确实有一种方法可以“解决”这个问题,它的行为符合预期——你不能将一个字母大小写为一个 int,这真的没有意义。您最好的选择(这是一种 Pythonic 的做事方式)是简单地编写一个带有 try... except 块的函数:

def get_user_number():
    i = input("Enter a number.\n")
    try:
        # This will return the equivalent of calling 'int' directly, but it
        # will also allow for floats.
        return int(float(i)) 
    except ValueError:
        #Tell the user that something went wrong
        print("I didn't recognize {0} as a number".format(i))
        #recursion until you get a real number
        return get_user_number()

然后您将替换这些行:

z = input("Enter a number.\n")
z = int(z)

z = get_user_number()

【讨论】:

  • 为什么在失败时递归调用自己?那是非常低效的。
  • @Jeff 虽然 Python 没有针对尾递归进行优化,但至少必须对用户有一定的信任——我们需要假设他们在第二次或第三次被告知他们搞砸了,他们会得到消息的。看着它,我想我可以把它放在while True: 但对我来说这读起来更明确。
【解决方案2】:

试试看

if string.isdigit(z):

如果是数字,则执行其余代码。

因为您以 1 为间隔计数,所以使用 int() 应该很好,因为您不需要小数。

编辑:如果您想像下面 wooble 建议的那样捕获异常,请使用以下代码:

try: 
    int(z)
    do something
except ValueError:
    do something else

【讨论】:

  • 捕获异常更像是pythonic。
  • 另外,如果可以的话,你应该等到do something 直到try except 块之后。这样你就不太可能发现一些不相关的错误。
  • string.isdigit 不兼容 Python 3.x
  • z.isdigit() 是 Python3 好的。 @Wooble 不一定,不要教条。在这种情况下更容易做什么 - 我认为 1 行检查胜过 2-3 行尝试/捕获
猜你喜欢
  • 2018-09-09
  • 2020-01-04
  • 2010-12-22
  • 2011-07-07
  • 2019-10-14
  • 2022-05-19
相关资源
最近更新 更多