Bug 8366

Summary: Не перекодирует строки из списков при выводе в консоль
Product: Sisyphus Reporter: Vitaly Lipatov <lav>
Component: python-baseAssignee: Fr. Br. George <george>
Status: CLOSED WONTFIX QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: vseleznv
Version: unstable   
Hardware: all   
OS: Linux   

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

print b печаетет список. Некий объект. И что этот объект делает, и откуда у 
него там вообще строки, и есть ли они там, и как обрабатываются - глубоко 
интимное дело самого списка.
Comment 5 Vitaly Lipatov 2008-05-29 17:01:02 MSD
Возможно первоначально задача неточно сформулирована. Про перекодирование я 
ошибся. Ничего перекодировать не нужно.
Я именно и хочу добиться, чтобы 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 Mikhail Gusarov 2008-05-29 17:14:38 MSD
Извратиться всегда можно.

>>> 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

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