Python函数列表,按模块中的定义顺序排列

时间:2014-01-27 16:38:18

标签: python doctest

对于测试驱动的教学模块,我需要按照精确的顺序检查doctests。 有没有办法按照它们的定义顺序获取当前模块中的所有可调用对象?

我尝试了什么:

  • 循环全局并检查对象是否可调用。问题是全局变量是一个字典,因此没有排序。
  • 直接使用doctests是不方便的,因为“首先出现错误”对我来说不起作用,因为我有几个要测试的功能。

2 个答案:

答案 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__)