2010-06-24 16 views

Respuesta

4

sólo tiene que utilizar una cadena de formato Unicode, en lugar de tener una cadena de bytes en ese papel:

>>> class X(object): 
... def __str__(self): return 'str' 
... def __unicode__(self): return u'unicode' 
... 
>>> x = X() 
>>> print u'%s' % x 
unicode 
+0

Tener '__unicode__' devolver una cadena de bytes y la impresión de un objeto Unicode hacen ejemplos terribles. –

+0

@Mike, estuvo de acuerdo con el problema de 'devolución' - corrigió ese error tipográfico. Fuerte desacuerdo sobre la 'impresión': en una plataforma decente, 'sys.stdout.encoding' está configurado y la impresión funcionará perfectamente, mientras que adivina ciegamente el uso de 'some_encoding' (si no está en el sistema. stdout ¿cómo vas a adivinarlo, rezar?). –

+1

en qué "plataforma decente" hace 'python -c 'imprime u" \ xff "'> some_file' ¿no creas UnicodeEncodeError? – habnabit

1

No. No tendría sentido para que esto sea el caso.

print (u"%s" % obj).encode(some_encoding) usará obj.__unicode__.

+1

Odie la idea de adivinar ciegamente el 'some_encoding' ya que esta respuesta forzaría a uno a hacer: una plataforma decente establecerá' sys.stdout.encoding' para que una 'impresión' simple funcione correctamente, si la suya no lo hace debe envolver sys.stdout en un contenedor que establece la codificación, en ** un ** lugar (luego puede usar 'print' como es apropiado y decente!), en lugar de derramar tales conjeturas por todo el mobiliario (qué * * horrible ** forma de programar). –

0

En primer lugar, ¿hay uno?

Seguro (tipo de). Una cadena de formato Unicode convertirá los valores de formato a Unicode, lo que implica que se llamará obj.__unicode__ (reference).

u'this is a %s' % ('unicode string') 

Aparte de lo anterior, no hay ninguna razón particular por la que no se podía ser explícita:

print '%s' % (unicode(obj)) 
+0

'print '% s'% unicode (obj)' no es realmente explícito. Convierte implícitamente una str en unicode cuando se aplica el%, que es una de las cosas más feas que hace Python. –

+0

Tropezamos con esto unos segundos más tarde. ¡Supongo que esto funciona para mí! – mpen

+1

... y se basa en 'imprimir' una cadena unicode exactamente igual a mi respuesta muy vilipendiada, muy rechazada y mucho más temprana; ver a este votando en cambio podría confirmar la sospecha de que los detractores de hecho están empeñados en un asunto personal venganza, no es una objeción técnica, cualquier palabra de boca melosa en la que intenten disfrazarse ;-). –

Cuestiones relacionadas