Python 如果未到达语句

Python 如果未到达语句,python,python-3.x,discord.py,Python,Python 3.x,Discord.py,我正在生成一个简单的discord.py命令,由于某种原因,该命令不起作用。我试图发出一个slowmode命令,但似乎有一个错误。这是命令中的代码: @commands.command() 异步def slowmode(self,ctx,秒=5): 如果秒数==“关闭”: 秒=0 elif seconds==“开”: 秒=5 秒=整数(秒) 等待ctx.channel.edit(慢模式延迟=秒) 嵌入=不和谐。嵌入( title='Slowmode已更改', description=f'已将{c

我正在生成一个简单的
discord.py
命令,由于某种原因,该命令不起作用。我试图发出一个
slowmode
命令,但似乎有一个错误。这是命令中的代码:

@commands.command()
异步def slowmode(self,ctx,秒=5):
如果秒数==“关闭”:
秒=0
elif seconds==“开”:
秒=5
秒=整数(秒)
等待ctx.channel.edit(慢模式延迟=秒)
嵌入=不和谐。嵌入(
title='Slowmode已更改',
description=f'已将{ctx.message.channel.antify}的slowmode更改为:`seconds}`seconds',
颜色=0x15E700
)
等待ctx.send(嵌入=嵌入)
问题是,每当我输入
$slowmode off
$slowmode on
$
是前缀)时,我都会收到以下错误:
discord.ext.commands.errors.BadArgument:参数“秒”转换为“int”失败。

我清楚地指出,如果
秒数
,它将分别变为
5
0


此外,每当我选择输入一个不正确的参数(如在一堆随机字母中),并且我有一个
try
except
块时,代码立即跳过
try
except
块,并返回上面的确切错误。几乎就好像代码不在那里一样。

您注意到的行为是由于命令扩展的错误。具体而言,问题在于如何声明命令的参数:

@commands.command()
异步def slowmode(self,ctx,秒=5):
seconds
有一个
int
默认参数,因此转换器将其转换为
int
。由于您也接受此参数的字符串值,因此当它尝试将
'on'
转换为
int
时,它将引发
BadArgument
。有一个可用于注释
seconds
变量的变量,以正确接受
str
int
输入:

从键入import Union开始
@commands.command()
异步def slowmode(self,ctx,seconds:Union[int,str]=5):
此外,在尝试检查字符串值之前,应检查
秒的类型:

@commands.command()
异步def slowmode(self,ctx,seconds:Union[int,str]=5):
如果是持续时间(秒,str):
如果秒数==‘开’:
秒=5
elif秒数==“关闭”:
秒=0
#不再需要
#秒=整数(秒)

这样,您也不再需要显式地将
seconds
强制转换为
int

我看不出您在哪里打印出了导致问题的值。这对于诊断非常重要。您将
秒作为int传递,检查它是
打开
还是
关闭
,然后将该字符串转换为
int
。我会先重温一下。我也没有在您的代码中看到任何前缀
$
。你能澄清一下吗?我认为discord.py本身正在将参数解析为整数,因为它的默认值是整数。如果你想让它成为一个可以自己解析的字符串,试着把默认值设为
seconds='on'
;discord.py确实自动将
seconds
转换为
int
,因为默认参数是
int
。您可以按照@jasonharper的建议将其更改为
'on'
,或者从
键入
模块添加
Union
注释:
seconds:Union[int,str]
。我回答了一个类似的问题。不需要强制转换为int或
isinstance
。如果
seconds
不是字符串,那么无论如何比较都会失败,因此无需检查它是否是字符串。。。至于转换为int,要么该参数已经是int,要么如果它是“开”或“关”,它将被重新指定为int…@Tomerikoo你读过该参数是做什么的,以及为什么会引发
BadArgument
?如果有人使用字符串参数调用
slowmode
命令,而coroutine参数保留为
seconds=5
,则在运行
slowmode
coroutine中的任何内容之前将引发
BadArgument
。这与我所说的无关。。。我是说你用
联合体
修复后的代码。。。假设未引发
BadArgument
,则
seconds
仍然可以是int或字符串,我上面的注释仍然有效……我的观点是它不会引发任何错误。它只返回
False
。。。这就是为什么我敦促您在控制台中尝试“
上的
5==”以查看发生了什么您可能会想到的事实,即关系比较确实会引发错误,如“
上的
5>”。但是对于类型不匹配,相等总是简单地返回
False