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()
我有一个 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()