在doctest中包含原始制表符文字字符

问题描述

我不知道如何避免此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'

我在源代码output前面的第5行中添加了制表符文字

看起来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解析,然后构造DocTestFinderDocTestRunner和您的DocTestParser子类并手动调用其方法。