python - 如何设计一个动态的模块化系统(Python)
问题描述
为了简洁起见,我目前正在设计一个聊天机器人,这是我所拥有的简化版本。
一个主模块
import bot
<import Command>
bot.connect()
def msg_handler(msg):
bot.handle_message(Command.handler)
bot.start()
指令模块
def handler(msg):
if msg.startswith("!"):
prefix,rest = get_command_prefix(msg)
if prefix in <handlers>:
<handlers>[prefix](rest)
例如多个特定命令
<register>
def echo(msg):
send(msg)
所以我的问题是如何将这些连接在一起
具体来说,我如何将各种命令注册到具有共享代码的中央模块
我考虑过的一些选项
给每个模块一个init
注册它的函数
def init(registry):
registry.register(name,handler)
一些缺点是大多数初始化函数几乎相同,而且非常明确
装饰器和导入
import Registry
@Registry.register
def echo(...):
...
这里的问题是,如果注册表移动或稍微更改,这可能意味着更改每个命令
一些最后的笔记
- 不知道运行时有多少个模块
- 我正在尝试最大程度地减少代码重复
- 能够在运行时加载其他模块会很好
- command.py 和 main.py 之间出现了类似的问题,因此分层或多级解决方案会很好
是否有解决此类问题的通用/已知方法
编辑
一个小小的想法是,特定的“command.py”可能会有所不同,例如普通版本和测试版本,这可能会使我的第二个提案不适用
解决方案
推荐阅读
- php - 在多维数组中按键搜索值并将其保存在数据库中
- c++ - 删除数组类型指针的元素导致错误?
- python - Selenium:谷歌在一个时间窗口内的西班牙语搜索结果
- python - Tweepy 输出问题
- r - 使用 R 和 Leaflet,我怎样才能让我的地图显示用逗号格式化的数字?
- angular - canActivate 订阅前返回
- javascript - 尝试编写一个不和谐的音乐机器人,我得到一个无法将“null”转换为 int
- python - 如何将我的 Python 方法合并到 Kivy 代码中?
- html - 为什么媒体在手机屏幕上工作?
- java - 如何使用 MediaStore 删除文件?