Bug 8366 - Не перекодирует строки из списков при выводе в консоль
: Не перекодирует строки из списков при выводе в консоль
Status: CLOSED WONTFIX
: Sisyphus
(All bugs in Sisyphus/python-base)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2005-10-29 15:52 by
Modified: 2008-05-29 17:14 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2005-10-29 15:52:08
Просто строка выводится на экран нормально, но при выводе из списка или 
кортежа перекодирования не происходит. 

#!/usr/bin/python  
# -*- coding: koi8-r -*-  
a="проверка"  
b=["корова","Москва","слово"]  
print a  
print b
------- Comment #1 From 2008-03-11 14:47:53 -------
Reassign to real maintainer.
------- Comment #2 From 2008-05-28 23:10:37 -------
Всегда так было. Метод repr() не обязан ходить к установленной локали (которая
к
тому же может быть и не установлена, и установлена ошибочно) -- соответственно,
не производит перекодировки ни в какую локаль. Выход один: писать hex-байты как
они есть.
------- Comment #3 From 2008-05-29 01:01:05 -------
Не пойму смысла такого глубокого отличия в отношении к строкам в случае a и b.
------- Comment #4 From 2008-05-29 01:07:18 -------
print зовёт str() от объекта. Для строки это даёт верный результат, а список 
зовёт repr() от своего содержимого для сборки своего строкового представления.

print b печаетет список. Некий объект. И что этот объект делает, и откуда у 
него там вообще строки, и есть ли они там, и как обрабатываются - глубоко 
интимное дело самого списка.
------- Comment #5 From 2008-05-29 17:01:02 -------
Возможно первоначально задача неточно сформулирована. Про перекодирование я 
ошибся. Ничего перекодировать не нужно.
Я именно и хочу добиться, чтобы repr() писал "байты как они есть.", не заменяя 
их шестнадцатеричным символьным представлением. Но так как repr менять никото 
не будет, даже не знаю что сказать.
Вывод у этой программы странный получается
$ python z.py
проверка
['\xcb\xcf\xd2\xcf\xd7\xc1', '\xed\xcf\xd3\xcb\xd7\xc1',
'\xd3\xcc\xcf\xd7\xcf']

Ладно, пойдём обходным путём:
for x in b:
    print x
------- Comment #6 From 2008-05-29 17:14:38 -------
Извратиться всегда можно.

>>> a = ["корова","Москва","слово"]
>>> a.__repr__ = lambda: "[" + ",".join(self) + "]"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object attribute '__repr__' is read-only

Гм. Не всегда :)