[链接到]-Store functions in list and call them later
TestSuites(unittest.TestCase)类:
def firstHagerTest(self):
argumentsList = []
for i in sys.argv:
argumentsList.append(i)
argumentsList.pop(0)
HagercadLogger.Logger.Log(HagercadLogger.LEVEL_WARNING, "PRINT MY ARGS LIST: " + ', '.join(argumentsList))
try:
func_to_run = globals()[argumentsList] #i have to find a way to make this line work as the line 27 somehow, and of course no matter the no. of elements
#func_to_run2 = globals()[HagercadUtilities.Utilities.startApp(), HagercadSteps.Steps.createNewProject()] #this work ok
except KeyError:
pass
如果我使用func_to_run2之类的带有硬编码元素的脚本运行,它将按预期工作。但是,当我通过func_to_run执行它并传递列表时,出现以下错误:
TypeError: unhashable type: 'list'
argumentsList可能包含5或9个元素,例如,此处以2表示,因此它可能是arugmenstList = [startApp(),createProject(),deleteProject(),switchSettings()等),因此无论列表的长度有多长步骤是我希望能够运行它们。参数来自cmd。
对此有什么解决方案?到目前为止,找不到适合我的东西。
答案 0 :(得分:0)
看看下面的代码,我认为它可以为您提供帮助:
import importlib
name = 'MyFile.MyClass.startApp'
parts = name.split('.')
module_name, method_name = '.'.join(parts[:-1]), parts[-1]
module = importlib.import_module(module_name)
您可以致电getattr(module, method_name)()
答案 1 :(得分:0)
因此,我找到了解决方案。
argumentsList = []
for i in sys.argv:
argumentsList.append(i)
newStrList = [x.encode('UTF8') for x in argumentsList]
try:
for indx, val in enumerate(newStrList):
print(indx, val)
getattr(ClassContainingMethods,newStrList[indx])()
except KeyError:
pass
现在,无论列表中接收到多少个参数(在这种情况下为方法调用),它们都会被执行。