多文件注册机器人命令
# 1.基础
一些大型机器人项目,会有非常多的机器人命令。如果将这些命令都集中在一个文件中进行注册,则会导致这个文件非常长,不适合快速定位问题。
有的时候,光是翻找命令的位置,就得滚轮划个老半天。
使用多文件编程,能大幅减少主文件的长度,并将对应功能的代码放入单独的文件中,方便后续的维护!
# 1.1 在支线文件中要怎么写?
以一个最简单的hello代码为例。因为khl.py是异步框架,所以在支线文件中的函数都应该带上async和await来执行功能
同时,支线文件中也需要import主文件中包含的库函数、以及bot的token。一个比较偷懒的方法就是把主文件import过的内容原封不动的复制到支线文件中
# test.py
from khl import Message
async def world(msg: Message):
await msg.reply('你好呀~')
# 1.2 在主文件中要怎么写?
主文件:包含
bot.run()的文件,有且只能有一个
现在我们的支线文件中已经有一个函数的实现了,在主文件中只需要import支线文件的函数后,实现bot.command让机器人调用这个函数,来执行对应操作就OK了
# main.py
from test import world
from khl import Message,Bot
# 初始化机器人
bot = Bot(token = 'token')
# 注册命令
@bot.command(name='hello')
async def world_cmd(msg: Message):
await world(msg)
# 启动机器人
bot.run()
这只是一个示例,像这种较短的程序无需分文件。但如果你的函数实现非常长的时候,就可以用相同的办法实现多文件编程。
# 2.进阶
前面的办法,也只是编程语言中最常用的导入函数方式。
而Python支持函数内嵌套函数,我们就能实现一个骚操作,在函数里面注册bot的命令。
说人话就是,这个命令的完整实现,包括命令的注册,都可以丢到另外一个文件中!
如下,我们只需要给支线文件中上一个init函数,参数为Bot对象,在内部正常编写代码
# test.py
from khl import Bot,Message
# 用于注册命令的函数
def init(bot:Bot):
# 必须写明命令的name
@bot.command(name='hello')
async def world_cmd(msg: Message):
await world(msg)
然后,在主文件中,bot启动时,调用这个init函数即可!
# main.py
from khl import Bot,Message
import test # 导入test.py
# 初始化机器人
bot = Bot(token='token')
# 在机器人启动的时候执行此函数
@bot.on_startup
async def bot_init(bot: Bot):
test.init(bot) # 调用支线文件test.py中的init函数来注册命令
# 启动机器人
bot.run()
这样才是真正的分文件编写bot!
上次更新: 2023/05/28, 08:03:54