Python doctest 中的多行字符串输出

Multi-line string output in Python doctest

我有一个 Python3 函数,它 returns 一个多行字符串。我想用 doctest 测试它,但无法让它工作。我尝试使用 +NORMALIZE_WHITESPACE directive 但没有成功。

def dummy():
    """Dummy test function

    >>> dummy()  # doctest: +NORMALIZE_WHITESPACE
    '''Hello Mum
    Hello Dad'''
    """
    return """Hello Mum
    Hello Dad"""

if __name__ == "__main__":
    import doctest
    doctest.testmod()

以上代码失败并出现此错误:

File "c:/foo.py", line 5, in __main__.dummy
Failed example:
    dummy()  # doctest: +NORMALIZE_WHITESPACE
Expected:
    '''Hello Mum
    Hello Dad'''
Got:
    'Hello Mum\n    Hello Dad'

我尝试更改 doctest 行以包含文字 \n,如下所示:

>>> dummy()  # doctest: +NORMALIZE_WHITESPACE
'Hello Mum\n    Hello Dad'

但这失败了,并出现了几乎相同的错误:

Failed example:
    dummy()  # doctest: +NORMALIZE_WHITESPACE
Expected:
    'Hello Mum
    Hello Dad'
Got:
    'Hello Mum\n    Hello Dad'

如何使用 doctest 测试多行字符串输出?

问题是 \n 被解释为文档字符串中的换行符,但 doctest 需要一个反斜杠。

doctest 帮助说(强调我的):

If you continue a line via backslashing in an interactive session, or for any other reason use a backslash, you should use a raw docstring, which will preserve your backslashes exactly as you type them

所以他们的建议如下(注意 """ 之前的 r):

def dummy():
    r"""Dummy test function

    >>> dummy()
    'Hello Mum\n    Hello Dad'
    """
    return """Hello Mum
    Hello Dad"""

if __name__ == "__main__":
    import doctest
    doctest.testmod()

如果您要使用 \n 而不是 \n,它也可以在没有前导 r 的情况下工作,但最好坚持使用 r 版本可以从 python REPL 复制粘贴。

正如我在评论中提到的那样,一种解决方法是让你不需要 \n doctest 字符串中的文字到 print 输出然后匹配它,例如

def dummy():
    """Dummy test function

    >>> a = dummy()
    >>> print(a)
    Hello Mum
    Hello Dad

    """
    return """Hello Mum
Hello Dad"""

if __name__ == "__main__":
    import doctest
    doctest.testmod()