2014-12-22 32 views
1

我有一个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) 

内mainTest,我跑在试验测试与"__main__"一个文档测试一起。这工作很好,并且长时间工作良好。我们专用的_DOC_ATTR字典在我们构建到狮身人面像时记录函数的各个属性。但是,本字典中的文档不会被调用。我想要做的是在tester.test()之内对每个类的_DOC_ATTR中的值运行doctests。

我遇到的问题是试图在tester.test()中找到一种方法来找出在__main__中定义的所有变量(特别是类)。我试过看traceback中的相关地方无济于事。我以为是因为我从__main__,即__main__.Test,我可以使用.__module__Test访问本地变量,但我不知道如何去做。

我宁愿不需要改变对tester.test(Test)的调用,因为它在数百个模块中使用,并且我已经训练了所有在项目上工作的程序员遵循这个范例。谢谢你的帮助!

回答

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

另一种解决方案:由于我们是通过“测试”类,而为了运行需要有一个“的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.