Python函数列表,按照它们在modu中的定义顺序排列

2024-06-16 10:20:13 发布

您现在位置:Python中文网/ 问答频道 /正文

对于测试驱动的教学模块,我需要按照精确的顺序检查博士学位。 有没有办法按照定义的顺序获取当前模块中的所有可调用项?你知道吗

我尝试的是:

  • 循环全局变量并检查对象是否是可调用的。问题是globals是一个dict,因此不是有序的。你知道吗
  • 直接使用doctest并不方便,因为“stop at first error”对我不起作用,因为我有几个函数要测试。你知道吗

Tags: 模块对象定义顺序dictatdoctest教学
2条回答

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

import inspect

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

获取(name, function)对的排序列表。对于Python2.5及更早版本,您需要使用.func_code而不是.__code__。你知道吗

您可能需要进一步筛选在模块本身中定义的、尚未导入的函数;func.__module__ == moduleobj.__name__应该足够了。你知道吗

多亏了玛蒂恩,我终于找到了。 这是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__)

相关问题 更多 >