我正在以 Python 2.7 模块的形式构建一个非常基本的平台。这个模块有一个 read-eval-print 循环,输入的用户命令被映射到函数调用。因为我试图让为我的平台构建插件模块变得容易,所以函数调用将从我的主模块到任意插件模块。我希望插件构建器能够指定他想要触发他的函数的命令,所以我一直在寻找一种 Pythonic 方式来远程输入 Main 模块中的 command->function dict 中的映射。插件模块。
我看过几件事:
方法名解析:主模块将导入插件模块并扫描它以查找匹配特定格式的方法名。例如,它可能会将 download_file_command(file) 方法添加到其字典中作为“下载文件”-> download_file_command。但是,要获得一个简洁、易于键入的命令名称(例如,“dl”)要求函数名称也很短,这不利于代码的可读性。它还要求插件开发人员符合精确的命名格式。
跨模块装饰器:装饰器可以让插件开发人员随意命名他的函数,并简单地添加类似 @Main.register("dl") 的东西,但它们必然要求我修改另一个模块的命名空间并保持全局状态在主模块。我明白这是非常糟糕的。
同模块装饰器:使用与上面相同的逻辑,我可以添加一个装饰器,将函数名称添加到插件模块本地的某个命令名称->函数映射,并通过 API 调用检索到主模块的映射。这要求某些方法始终存在或继承,并且 - 如果我对装饰器的理解是正确的 - 该函数只会在第一次运行时注册自己,并且此后每次都不必要地重新注册自己。
因此,我真正需要的是一种 Pythonic 方式来使用应该触发它的命令名称来注释函数,并且这种方式不能是函数的名称。当我导入模块时,我需要能够提取命令名称-> 函数映射,并且插件开发人员方面的工作量减少是一大优势。
感谢您的帮助,如果我对 Python 的理解有任何缺陷,我深表歉意;我对这门语言比较陌生。