尝试测试字符串是否为整数时脚本崩溃

时间:2017-09-27 18:55:45

标签: python

我正在为一个抽搐机器人制作一个python脚本,它基本上是一个老虎机。免责声明 - 我是蟒蛇新手,所以请不要杀了我。

在脚本开头,我有这段代码来检查输入的命令是否正确,检查第一个参数是否为整数,并检查用户是否有足够的点数。我们的想法是让他们选择赌博金额,所以一旦我开始工作,成本线就会改变。

if data.IsChatMessage():
    if (data.GetParam(0).lower() == settings["command"]
                    and isinstance((int(data.GetParam(1).lower())), int)
                    and settings["costs"] <= Parent.GetPoints(data.User)):

聊天的输入始终是字符串形式,即使它只是一个数字。我可以使用int()将其转换为int,但如果没有任何内容,或者除了数字之外还有其它内容,它会完全崩溃脚本。如何防止脚本崩溃,而是提醒用户输入整数?谢谢!

5 个答案:

答案 0 :(得分:2)

你写道:

isinstance(
    (int(data.GetParam(1).lower())),
    int
)

此片段存在两个问题:

  • 您调用int(..)构造函数,如果您提供非整数(例如"foobar18"),可能会失败(错误);和
  • 如果构造函数成功,则保证结果为int,因此检查无效

所以现在问题是做什么。我们可以构造一个高级检查来检查字符串是否确实是一个整数,但问题是我们必须覆盖多个案例,并且很容易忘记一个。

Python是一种语言: EAFP E asier A sk F orgiveness比的 P ermission。这意味着Python的哲学是鼓励尝试某些东西,在特殊情况下,处理它,而不是先检查某些东西是否为整数。

所以你可以把它写成:

if data.IsChatMessage():
    try:
        int(data.GetParam(1).lower())  # we try it
        isint = True  # it worked!
    except ValueError:
        # that did not worked out very well, did it?
        isint = False
    if (data.GetParam(0).lower() == settings["command"]
                    and isint
                    and settings["costs"] <= Parent.GetPoints(data.User):
        pass

您最好始终指定您希望看到的错误(ValueError),因为如果例如data.GetParam(1)引发另一个错误,您本身并不想在那里处理它:它并不意味着{ {1}}不是整数,这意味着data.GetParam(1).lower()发生了一些(其他)错误。

答案 1 :(得分:2)

如果isinstance((int(data.GetParam(1).lower())), int)不是整数,则行data.GetParam(1)将引发ValueError异常。

正如user8153建议的那样,使用try包装转换,除了块:

try:
    int(data.GetParam(1))
    print(data.GetParam(1) + 'is an integer')
except ValueError:
    print(data.GetParam(1) + 'is not an integer')

或者,您可以使用data.GetParam(1).isdigit()

答案 2 :(得分:1)

在做了一些研究后,我认为你可以使用try / except块来确保用户给出的值实际上是一个数字。

try:
    i = int(string)
    # normal execution
except ValueError:
    # error msg

我在这里得到了答案: Converting String to Int using try/except in Python

答案 3 :(得分:1)

要检查字符串是否可以转换为int,只需使用:

mystr = 'xx12'
if mystr.isnumeric():
    print('YES!')
else:
    print('NO')

答案 4 :(得分:0)

你可以像这样使用python内置字符串的方法.isnumeric()

>>> "".isnumeric()
False
>>> "a".isnumeric()
False
>>> "5".isnumeric()
True
>>> "55".isnumeric()
True
>>> "55a".isnumeric()
False

但是如果您还想检查数字是否为负数,则可能会出现问题,因为:

>>> "-5".isnumeric()
False
>>> a = "-4"
>>> a.lstrip("-").isnumeric() and (len(a)-len(a.lstrip("-")) <= 1)
True
>>> a = "--4"
>>> a.lstrip("-").isnumeric() and (len(a)-len(a.lstrip("-")) <= 1)
False

发送部分 (len(a)-len(a.lstrip("-")) <= 1) 检查数字前是否有超过 1 个 "-"