32

在编写 python 文档测试时,如何在测试中正确地在字符串中引入换行符?这是一个简单的例子:

def remove_newlines(text):
    """
    >>> remove_newlines("line1 \n"
    ...                 "still line 1\r"
    ...                 "now line2 \n"
    ...                 "more line2\n")
    line1 still line1
    now line2 more line2
    """
    return text.replace('\n', '')

import doctest
doctest.run_docstring_examples(remove_newlines, globals())

其输出为:

Traceback (most recent call last):
...
ValueError: line 3 of the docstring for NoName has inconsistent leading whitespace: '"'
4

3 回答 3

26

文档字符串文档实际上暗示了这个问题,但并不完全清楚。

此处此处的其他几个 stackoverflow 线程很有帮助,但考虑到我自己的搜索条件,这并不容易找到。

这是我的实际解决方案:

def remove_CRs(text):
    r"""
    >>> output = remove_CRs("line1 \r"
    ...                     "still line1\n"
    ...                     "now line2 \r"
    ...                     "more line2\r")
    >>> print(output)
    line1 still line1
    now line2 more line2
    """
    return text.replace('\r', '')

import doctest
doctest.run_docstring_examples(remove_CRs, globals())

与原始代码片段相比,三处发生了变化:

  1. 文档字符串必须是原始 python 字符串。
  2. 我不得不print()在函数输出上使用。
  3. 我必须克服自己对 和 之间的区别的\n困惑\r。(那个在我身上。)

希望这可以节省其他人我花在这上面的几个小时。

于 2013-09-12T20:02:32.497 回答
21

您需要转义反斜杠。

文档字符串本身就是一个字符串,\n表示换行符。在

def foo():
    """
    print "Hello world\n";
    """
    pass

文档字符串不包含有效的 Python 语句,而是在引用的字符串中包含换行符

于 2013-09-12T19:42:02.273 回答
11

在我的情况下,只需在我的文档字符串前面加上 'r' 就可以了。蟒蛇 3.5.1。

于 2016-04-19T17:10:54.163 回答