Как вы определяете __str__ в python при включении символов новой строки?

Я пытаюсь определить str() для объекта лабиринта и распечатать что-то вроде этого:

#######
#J..P.#
#.###.#
#..@#.#
#@#.@.#
#######

Однако, когда я создаю строку для возврата, она в конечном итоге печатается как:

'#######\n#J..P.#\n#.###.#\n#..@#.#\n#@#.@.#\n#######\n'

Все, что я делаю, это просматриваю список списков (каждая строка — это список, а весь лабиринт — это список этих списков строк) и соединяю «\n» в конце каждой строки. Есть ли что-то еще, что я должен сделать с результирующей строкой перед ее возвратом, чтобы строковое представление лабиринта при вызове print() или str() возвращало это первое желаемое представление?


person sabliao    schedule 24.04.2013    source источник
comment
У вас есть образец кода?   -  person Tom    schedule 24.04.2013
comment
Он уже возвращает то, что нужно... вам просто нужно print его   -  person jamylak    schedule 24.04.2013


Ответы (2)


Вы печатаете с помощью оператора печати или просто позволяете Python печатать значение? Например.:

>>> a = "This is a\nmultiline string"
>>> a
'This is a\nmultiline string'
>>> print a
This is a
multiline string

Это просто нормальное поведение Pythonic.

person rici    schedule 24.04.2013
comment
Что ж, я пытался использовать doctest, чтобы убедиться, что мои методы работают должным образом. Означает ли это, что для str выполнение doctests для этого метода на самом деле не сработает (поскольку вам придется возвращать строку, а не печатать построенную вами строку)? - person sabliao; 24.04.2013
comment
doctest очень нагляден :). Вы можете проверить str на соответствие ожидаемому результату str; если вы хотите, чтобы doctest выглядел лучше, вы, вероятно, захотите использовать print в doctest. В этом случае вам может показаться, что вы тестируете print, а не str. Существуют и другие фреймворки для юниттестов. - person rici; 24.04.2013
comment
Ладно, попался. Спасибо за ответ! - person sabliao; 24.04.2013

Вы пробовали использовать необработанные строки? (т. е. строки, завернутые в r""" """ вместо " " или ' ').

Кроме того, вы можете рассмотреть возможность использования os.linesep вместо жестко заданного \n для независимости от ОС. Подробнее об этом здесь.

person Tom    schedule 24.04.2013