以下(废话)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/