python 机器人中的模块化编码

Modular coding in a python bot

我是 Whosebug(和编码)的新手。我想知道如果在电报机器人中,使用 python,我将如何进行模块化编码。我的意思是每个命令都在不同的文件中。如果我有一个通过回显回复消息的小型机器人,我只需要一个 run.py 文件。但是我的机器人有几个模块,比如 moderationfun games 等。所以我想也许创建一个 class 会更好?或者可能只是将每个命令作为几个不同文件中的函数,例如 moderation/automod.pymoderation/muteuser.py,因为这些命令中的每一个将来可能会占用很多 space。但是,如果我导入整个文件夹以及多个文件夹,我将导入 LOT 个文件。我的问题是:如何在不导入 2000 个文件的情况下正确管理不同的命令?

如果有帮助,我会使用 python-telegram-bot 包装器。

谢谢:-)

所以命令本身是:"Use /start to use the bot"?如果您使用相同的方法重复执行多个命令,我会创建一个 json 或 yml 文件。例如 json:

commands.json

{
  "send_message": 
    {
      "help":"Use /start to use the bot",
       "anotherCommand":"This is another command"
    },
  "method_to_do_other_stuff": {
       "command":"The command value"
  }
}

用 json python 模块导入它

import json
import bot
commands = {}
with open("commands.json") as f:
   commands = json.load(f)
#Call the method
getattr(bot, commands['send_message'])(commands['send_message']['help'])

这显然可以改进,使其更干净、更简单。由于我没有库,因此尚未经过测试,请修复机器人导入以正确导入您需要的内容。

------------------------------------修订-------- ----------------------

多次导入的示例代码。 根据类别创建一个或多个文件夹以包含您的命令 - 此示例的命令文件夹。

__init__.py 每个文件夹内容中的文件 对于此示例,命令文件夹中有一个:

from os.path import dirname, basename, isfile
import glob
modules = glob.glob(dirname(__file__)+"/*.py")
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

机器人文件 bot.py 例如:

from commands import *
if __name__ == "__main__":
    print apple.command()
    print orange.command()

apple.py 命令文件夹内

def command():
    return "apple"

orange.py 命令文件夹内

def command():
    return "orange"

文件和文件夹的结构

bot.py
commands/
    apple.py
    orange.py
    __init__.py