我正在为一个抽搐机器人制作一个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,但如果没有任何内容,或者除了数字之外还有其它内容,它会完全崩溃脚本。如何防止脚本崩溃,而是提醒用户输入整数?谢谢!
答案 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 个 "-"
。