的文档测试以下的(无义)Python模块的失败:Doctests:如何抑制/忽略输出?
"""
>>> 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)
更改为这样会抑制输出,因为doctest是为了文档的目的,并向读者展示模块应该如何使用。 (在这种情况下被记录在案,append_to
应使用语句似与不似函数编写_ = append_to(L)
会与此不同的读者。)
通过提供自包含的可运行代码,你的意思是什么?我给出的代码可以直接用Python解释器运行(正如我提到的那样产生了错误) - 至少在这里使用Python 2.6。 至于你的回答:我也想过把所有东西都包装在一个函数中,这样返回值就是'None',但是完全如你所写,这看起来不是一个很干净的解决方案。 – Marc 2010-10-05 10:02:06
我只是误导了它; doctest被写为一个单独的字符串,而不是被测试的属性 - 我从来不这样做。无论如何,只要你的测试确实解决了一个单一的结果,上述内容相当干净。如果一个测试不适合这种模式,例如。如果你有多个相互关联的语句,测试一些结果值而不是其他的,那么它将不会工作得很好。真的需要有一个doctest.DISCARD标志。 – 2010-10-05 10:10:51