2
import re
import sys
import inspect
import testcases

testClass = re.compile(r'.*Case$')
testMethod = re.compile(r'.*Test$')

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name
4

2 回答 2

8

在您的代码之后:

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name

你可以这样做:

            methodobj = getattr(classobj, method_name)
            methodobj("appropriate arguments go here")

如果,也就是说,您对“适当的论点”什么有任何线索。第一个参数大概是类的一个实例——哪个实例?你如何检索或创建它?而且,所有其他论点呢?它们是什么,您想为它们传递什么值?

获取方法对象,准备好被调用,是你最少的问题——getattr正如你所看到的,这样做真的很好而且最容易!-)——但是你需要对上面关于论点的其他问题做出明智的回答(尤其是第一个,你想调用方法的实例)在你的问题实际上很有意义之前!-)

于 2010-01-26T04:55:22.267 回答
0

非常感谢亚历克斯的快速回复。

第一个参数大概是类的一个实例——哪个实例?你如何检索或创建它?

好的,所以如果我理解正确,方法调用 methodobj 的第一个参数应该是 classobj 的实例?下面怎么样。

methodobj = getattr(classobj, method_name)
methodobj(classobj())

那么所有其他论点呢?它们是什么,您想为它们传递什么值?

Naaah,没有其他参数,这些是在方法中设置变量的测试用例。我只想能够添加测试用例而无需修改其他代码来运行它们。

再次感谢,我还没有尝试过,但是从我读到的关于 getattr 的内容中,它似乎是我正在寻找的。随着一些玩耍,我可以让它工作。

于 2010-01-26T16:01:10.543 回答