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

2024-04-19 10:42:35 发布

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

在Python3.4中,我希望能够为测试目的创建一个非常简单的分派表。其思想是使用一个字典,其中键是要测试的函数名称的字符串,数据项是测试函数的名称

例如:

myTestList = (
    "myDrawFromTo",
    "myDrawLineDir"
)

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

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

我的想法是在某个地方有一个函数名列表。在本例中,我手动创建了一个字典,将这些名称映射到测试函数的名称。测试函数名是函数名的简单扩展。我想从函数名列表中计算整个字典(这里是^{

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


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

相关问题 更多 >