0

您好我正在寻找使用 Cmd 模块在 Python 中创建嵌套解释器。

我设置了一个动态模块加载,因为我希望我的项目易于扩展(即将一个新的 python 文件添加到一个文件夹中,并且无需更改能够加载它的主代码)。

我的嵌套解释器当前设置如下:

def instantiateConsole(base):

    class SubConsole(cmd.Cmd, base):
        def __init__(self):
            cmd.Cmd.__init__(self)

        def do_action(self,args):
            print "Action"
    return SubConsole

这是必要的,因为为了创建嵌套解释器,我必须将 MainConsole 作为第二个变量传递给 SubConsole 类。这样做的问题是,这样我只能在这个方法中创建类,并且我将无法添加一个新的控制台模块文件,我可以在没有此方法中的定义的情况下动态加载该文件。

有什么解决方法吗?

4

1 回答 1

0

当您说“将 MainConsole 作为第二个变量传递”时,您的意思似乎是“使新的 SubConsole 成为 MainConsole 的子类”。您实际上是在定义一个将基类作为参数的类工厂。

你说“在这个方法中创建类”,但是instantiateConsole在一个函数中,它出现了。小心术语很重要。

这与动态导入(包含模块的)您可能希望用作instantiateClass. 在最简单的情况下,您只需将这些模块所在的标准目录添加到您的sys.path.,按名称导入模块,然后提取基类(为了简单起见,我假设将始终定义为BaseConsole)。然后,您将运行代码,例如

extension_module = importlib.import_module("my_extension")
new_console = instantiateConsole(extension_module.BaseConsole)

如果基类的名称可以变化(您将如何确定它的名称?),您可能必须getattr()优先使用对动态导入的扩展模块的简单属性访问。

于 2016-10-19T12:31:09.343 回答