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: '"'
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
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:
- The docstring had to be a raw python string.
- I had to use
print()
on the function output.
- 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.
Just prefixing my docstring with ‘r’ worked in my case. Python 3.5.1.
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: '"'
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
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:
- The docstring had to be a raw python string.
- I had to use
print()
on the function output. - I had to get over my own confusion with the difference between
n
andr
. (That one’s on me.)
Hope this saves someone else the couple of hours I spent on this.
Just prefixing my docstring with ‘r’ worked in my case. Python 3.5.1.