查找在其他模块(python)中定义的变量
我有一个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'
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.