python - 文档测试 : How to suppress/ignore output?

标签 python doctest

以下(废话)Python模块的doctest失败:

"""
>>> L = []
>>> if True:
...    append_to(L) # XXX
>>> L
[1]
"""

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

import doctest; doctest.testmod()

这是因为标记为 XXX 的行之后的输出是 <__main__.A object at ...> (由 append_to 返回)。当然,我可以将此输出直接放在标记为 XXX 的行之后,但在我的例子中,这会分散读者对实际测试内容的注意力,即函数 append_to 的副作用。 .那么我该如何抑制该输出或如何忽略它。我试过:

"""
>>> L = []
>>> if True:
...    append_to(L) # doctest: +ELLIPSIS
    ...
>>> L
[1]
"""

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

import doctest; doctest.testmod()

然而,这会产生一个 ValueError: line 4 of the docstring for __main__ has inconsistent leading whitespace: ' ...' .

我不想做的是更改行 append_to(L)类似于 _ = append_to(L)这会抑制输出,因为 doctest 用于文档目的并向读者展示模块应该如何使用。 (在记录的情况下,append_to 应该像语句一样使用,而不是像函数一样使用。写成 _ = append_to(L) 会使读者偏离这一点。)

最佳答案

rewrite: 现在这确实有效;我意识到我之前写的“doctest”实际上没有被解析为模块文档字符串,所以测试没有通过:它只是没有被运行。

我一定要仔细检查这个。

__doc__ = """
>>> L = []
>>> if True:
...    append_to(L) # doctest: +IGNORE_RESULT
>>> L
[1]
""".replace('+IGNORE_RESULT', '+ELLIPSIS\n<...>')

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

我不确定这是否符合可读性要求。注意 <...> 没有什么特别的:只有当实际返回值具有这种形式时它才会起作用,就像在这种情况下一样(即它是 <module.A object at 0x...> )。 ELLIPSIS 选项使 ... “匹配实际输出中的任何子串¹ .所以我认为没有办法让它匹配整个输出。

更新:要以“正确”的方式执行此操作,看起来您需要调用 doctest.register_optionflag('IGNORE_RESULT') , 子类 doctest.OptionChecker ,并安排该子类的一个实例供 doctest 使用。大概这意味着通过 $ python -m doctest your_module.py 运行你的 doctest不是一个选项。

关于python - 文档测试 : How to suppress/ignore output?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862274/

相关文章:

Python unittest 在单个套接字的 tcp 服务器上进行多个测试

python - 如何在对象实例中保存当前状态?

python - PyCharm 摆脱 doctest 背景颜色

python - 接收和显示用户输入的 Doctesting 功能 - Python(撕掉我的头发)

pycharm - 如何在 PyCharm 中设置测试运行器的参数

python - 如何让 pytest 运行 doctests 以及正常的测试目录?

Python 3.4 可视化treelib tree.show()

python - 使用 tkinter 生成随机数

Python 生成器和产量 : How to know which line the program is at

python - python doctest 可以忽略一些输出行吗?