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

时间:2015-04-02 21:27:54

标签: python string function python-2.7 module

所以我一直在为我的一个文字游戏上的菜单处理程序工作,这样制作菜单会占用播放器硬盘的更少空间,但在使用我在这里找到的一段代码之后在stackOverflow上,我发现代码不允许输入模块以字符串形式导入它。我的基本目标是能够从一行代码创建菜单。我有大部分工作,除了我不知道如何使用一个或两个字符串从方法调用函数。

我找到的代码:

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

    function.get(call)(*actionsList)

目前,call是我要调用的函数,action列表只是一个参数列表。我不知道这是多么安全或有效,但我知道使用像" 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")

1 个答案:

答案 0 :(得分:0)

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

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

然后,在processMenu()中,调用该函数而不是使用globals()执行所有操作:

call(*actionsList)