查找在其他模块中定义的变量(python)

时间:2014-12-22 04:02:29

标签: python python-module traceback doctest

我在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)的调用,因为它已在数百个模块中使用,并且我已经训练所有参与该项目的程序员遵循这个范例。谢谢你的帮助!

1 个答案:

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