Python отображает `\ n` вместо разрыва строки - PullRequest
18 голосов
/ 19 марта 2019

Я написал функцию для создания VALUES части SQL-запроса:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      ),

Когда я вызываю эту функцию и print результат, я получаю:

query_values:
('\n("801",\n"printer",\n"barcode printer")\n,\n\n("844",\n"laptop",\n"windows")\n,\n\n("997",\n"printer",\n"barcode printer")\n',)

Все в одной строке.Вместо разрыва строки отображаются \n.

Первоначально у меня был один \n, но затем я вставил несколько, просто чтобы посмотреть, будут ли они отображаться.

Второйпроблема заключалась в том, что вокруг всего этого есть круглые скобки, которые мне не нужны.

Я ломал голову над двумя проблемами, и я нашел решение для второй:

У меня былозапятая в конце функции.Запятая заставляла функцию возвращать кортеж вместо одной строки.

Я удалил запятую:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      )

, и это исправило обе проблемы.Вывод был теперь:

query_values:

("801",
"printer",
"barcode printer")
,

("844",
"laptop",
"windows")
,

("997",
"printer",
"barcode printer")

Я поставил запятую обратно, и на дисплее появилось \n.Я удалил запятую, и у меня снова несколько строк.

Я удалил посторонние \n, так что теперь я получаю то, что хотел:

query_values:

("801","printer","barcode printer"),
("844","laptop","windows"),
("997","printer","barcode printer")

Итак, мой код работает правильно,но я полностью сбит с толку символами \n, отображаемыми в старой версии кода.Почему это произошло?

ОБНОВЛЕНИЕ: пара ответов на этот вопрос была сосредоточена на том, почему я получаю кортеж.Это не мой вопрос.Почему отображается /n? 1040 *

Ответы [ 4 ]

19 голосов
/ 19 марта 2019

Кажется, что это поведение кортежей. Когда будет напечатан кортеж, print вызывает __repr()__ для каждого элемента. То же самое относится и к спискам.

Я пробовал это:

tup = "xxx\nxx",
lst =["xxx\nxx"]
for t in tup,lst:
    print('t      :', t)
    for s in t:
        print('element:',s)
        print('   repr:',s.__repr__())
    print('---')

и вывод:

t      : ('xxx\nxx',)
element: xxx
xx
   repr: 'xxx\nxx'
---
t      : ['xxx\nxx']
element: xxx
xx
   repr: 'xxx\nxx'
---

Итак, одинаковое поведение для кортежей и списков.

Когда у нас есть строка, вызов __repr__() не расширяет \n символов и заключает в кавычки:

s = "xxx\nxx"
print('s           :', s)
print('s.__repr__():', s.__repr__())

выходы:

s           : xxx
xx
s.__repr__(): 'xxx\nxx'

Такое поведение кортежа было упомянуто в комментариях running.t , interjay и Daniel Roseman , но не в ответах, поэтому я публикую это ответить.

12 голосов
/ 19 марта 2019

Запись return something, аналогична return (something,): возвращает кортеж, содержащий один элемент.Когда вы print это, он покажет внешние скобки для кортежа, и строка внутри будет напечатана как его представление исходного кода, то есть с escape-кодами и внутри кавычек.

Однако, return something простовозвращает это значение, которое затем может быть напечатано в обычном режиме.

1 голос
/ 19 марта 2019

Кажется, это поведение для кортежей в Python. Вы можете проверить это в более простом случае, например:

>>> print ("xxx\n\nx",)
('xxx\n\nx',)

Похоже, что Python помогает вам при отладке и экранирует все последовательности команд в строках при печати, поэтому строки выглядят так же, как они были определены.

Это действительно смутило вас, забавный случай. :)

0 голосов
/ 19 марта 2019

Кортеж может быть обозначен с или без круглых скобок, его запятая определяет тип.

>>> t = 1, 'a', 'abc'
>>> type(t)
<type 'tuple'>
>>> t
(1, 'a', 'abc')
>>> 

В приведенном выше случае вы добавили завершающую запятую после того, как строка и python интерпретировали ее как кортеж.

Проверьте эту ссылку .

>>> t= 'a',
>>> type(t)
<type 'tuple'>
>>> t
('a',)
>>> t = 'a'
>>> type(t)
<type 'str'>
>>> t
'a'
...