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

Python 尝试测试字符串是否为整数时脚本崩溃,python,Python,我正在为twitch机器人制作一个python脚本,它基本上充当老虎机。免责声明-我是python新手,所以请不要杀我 在脚本的开头,我用这段代码检查是否键入了正确的命令,检查第一个参数是否为整数,以及检查用户是否有足够的点数。这样做的目的是让他们选择一个金额进行赌博,这样一旦我成功,成本线就会改变 if data.IsChatMessage(): if (data.GetParam(0).lower() == settings["command"]

我正在为twitch机器人制作一个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,但是如果没有任何东西或者除了数字之外还有其他东西,那么脚本就会完全崩溃。如何防止脚本崩溃并提醒用户需要输入整数?谢谢

你写:

isinstance(
    (int(data.GetParam(1).lower())),
    int
)
此片段存在两个问题:

你称之为int。。构造函数,如果您提供一个像foobar18这样的非整数,则该错误可能会失败;和 如果构造函数成功,那么可以保证结果是int,因此检查是无用的。 所以现在的问题是怎么做。我们可以构造一个高级检查来检查字符串是否确实是整数,但问题是我们必须覆盖多个情况,并且很容易忘记一个

Python是一种具有以下思想的语言:EAFP:请求原谅比请求允许更容易。这意味着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的错误,因为如果instance data.GetParam1引发另一个错误,您本身并不希望在那里处理它:这并不意味着data.GetParam1.lower不是整数,这意味着data.GetParam1还出现了一些其他错误。

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

try:
    i = int(string)
    # normal execution
except ValueError:
    # error msg
我在这里得到了答案:

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

mystr = 'xx12'
if mystr.isnumeric():
    print('YES!')
else:
    print('NO')
如果data.GetParam1不是整数,则行isinstanceintdata.GetParam1.lower,int将引发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.GetParam1.isdigit

您可以使用python内置字符串的方法。isnumeric如下所示:

>>>.是数字 错误的 >>>a.是数字的 错误的 >>>5.3数字 符合事实的 >>>55.1是数字的 符合事实的 >>>55a.是数字的 错误的 但如果您还想检查数字是否为负数,则可能会出现问题,因为:

>>>-5.1是数字的 错误的 >>>a=-4 >>>a.lstrip-.isnumeric和lena-lena.lstrip->a=-4
>>>a.lstrip-.isnumeric和lena-lena.lstrip-你能用语言解释一下为什么你认为isinstanceintdata.GetParam1.lower,int会起作用吗?你所说的崩溃到底是什么意思?你有例外吗?这是什么?请尝试包装整数转换代码。。。块之外,并捕获字符串不表示有效整数时发生的ValueError异常。请看。欢迎来到SO:您可能想要阅读和阅读。至于您的问题,您可能需要阅读Python中的异常使用,例如www.pythonforbeginners.com/error-handling/exception-handling-in-Python。这可能不适合Unicode。文档中指出,数字字符包括数字字符,以及所有具有Unicode数值属性的字符,例如U+2155,普通分数五分之一。intu\u2155引发异常。