python bot中的模块化编码

时间:2017-11-24 11:55:10

标签: python bots telegram python-telegram-bot

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

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

谢谢: - )

1 个答案:

答案 0 :(得分:0)

所以命令本身是:“使用/开始使用机器人”?如果您使用相同的方法重复多个命令,我将创建一个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'])

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

----------------------------------- REVISION ----------- -------------------

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

每个文件夹内容中的

__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 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