Me dieron a entender que llamando al print obj
llamaría al obj.__str__()
, que a su vez devolvería una cadena para imprimir en la consola. Ahora me dirijo un problema con Unicode donde no pude imprimir ningún carácter no ascii. Obtuve el típico "ascii fuera de alcance".Diferencia de Python entre imprimir obj e imprimir obj .__ str __() [al menos con Unicode?]
Mientras se experimenta lo siguiente trabajaron:
print obj.__str__()
print obj.__repr__()
Con ambas funciones haciendo exactamente lo mismo (__str__()
sólo devuelve self.__repr__()
). Lo que no funcionó:
print obj
El problema ocurrió solo con el uso de un carácter fuera del rango ascii. La solución final fue la siguiente en __str__()
:
return self.__repr__().encode(sys.stdout.encoding)
Ahora funciona para todas las partes. Mi pregunta ahora es: ¿Dónde está la diferencia? ¿Por qué funciona ahora? Me sale si nada funcionó, por qué esto funciona ahora. Pero, ¿por qué solo funciona la parte superior, no la inferior?
El sistema operativo es Windows 7 x64 con un símbolo del sistema predeterminado de Windows. También se informa que la codificación es cp850
. Esta es más una pregunta general para entender Python. Mi problema ya está resuelto, pero no estoy 100% contento, sobre todo porque ahora llamando al str(obj)
producirá una cadena que no está codificada de la manera que yo quería.
# -*- coding: utf-8 -*-
class Sample(object):
def __init__(self):
self.name = u"üé"
def __repr__(self):
return self.name
def __str__(self):
return self.name
obj = Sample()
print obj.__str__(), obj.__repr__(), obj
Quite el último obj
y funciona. Sigue así y se estrella con
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
¿Qué versión de Python son estás corriendo? –
Muestra un ejemplo mínimo de la clase obj con muestras de las cadenas que imprimes. –
¿Quizás estabas buscando 'obj .__ unicode __()'? –