Python doctest中的多行字符串输出

Jus*_*tin 8 python doctest python-3.x

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

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()
Run Code Online (Sandbox Code Playgroud)

上面的代码失败并出现以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

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

>>> dummy()  # doctest: +NORMALIZE_WHITESPACE
'Hello Mum\n    Hello Dad'
Run Code Online (Sandbox Code Playgroud)

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

Failed example:
    dummy()  # doctest: +NORMALIZE_WHITESPACE
Expected:
    'Hello Mum
    Hello Dad'
Got:
    'Hello Mum\n    Hello Dad'
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*tin 5

正如我的评论中提到的,一种解决方法是,您不需要\ndoctest 字符串中的文字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()
Run Code Online (Sandbox Code Playgroud)


Mat*_*dge 4

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

文档测试帮助说(强调我的):

如果您在交互式会话中通过反斜杠继续一行,或者出于任何其他原因使用反斜杠,则应该使用原始文档字符串,它将在您键入反斜杠时准确地保留它们

所以他们的建议如下(注意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()
Run Code Online (Sandbox Code Playgroud)

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