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

Gra*_*Gra 4 python doctest

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

我尝试了什么:

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

Mar*_*ers 9

每个函数对象都有一个存储第一行号的代码对象,因此您可以使用:

import inspect

ordered = sorted(inspect.getmembers(moduleobj, inspect.isfunction), 
                 key=lambda kv: kv[1].__code__.co_firstlineno)
Run Code Online (Sandbox Code Playgroud)

获得对的排序列表(name, function).对于Python 2.5及更早版本,您需要使用.func_code而不是.__code__.

您可能需要在中定义的功能进一步筛选模块本身并没有被进口的; func.__module__ == moduleobj.__name__应该就够了.