我在Python中有一个模块测试系统,其中各个模块调用类似的东西:
class Hello(object):
_DOC_ATTR = { 'greeting': '''
a greeting message.
>>> h = Hello()
>>> h.greeting = 'hi there'
>>> h.greeting
'hi there'
''' }
def __init__(self):
self.greeting = "hello"
class Test(unittest.TestCase):
# tests here
if __name__ == '__main__':
import tester
tester.test(Test)
内部测试人员,我在Test中运行测试以及"__main__"
上的doctest。这很好用,并且已经很好地工作了很长时间。当我们构建Sphinx时,我们的专用_DOC_ATTR字典记录了函数的各个属性。但是,不会调用此词典中的doctests。我想要做的是在tester.test()
内对每个类的_DOC_ATTR中的值运行doctests。
我遇到的问题是试图在tester.test()
内找到一种方法来找出__main__
中定义的所有变量(特别是类)。我已经尝试查看traceback
中的相关位置无济于事。我认为这是因为我从__main__
传递了一个类,即__main__.Test
,我可以使用.__module__
中的Test
来访问局部变量那里,但我无法弄清楚如何去做。
我宁愿不需要改变对tester.test(Test)
的调用,因为它已在数百个模块中使用,并且我已经训练所有参与该项目的程序员遵循这个范例。谢谢你的帮助!
答案 0 :(得分:0)
我认为我可能找到了答案:
import inspect
stacks = inspect.stack()
if len(stacks) > 1:
outerFrame = stacks[1][0]
else:
outerFrame = stacks[0][0]
localVariables = outerFrame.f_locals
for lv in list(localVariables.keys()):
lvk = localVariables[lv]
if (inspect.isclass(lvk)):
docattr = getattr(lvk, '_DOC_ATTR', None)
if docattr is not None:
# ... do something with docattr ...
另一个解决方案:因为我们正在传递“Test”类,并且为了运行需要定义“runTest”函数,人们也可以在该函数上使用func_globals
。请注意,它不能是从超类继承的函数,例如__init__
,因此对于更广泛的用例,它可能具有有限的功能。
import inspect
localVariables = Test.runTest.func_globals
for lv in list(localVariables.keys()):
lvk = localVariables[lv]
if (inspect.isclass(lvk)):
#### etc.