带有换行符的Python doctest:不一致的前导空格错误

时间:2013-09-12 19:38:36

标签: python doctest

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

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: '"'

3 个答案:

答案 0 :(得分:18)

你需要逃避反斜杠。

docstring本身就是一个字符串,其中\n表示换行符。在

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

docstring不包含有效的Python语句,而是在引用的字符串

中包含换行符

答案 1 :(得分:15)

docstring docs实际上提到了问题,但并不完全清楚。

其他几个stackoverflow线程herehere很有帮助,但根据我自己的搜索条件,不容易找到。

这是我的实际解决方案:

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. docstring必须是原始的python字符串。
  2. 我必须在函数输出上使用print()
  3. 我不得不对\n\r之间的区别感到困惑。 (那是我的。)
  4. 希望这可以节省其他人花费我几个小时的时间。

答案 2 :(得分:7)

在我的情况下,只需在我的docstring前加上'r'。 Python 3.5.1。