Python:从另一个函数计算函数名

2024-04-27 04:43:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3.4中,我希望能够做一个非常简单的调度表,用于测试目的。其思想是使用一个字典,其中键是要测试的函数名称的字符串,数据项是测试函数的名称。例如:

myTestList = (
    "myDrawFromTo",
    "myDrawLineDir"
)

myTestDict = {
    "myDrawFromTo": test_myDrawFromTo,
    "myDrawLineDir": test_myDrawLineDir
}

for myTest in myTestList:
    result = myTestDict[myTest]()

我的想法是在某处有一个函数名列表。在本例中,我手动创建一个字典,将这些名称映射到测试函数的名称。测试函数名是函数名的简单扩展。我想从函数名列表中计算整个字典(这里是“myTestList”)。你知道吗

或者,如果我不用字典也能做同样的事情,那也没关系。我试着从myTestList中的条目构建一个新字符串,然后使用local()设置调用,但没有成功。词典的概念来自docs.python.org/3/你知道吗


Tags: 函数字符串test目的名称列表字典测试函数
2条回答

Abarnert的回答似乎很有用,但要回答您最初的问题,即如何调用所有测试函数以获得函数名列表:

def test_f():
    print("testing f...")

def test_g():
    print("testing g...")

myTestList = ['f', 'g']

for funcname in myTestList:
    eval('test_' + funcname + '()')

这个问题有两部分。你知道吗

简单的部分就是在每个字符串前面加上'text_'

tests = {test: 'test_'+test for test in myTestDict}

更难的部分实际上是按名称查找函数。这类事情通常是一个坏主意,但是你碰到了一个案例(生成测试),它通常是有意义的。您可以在your module's global dictionary中查找它们,如下所示:

tests = {test: globals()['test_'+test] for test in myTestList}

如果测试不在模块的全局范围内,那么同一个想法也会有所不同。例如,将它们都设置为类的所有方法可能是一个好主意,在这种情况下,您可以执行以下操作:

tester = TestClass()
tests = {test: getattr(tester, 'test_'+test) for test in myTestList}

(虽然代码更可能在TestClass内,但它使用的是self,而不是tester。)


当然,如果您实际上不需要dict,您可以将理解改为显式的for语句:

for test in myTestList:
    globals()['test_'+test]()

还有一件事:在重新发明轮子之前,您是否看过测试框架built into the stdlibavailable on PyPI?你知道吗

相关问题 更多 >