python 机器人中的模块化编码
Modular coding in a python bot
我是 Whosebug(和编码)的新手。我想知道如果在电报机器人中,使用 python,我将如何进行模块化编码。我的意思是每个命令都在不同的文件中。如果我有一个通过回显回复消息的小型机器人,我只需要一个 run.py
文件。但是我的机器人有几个模块,比如 moderation
、fun games
等。所以我想也许创建一个 class 会更好?或者可能只是将每个命令作为几个不同文件中的函数,例如 moderation/automod.py
、moderation/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
我是 Whosebug(和编码)的新手。我想知道如果在电报机器人中,使用 python,我将如何进行模块化编码。我的意思是每个命令都在不同的文件中。如果我有一个通过回显回复消息的小型机器人,我只需要一个 run.py
文件。但是我的机器人有几个模块,比如 moderation
、fun games
等。所以我想也许创建一个 class 会更好?或者可能只是将每个命令作为几个不同文件中的函数,例如 moderation/automod.py
、moderation/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