以下(废话)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)会使读者背离这一点。)
重写:这实际上现在工作;我意识到我之前编写的“ 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 。
| 归档时间: |
|
| 查看次数: |
2826 次 |
| 最近记录: |