我正在构建一个非常基本的平台,以Python 2.7模块的形式存在。该模块拥有一个读取-求值-打印循环,在此循环中将用户输入的命令映射到函数调用。由于我试图使其易于构建我的平台的插件模块,因此来自主模块的函数调用将是对任意插件模块的调用。我希望插件开发人员能够指定触发其函数的命令,因此我一直在寻找一种Pythonic的方法,从插件模块中远程输入命令->函数字典中的映射到主模块。
我看过几个东西:
方法名称解析:主模块将导入插件模块并扫描匹配特定格式的方法名。例如,它可能将download_file_command(file)方法添加到其字典中,如“download file” - > download_file_command。但是,获取简洁、易于键入的命令名称(如“dl”)要求函数的名称也很短,这对代码可读性不利。它还要求插件开发人员遵守精确的命名格式。
跨模块装饰器:装饰器可以让插件开发人员命名其函数任何名称,并简单地添加类似于@Main.register(“dl”)的内容,但它们必然需要我修改另一个模块的命名空间并保留Main模块中的全局状态。我知道这是非常糟糕的。
同一模块装饰器:使用与上述逻辑相同的逻辑,我可以添加一个装饰器,将函数名称添加到某个本地的命令名称->函数映射中,并使用API调用从插件模块检索映射到主模块。但是,这要求某些方法始终存在或被继承,而且如果我对装饰器的理解正确,该函数只会在第一次运行时注册自己,并且之后每次运行都会不必要地重新注册自己。
import plugin
和@plugin.register('my_method_name')\ndef somefunc_meeting_an_api_spec():...
的操作。 - Jon Clementscmd.Cmd
和readline
的制表符扩展支持,不会使短名称成为问题吗? - sotapme