执行存储在列表中的方法

时间:2019-01-16 09:45:11

标签: python python-3.x python-unittest

[链接到]-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。

对此有什么解决方案?到目前为止,找不到适合我的东西。

2 个答案:

答案 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

现在,无论列表中接收到多少个参数(在这种情况下为方法调用),它们都会被执行。