Skip to content

[Tutorial] chapter.03 Command args

Housa Hitomi edited this page Jun 26, 2022 · 1 revision

example 03 加点辣酱:指令参数

只会喊 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 传入你的指令函数