-
Notifications
You must be signed in to change notification settings - Fork 43
[Tutorial] chapter.03 Command args
只会喊 world! 的机器人就和白米饭一样,确实有点单调,所以我们接下来的例程就讲讲怎么加点「调料」
这个例子讲的是最基础的「辣酱」:给你的指令加点参数
要定义参数其实非常简单,看 ex03.py
的第 15 ~ 21 行:
# register command
# invoke this via saying `!roll 1 100` in channel
# or `/roll 1 100 5` to dice 5 times once
@bot.command()
async def roll(msg: Message, t_min: int, t_max: int, n: int = 1):
result = [random.randint(t_min, t_max) for i in range(n)]
await msg.reply(f'you got: {result}')
我们注册了一个 roll
指令,但是这次的函数参数除了 Message
,还有三个 int
,这多出来的三个就是指令参数
指令参数首先不限数量;其次可以带默认值,用以简化指令;再者自带类型转换能力(部分类型限定)。后面会单独讲讲
这个 roll
指令是投骰子的小游戏,使用方法也很简单,在频道里喊 /roll 1 100
或 /roll 1 100 5
(一次投五个)
注意:指令和参数、参数和参数之间要用空格隔开
前两个参数 t_min
t_max
分别是骰子范围的下上限,最后一个参数 n
是骰子个数
大家可能注意到了,最后一个参数 n
可有可无,原因是我们在代码中已经给 n
设好了默认值,所以不传也是可以的,这也是一个简化指令的好方法
前面有说过「参数和参数之间用空格隔开即可」,那如果我们就是要含空格的指令咋办呢?
用英文引号引起来就行
举例:
!cmd a "b c"
会被解析成「给 cmd
指令传两个参数:【a
】、【b c
】」
!cmd a b c
会被解析成「给 cmd
指令传三个参数:【a
】、【b
】、【c
】」
我们声明的指令参数类型都是 int,但是我们在频道里输入的都是 str,这个 str 到 int 的转换是谁来做的,是根据什么规则做的呢?
首先这个转换是由 Command.Parser
这个模块来做的,大家有兴趣的话可以看看源码
至于转换规则,khl.py
会根据函数参数的 type hints 来把 str 转换成对应类型,你想要什么类型,就转成什么类型。
注1:type hints 定义和使用此处就不再赘述,STFW please
注2:目前内置的转换没有完全覆盖,出问题了建议改回 str 类型自己转,当然欢迎大家来提交转换函数,代码位置 khl/bot/parser.py
当然,如果你没给参数设置 type hints,khl.py
是不处理的,直接将 str 传入你的指令函数