这个工作一定要早做!!不然就会像我一样,main.py 几千行,找个代码的位置都很困难🙅‍♀️

好不容易才把阿狸的代码给重构了,将其他命令移动到了各自的文件

1.基础

在对bot进行编程的时候,根据功能不同,会将代码分成几大板块。

如果将这些内容全部放入一个main文件中的话,虽然是可以的,但会显得非常长和杂乱,且不方便定位问题。

再加上本人有一定强迫症,于是将valorant查询代码的实现和translate功能的实现分开封装,再在main.py文件中使用bot.command调用

1.1 在支线文件中要怎么写?

以一个最简单的hello代码为例。因为khl.py是异步框架,所以在支线文件中的函数都应该带上asyncawait来执行功能

同时,支线文件中也需要import主文件中包含的库函数、以及bot的token。一个比较偷懒的方法就是把主文件import过的内容原封不动的复制到支线文件中

1
2
async def world(msg: Message):
await msg.reply('你好呀~')

1.2 在主文件中要怎么写?

主文件:包含bot.run的文件,有且只能有一个

现在我们的支线文件中已经有一个函数的实现了,在主文件中只需要import支线文件的函数后,实现bot.command让机器人调用这条命令就行

1
2
3
4
5
from test import world

@bot.command(name='hello')
async def world123(msg: Message):
await world(msg)

要知道,这只是一个示例。像这种较短的程序无需分文件。但如果你的函数实现非常长的时候,就可以用相同的办法实现多文件编程。

2.进阶

前面的办法,也只是编程语言中最常用的导入函数方式。因为Python支持函数内嵌套函数,我们就能实现一个骚操作,在函数里面注册bot。

说人话就是,这个命令的完整实现,包括命令的注册,都可以丢到另外一个文件中!


如下,我们只需要给支线文件中上一个函数,参数为bot,再内部正常编写代码

1
2
3
4
5
from khl import Bot,Message
def init(bot:Bot):
@bot.command(name='hello') # 必须写明命令的name
async def world123(msg: Message):
await world(msg)

然后,在主文件中,bot启动之前,调用这个init函数即可!

1
2
3
4
5
6
7
from test import init # 支线文件
from khl import Bot,Message
bot = Bot(token=config['token']['bot'])

@bot.on_startup
async def bot_init(bot: Bot):
init(bot) # 调用支线文件中的init函数来注册命令

这样才是真正的分文件编写bot!