2013-09-12 3 views
14

При написании доктрин python, как правильно ввести символы новой строки в строку в тесте? Вот простой пример:Утилита 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: '"' 

ответ

13

Вы должны избежать обратной косой черты.

Docstring сама по себе строка, где \n означает символ новой строки. В

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

строка документация не содержит допустимый оператор Python, но вместо этого содержит строку внутри строки в кавычках

+3

Это должен быть принятый ответ. Просто замените каждый '\ n' на' \\ n'. –

+4

Или вместо замены '\ n' на' \\ n', сделайте docstring необработанной строкой python: 'r" "" print "Hello world \ n"; "" "' – BioGeek

14

docstring docs фактически намекает на проблемы, но не совсем ясно.

Несколько других потоков потоковой обработки here и here были полезны, но нелегко найти с учетом моих собственных критериев поиска.

Вот мое фактическое решение:

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. строки документации должна быть сырой строкой питона.
  2. Мне пришлось использовать print() на выходе функции.
  3. Мне пришлось преодолеть свое собственное замешательство с разницей между \n и \r. (Это на мне.)

Надеюсь, это спасет кого-то еще пару часов, которые я потратил на это.

+0

Кстати, я думаю, что имя 'remove_newlines 'довольно вводит в заблуждение, если он не удаляет' \ n'. – flornquake

+0

Довольно справедливо @flornquake. Проблема выскочила из-за моей пули № 3 выше. Изменено имя функции на 'remove_CRs'. :) – kalefranz

+0

Предложение использования 'print' было отличной идеей - хорошо сработало для меня спасибо. – jamesc

3

Просто префикс моей docstring с 'r' работал в моем случае. Python 3.5.1.

+0

не работает для python 2.x – ospider

Смежные вопросы