Doctests:如何抑制/忽略输出?

Mar*_*arc 2 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()
Run Code Online (Sandbox Code Playgroud)

这是因为标记为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()
Run Code Online (Sandbox Code Playgroud)

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

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

int*_*ted 5

重写:这实际上现在工作;我意识到我之前编写的“ doctest”实际上没有被解析为模块docstring,因此测试没有通过:它只是没有在运行。

我确保仔细检查这一点。

__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()
Run Code Online (Sandbox Code Playgroud)

我不确定这是否更具可读性。请注意,没有什么特别的<...>:它仅在实际返回值具有该格式时才起作用,如在这种情况下(即<module.A object at 0x...>)。ELLIPSIS选项使...“匹配实际输出中的任何子字符串¹。所以我认为没有办法使它与整个输出匹配。

更新:要以“适当”的方式执行此操作,似乎您想调用doctest.register_optionflag('IGNORE_RESULT'),subclass doctest.OptionChecker,并安排doctest使用该子类的实例。大概这意味着$ python -m doctest your_module.py无法通过来运行doctest 。