Python函数的列表,按其在模块中的定义顺序排列
对于测试驱动的教学模块,我需要按照精确的顺序检查博士学位。 有没有办法按照定义的顺序获取当前模块中的所有可调用项 我尝试的是:Python函数的列表,按其在模块中的定义顺序排列,python,doctest,Python,Doctest,对于测试驱动的教学模块,我需要按照精确的顺序检查博士学位。 有没有办法按照定义的顺序获取当前模块中的所有可调用项 我尝试的是: 循环全局变量并检查对象是否是可调用的。问题是globals是一个dict,因此没有顺序 直接使用doctest并不方便,因为“第一次出错时停止”对我不起作用,因为我有几个函数要测试 每个函数对象都有一个代码对象,用于存储第一个行号,因此您可以使用: import inspect ordered = sorted(inspect.getmembers(moduleob
- 循环全局变量并检查对象是否是可调用的。问题是globals是一个dict,因此没有顺序李>
- 直接使用doctest并不方便,因为“第一次出错时停止”对我不起作用,因为我有几个函数要测试
import inspect
ordered = sorted(inspect.getmembers(moduleobj, inspect.isfunction),
key=lambda kv: kv[1].__code__.co_firstlineno)
获取(名称、函数)
对的排序列表。对于Python2.5及更早版本,您需要使用.func\u code
而不是.func\u code
您可能需要进一步筛选在模块本身中定义但尚未导入的函数
func.\uuuuu module\uuuuu==moduleobj.\uuuuu name\uuuuu
应该足够了。多亏了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__)
请注意,这是CPython的实现细节,它可能会在不同版本或其他实现中中断。@poke:事实上,代码对象的整个概念是CPython解释器的公开细节。谢谢您的提示。我挣扎了一点,因为我没有意识到你的答案只是蟒蛇2。在P3中,
func\u code
被替换为\uuu code
。此外,我还需要sys.modules[\uuuuuu name\uuuu]
来获取当前模块。再次感谢。是的,对Python3使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,顺便说一句,Python2.6和2.7也是如此。对不起;如果你问过我,我可以马上帮你纠正这个问题。:-)