Python doctest中的多行字符串输出

问题描述 投票:1回答:1

我有一个Python3函数,该函数返回多行字符串。我想用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测试多行字符串输出?

python python-3.x doctest
1个回答
0
投票

问题是\n被解释为docstring中的换行符,但是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()

如果您使用r而不是\\n,也可以不使用前导\n来工作,但最好使用可从python REPL复制粘贴的r版本。

© www.soinside.com 2019 - 2024. All rights reserved.