Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找在其他模块(python)中定义的变量_Python_Python Module_Traceback_Doctest - Fatal编程技术网

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

查找在其他模块(python)中定义的变量,python,python-module,traceback,doctest,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'

我有一个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)
在tester内部,我在Test中运行测试,并在
“\uuuu main\uuuuu”
上运行doctest。这很有效,而且在很长一段时间内效果很好。当我们构建到Sphinx中时,我们专门的_DOC_ATTR字典记录了函数的各个属性。但是,本词典中的doctest不被称为。我想做的是在
tester.test()
中对每个类的\u DOC\u ATTR中的值运行doctest

我遇到的问题是试图在
tester.test()
中找到一种方法来计算
\uuuuu main\uuuuu
中定义的所有变量(特别是类)。我在
traceback
中查看了相关的地方,但没有结果。我想,因为我是从
\uuuuu main\uuuuuu
传入一个类,即
\uuuu main\uuuuuuu.Test
,所以我可以使用
\uuuuu模块\uuuuuuuuu
Test
访问那里的局部变量,但我不知道怎么做


我不希望改变对tester.test(test)的调用,因为它在数百个模块中都有使用,我已经培训了所有在项目中工作的程序员遵循这个范例。谢谢你的帮助

我想我可能已经找到了答案:

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\u globals
。请注意,它不能是从超类继承的函数,例如
\uuuu init\uuu
,因此对于更广泛的用例,它的功能可能有限

import inspect
localVariables = Test.runTest.func_globals
for lv in list(localVariables.keys()):
    lvk = localVariables[lv]
    if (inspect.isclass(lvk)):
          #### etc.