问题描述
我不知道如何避免此doctest错误:
Failed example:
print(test())
Expected:
output
<BLANKLINE>
Got:
output
<BLANKLINE>
对于此代码
def test():
r'''Produce string according to specification.
>>> print(test())
output
<BLANKLINE>
'''
return '\toutput\n'
看起来doctest(或python docstrings?)忽略了该制表符文字,并将其转换为四个空格。
所谓的“期望”值从字面上看并不是我的来源所指定的。
对此有什么解决方案?
我不想将打印语句替换为
>>> test()
'\toutput\n'
因为我通常喜欢doctest的原因很大一部分是因为它们演示了示例,所以我正在编写的此函数的最重要部分是输出的 shape 。
解决方法
文档字符串中的选项卡将扩展为8个空格,但输出中的选项卡不会扩展。
在doctest documentation中(添加了重点):
所有硬制表符都使用8列制表位扩展为空格。由测试代码生成的输出中的制表符不会被修改。由于示例输出中的所有硬标签都已展开,因此如果代码输出中包含硬标签,则doctest唯一可以通过的方法是
NORMALIZE_WHITESPACE
选项或指令是否有效。 或者,可以重写测试以捕获输出,并将其与期望值进行比较,作为测试的一部分。这种对源中选项卡的处理是通过反复试验得出的,并且已经证明是最不容易出错的处理方式。通过编写自定义DocTestParser
类,可以使用其他算法来处理标签。
不幸的是,在doctest文档中使用指令的所有示例都是mangled by Sphinx。使用NORMALIZE_WHITESPACE
的方法如下:
def test():
r'''Produce string according to specification.
>>> print(test()) # doctest: +NORMALIZE_WHITESPACE
output
<BLANKLINE>
'''
return '\toutput\n'
请注意,这会将所有空白运行都视为相等,而不是禁用制表符处理。禁用制表符处理非常麻烦,并且通过常规的doctest接口是不可能的-您需要继承DocTestParser
的子类,手动重新实现doctest解析,然后构造DocTestFinder
,DocTestRunner
和您的DocTestParser
子类并手动调用其方法。