Python doctest with newline characters: inconsistent leading whitespace error

Question:

When writing python doctests, how does one properly introduce newline characters within a string in the test? Here’s a simple example:

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

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

The output of which is:

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

||

Answers:

You need to escape the backslash.

The docstring is itself a string where n means newline. In

def foo():
    """
    print "Hello worldn";
    """
    pass

the docstring doesn’t contain a valid Python statement but contains instead a newline inside the quoted string

Answered By: 6502

The docstring docs actually allude to the problem, but not entirely clearly.

A couple of other stackoverflow threads here and here were helpful, but not easy to find given my own search criteria.

Here is my actual solution:

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

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

Three things have changed from the original code snippet:

  1. The docstring had to be a raw python string.
  2. I had to use print() on the function output.
  3. I had to get over my own confusion with the difference between n and r. (That one’s on me.)

Hope this saves someone else the couple of hours I spent on this.

Answered By: kalefranz

Just prefixing my docstring with ‘r’ worked in my case. Python 3.5.1.

Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.