在doctest中继续/换行

JCO*_*611 6 python doctest

我正在doctest.testmod()做一些基本的测试.我有一个返回长字符串的函数,比方说get_string().就像是:

def get_string(a, b):
    r''' (a, b) -> c

    >>> get_string(1, 2)
    'This is \n\n a long \n string with new \
    space characters \n\n'
    # Doctest should work but does not.

    '''
    return ('This is \n\n a long \n string ' + \
            'with new space characters \n\n')
Run Code Online (Sandbox Code Playgroud)

问题是doctest没有通过,因为它期望一个单行字符串,并且它将包裹视为一个\n字符.有办法解决这个问题吗?

PS:这不是我正在使用的实际功能,而是为您着想的最小版本.

gee*_*ekQ 6

您可以使用NORMALIZE_WHITESPACE选项(另请参阅完整的选项列表).

以下是doctest文档中的示例:

>>> print range(20) # doctest: +NORMALIZE_WHITESPACE
[0,   1,  2,  3,  4,  5,  6,  7,  8,  9,
10,  11, 12, 13, 14, 15, 16, 17, 18, 19]
Run Code Online (Sandbox Code Playgroud)


Bak*_*riu 5

我认为你不明白它是如何doctest运作的.它并没有检查输出是否是某种"等效",它只检查是否输出相同(只有很轻微的可能的变型,如利用省略号).从文档:

doctest模块搜索看起来像交互式Python会话的文本片段,然后执行这些会话以验证它们是否完全如图所示工作.

Doctest将输出(不是字符串文字,python表达式或其他.原始输出字节)与您提供的示例输出的内容进行匹配.由于它不知道引号之间的文本表示字符串文字,因此无法根据需要对其进行解释.

换句话说:你唯一能做的就是简单地将整个输出放在一行上,如:

>>> get_string(1, 2)
    'This is \n\n a long \n string with new space characters \n\n'
Run Code Online (Sandbox Code Playgroud)

如果输出太长,您可以尝试修改示例以生成更短的字符串(例如,将50其剪切为字符:) get_string(1, 2)[:50].如果你看一下不同项目的doctests,你会发现不同的hacks,使doctests更可读,同时提供可靠的输出.