Python: как заставить «печать» использовать __unicode__ вместо __str__, или иным образом естественным образом «распечатать» сообщение без явного вызова unicode ()

В основном я просто хочу иметь возможность создавать экземпляры, используя класс с именем Бутылка: например, класс Бутылка (объект): ... , а затем в другом модуле иметь возможность просто «распечатать» любой экземпляр без необходимости взлома кода для явного вызова процедуры кодирования символов .

Таким образом, когда я пытаюсь:

obj=Bottle(u"味精")
print obj

Или «на месте» «print»:

print Bottle(u"味精")

Я получаю:

"UnicodeEncodeError: 'ascii' codec can't encode characters"

Подобные вопросы о переполнении стека:

¢ В настоящее время невозможно переключиться на python3. ¢

Решение или подсказка (и объяснение) о том, как выполнить печать utf-8 на месте (точно так же, как класс U успешно ниже) были бы весьма признательны. : -)

ThanX N

-

Пример кода:

-------- 8>

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def setdefaultencoding(encoding="utf-8"):
  import sys, codecs

  org_encoding = sys.getdefaultencoding()
  if org_encoding == "ascii": # not good enough
    print "encoding set to "+encoding
    sys.stdout = codecs.getwriter(encoding)(sys.stdout)
    sys.stderr = codecs.getwriter(encoding)(sys.stderr)

setdefaultencoding()

msg=u"味精" # the message!

class U(unicode): pass

m1=U(msg)

print "A)", m1 # works fine, even with unicode, but

class Bottle(object):
  def __init__(self,msg): self.msg=msg
  def __repr__(self): 
    print "debug: __repr__",self.msg
    return '{{{'+self.msg+'}}}'
  def __unicode__(self): 
    print "debug: __unicode__",self.msg
    return '{{{'+self.msg+'}}}'
  def __str__(self): 
    print "debug: __str__",self.msg
    return '{{{'+self.msg+'}}}'
  def decode(self,arg): print "debug: decode",self.msg
  def encode(self,arg): print "debug: encode",self.msg
  def translate(self,arg): print "debug: translate",self.msg

m2=Bottle(msg)

#print "B)", str(m2)
print "C) repr(x):", repr(m2)
print "D) unicode(x):", unicode(m2)
print "E)",m2 # gives:  UnicodeEncodeError: 'ascii' codec can't encode characters

---- ---- 8>

encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
{{{\u5473\u7cbe}}}
D) unicode(x): debug: __unicode__ 味精
{{{味精}}}
E) debug: __str__ 味精
Traceback (most recent call last):
  File "./uc.py", line 43, in ?
    print "E)",m2 # gives:  UnicodeEncodeError: 'ascii' codec can't encode characters
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)

-------- 8>

encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
Traceback (most recent call last):
  File "./uc.py", line 41, in 
    print "C) repr(x):", repr(m2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)

7
задан Community 23 May 2017 в 12:04
поделиться