使用 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)
所以我一直在为我的一款文字游戏开发菜单处理程序,这样制作菜单就可以减少 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)