我正在用Python 2.7模块的形式构建一个非常基础的平台。该模块具有读取评估打印循环,其中输入的用户命令映射到函数调用。由于我正在试图为我的平台构建插件模块,所以函数调用将从我的主模块到任意插件模块。我希望一个插件生成器能够指定他想要触发他的函数的命令,所以我一直在寻找一种Pythonic方法来远程输入主模块中的command-> function dict中的映射插件模块。在编译时提供函数元数据的大多数Pythonic方法?
我已经看了几件事情:
方法名称解析:主模块将导入插件模块 和扫描它匹配某种格式,方法名。例如,对于 示例,它可能会将download_file_command(file)方法作为“下载文件” - > download_file_command添加到其 字典中。但是,获取简洁易用的命令名称(例如“dl”)要求功能的名称也较短,这不利于代码 的可读性。它还要求插件开发者符合 的精确命名格式。
跨模块的装饰:装饰会让 插件开发者的名字,无论他希望他的功能和简单的 添加类似@ Main.register(“DL”),但他们必然 要求我都修改另一个模块的名称空间,并在主模块中保持全局状态 。我知道这很糟糕。
相同模块装饰:使用与上述相同的逻辑,I可以添加一个 装饰,其将所述函数的名称,以一些命令名称 - >函数映射本地的 插件模块和检索映射到主要模块与 API调用。这要求某些方法总是存在或者继承,但是 - 如果我对装饰器的理解是正确的 - 函数只会在第一次运行时自行注册,并且在随后的其后 之后将不必要地重新注册自身。
因此,我真正需要的是与注释应触发它的命令名称的功能Python化的方式,并且这种方式不能是函数的名称。当我导入模块时,我需要能够提取命令名 - >函数映射,并且在插件开发人员方面减少工作量是一大优势。
感谢您的帮助,如果我的Python理解存在任何缺陷,我表示歉意。我对这门语言比较陌生。
只是检查你意识到这一点,但装修(和函数定义)在运行时执行,Python做在编译时的唯一的事情就是编译代码。 – Duncan 2013-02-12 09:55:17
方法2没有任何问题。让他们执行类似'import plugin'的操作并执行'@ plugin.register('my_method_name')\ ndef somefunc_meeting_an_api_spec():...' – 2013-02-12 09:57:08
您可能想看看[plac](http://pypi.python.org/pypi/plac)就是这样做的。 – georg 2013-02-12 09:59:30