2013-12-15 4 views
2

Im озадачен следующим образом:питон печати юникода «аномалия»

>>> 
>>> a 
'abc' 
>>> z 
u'xyz' 
>>> print a,z 
abc xyz 
>>> print (a,z) 
('abc', u'xyz') 
>>> print [a,z] 
['abc', u'xyz'] 
>>> print (a,str(z)) 
('abc', 'xyz') 

Каковы правила, если преобразование неявного типа делается, а когда нет его?

+3

Разница заключается в том, используется ли __repr__ или __str__. – Hyperboreus

ответ

3

Это различие между str и repr объекта unicode. repr предназначен для предоставления эквивалентного объекта, если вы вставляете его обратно в Python, и поэтому он включает в себя u; str предназначен для удобства чтения человеком, и это не так. Строки str и repr идентичны (они представляют собой одну и ту же строку).

Соответствующие правила здесь, для которых используется один являются:

  • Упоминание переменную в интерпретатор командной строке возвращает свой repr
  • print использует str
  • print a,z печатает два объекта, разделенных space - он анализирует print (a), (z). Он использует str как
  • print(a, z) строит и печатает кортеж, содержащий два объекта. print [a,z] ведет себя аналогично, за исключением того, что вместо этого строит и печатает список. В обоих случаях print использует контейнер str, который как для кортежа, так и для списка использует repr его содержимого.
  • print(a, str(z))str(z) звонки во-первых, и помещает свой результат в кортеже - и поэтому магнезии из , что строка привыкает, а не предст из z.
+0

О, я вижу, печать не рекурсивно в структуру. Благодарю. [это всплыло, пытаясь выяснить, что я получаю от мутагена по тегам id3 против FLAC и некоторого «диагностического» вывода, чтобы выяснить, будет ли im получать строки или unicode] – RFlack

0

print запрос оператора str для аргументов.

>>> a = 'abc' 
>>> z = u'xyz' 
>>> str(a) 
'abc' 
>>> str(z) 
'xyz' 
>>> print a, z 
abc xyz 
>>> print str(a), str(z) 
abc xyz 

>>> str((a,z)) 
"('abc', u'xyz')" 
>>> str([a,z]) 
"['abc', u'xyz']" 
>>> print (a,z) 
('abc', u'xyz') 
>>> print str((a,z)) 
('abc', u'xyz') 
0

Python 2 не выполняет преобразование неявного типа, за исключением при добавлении строки Unicode (которые в unicode типа) в строку байтов (которые в str типа) (Python 3 не делает неявное тип преобразования когда-либо). str преобразует объект в строку байтов (делает явно преобразование, ненеявное преобразование).

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