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