Python doctest 中的多行字符串输出

8
我有一个Python3函数,它返回一个多行字符串。我想用doctest测试它,但无法使其正常工作。我尝试使用+NORMALIZE_WHITESPACE指令,但并没有成功。请参考以下内容:+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()

上述代码出现以下错误:
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测试多行字符串输出?


你尝试过这个吗? - ImranD
感谢@ImranD。看起来该示例中的省略号是用于多行输入(而不是输出),但我尝试了各种排列组合,包括没有引号(如您的建议所示),但始终在“Got:”中得到字面上的\n而不是实际的换行符... - Justin
2个回答

5

如我在评论中提到的,解决无需在doctest字符串中使用\n字面量的方法是先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()

4
问题在于在文档字符串中,\n被解释为换行符,但是doctest需要一个文本中的反斜杠。问题在于在文档字符串中,\n被解释为换行符,但是doctest需要一个文本中的反斜杠。
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()

如果你使用\\n代替\n,在没有前导r的情况下也可以工作,但最好还是使用带有r的版本,因为这个版本可以从Python REPL中复制粘贴。

1
谢谢Matthew!我希望有一种方法可以让doctest的期望输出“看起来像”实际输出,因为在我的实际例子中,有6或7行,这在单行的doctest中很难阅读。查看Imran的示例可以发现,如果您print输出,那么也许这是唯一的解决方法? - Justin
在第二个三重双引号 """(在 return 上面)之前是否缺少一个空行? - PatrickT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接