Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数的列表,按其在模块中的定义顺序排列_Python_Doctest - Fatal编程技术网

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也是如此。对不起;如果你问过我,我可以马上帮你纠正这个问题。:-)