对于测试驱动的教学模块,我需要按照精确的顺序检查doctests。 有没有办法按照它们的定义顺序获取当前模块中的所有可调用对象?
我尝试了什么:
答案 0 :(得分:9)
每个函数对象都有一个代码对象,用于存储第一个行号,因此您可以使用:
import inspect
ordered = sorted(inspect.getmembers(moduleobj, inspect.isfunction),
key=lambda kv: kv[1].__code__.co_firstlineno)
获取(name, function)
对的排序列表。对于Python 2.5及更早版本,您需要使用.func_code
而不是.__code__
。
您可能需要进一步过滤在模块中定义的功能并且尚未导入; func.__module__ == moduleobj.__name__
就足够了。
答案 1 :(得分:1)
感谢Martijn,我终于找到了。 这是Python3的完整代码段。
import sys
import inspect
def f1():
"f1!"
pass
def f3():
"f3!"
pass
def f2():
"f2!"
pass
funcs = [elt[1] for elt in inspect.getmembers(sys.modules[__name__],
inspect.isfunction)]
ordered_funcs = sorted(funcs, key=lambda f: f.__code__.co_firstlineno)
for f in ordered_funcs:
print(f.__doc__)