使用 2 个字符串从模块 Y 调用函数 X

Use 2 Strings to call Function X from Module Y

所以我一直在为我的一款文字游戏开发菜单处理程序,这样制作菜单就可以减少 space 在玩家硬盘上的占用,但是在使用了一段代码后,我在这里找到了在 Whosebug 上,我发现代码不允许输入模块以将其作为字符串导入。我的基本目标是能够从一行代码创建菜单。我已经完成了大部分工作,除了我不知道如何使用一个或两个字符串从方法调用函数这一事实。

我找到的代码:

    function = globals().copy()
    function.update(locals())

    function.get(call)(*actionsList)

目前,call是我要调用的函数,而actions list只是一个参数列表。我不知道这有多安全或高效,但我知道使用 "moduleX.functionY" 这样的字符串实际上不会从 moduleX 调用 functionY。有什么方法可以做到这一点?

完整代码(供参考):

    Menu Handler:

    import subprocess as sp
    import Menus


    def callMenu(Options, Instructions):
        tmp = sp.call('cls',shell=True) 

        for key, value in Options.iteritems():
            print key

        print ""
        print Instructions

        processMenu(Options, Instructions)


    def processMenu(Options, Instructions):
        actionsList = []
        menuInput = ""

        menuInput = raw_input("")

        results = processInput(Options, menuInput)

        if results[0]:
            for key, value in Options[results[1]].items():
                call = key
                actionsList = value

            function = globals().copy()
            function.update(locals())

            function.get(call)(*actionsList)
        else:
          callMenu(Options, Instructions)

    def processInput(Options, menuInput):
           processedOptions = 0
          optionsList = []

          answer = False

        for key, value in Options.items():
            optionsList.append(key)

        while processedOptions < len(Options):
            currentKey = optionsList[processedOptions]

            if str(menuInput.lower()) == currentKey.lower():
                answer = True
                break

            processedOptions += 1

         return [answer, currentKey]

    def DEBUG(DUMMY):
        tmp = sp.call('cls',shell=True) 
        print "%s selected" % DUMMY
        menuInput = raw_input("")
        Menus.MainMenu.MenuMain000()


    Main Menu:

          from Handlers import MenuHandler

    def MenuMain000():
        MenuHandler.callMenu({"New Game": {"DEBUG": ["New Game"]}, "Load Game": {"DEBUG": ["Load Game"]}}, "Pick something will ya")

    #def MenuMain100(DUMMY):
            #print "%s selected" % DUMMY

我希望能够使用 MenuMain001 而不是 DUMMY,方法是将菜单调用改为

    MenuHandler.callMenu({"New Game": {"MenuMain001": ["New Game"]}, "Load Game": {"MenuMain001": ["Load Game"]}}, "Pick something will ya")

将函数本身传递给 callMenu() 而不是其名称作为字符串:

MenuHandler.callMenu({"New Game": {DEBUG: ["New Game"]}, "Load Game": {DEBUG: ["Load Game"]}}, "Pick something will ya")

然后,在 processMenu() 中调用该函数,而不是使用 globals():

执行所有这些操作
call(*actionsList)