Últimamente, he tenido muchos problemas con __repr__()
, format()
y codificaciones. ¿Debería codificarse la salida de __repr__()
o ser una cadena unicode? ¿Hay una mejor codificación para el resultado de __repr__()
en Python? Lo que quiero mostrar tiene caracteres que no sean ASCII.¿El mejor tipo de salida y prácticas de codificación para las funciones __repr __()?
utilizo Python 2.x, y quiero escribir código que puede ser fácilmente adaptado a Python 3. El programa utiliza tanto
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function # The 'Hello' literal represents a Unicode object
Éstos son algunos problemas adicionales que me han estado molestando, y yo' m buscando una solución que les resuelve:
- impresión a un terminal de UTF-8 debería funcionar (no tengo
sys.stdout.encoding
conjunto deUTF-8
, pero sería mejor si otros casos trabajaron también). - La conexión de la salida a un archivo (codificada en UTF-8) debería funcionar (en este caso,
sys.stdout.encoding
esNone
). - Mi código para muchas funciones
__repr__()
actualmente tiene muchosreturn ….encode('utf-8')
, y eso es pesado. ¿Hay algo robusto y ligero? - En algunos casos, incluso tengo bestias feas como
return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')
, es decir, la representación de objetos se decodifica, se pone en una cadena de formato y luego se vuelve a codificar. Me gustaría evitar tales transformaciones enrevesadas.
¿Qué recomendarías hacer para escribir funciones simples __repr__()
que se comporten bien con respecto a estas preguntas de codificación?
Sería bueno si la documentación menciona esto :) (http://docs.python.org/reference/datamodel.html#basic-customization no lo hace) ... En fin ... lo haría Dicen que el enfoque del punto 4 en la pregunta es engorroso pero necesario, ¿verdad? – EOL
EOL: suponiendo que Python2, 'repr (x)' debe devolver una cadena codificada. Si estaba codificado con utf-8, entonces 'repr (x) .decode ('utf8'). Encode ('utf8')' no debería ser necesario. Si 'repr (x)' está codificado con alguna otra codificación, 'repr (x) .decode ('utf8')' fallará (con UnicodeDecodeError) o producirá resultados falsos, o tal vez se decodificará correctamente por casualidad afortunada. Entonces, AFAIK, 'repr (x) .decode ('utf8'). Encode ('utf8')' nunca debería ser necesario. ¿Puede dar un ejemplo? – unutbu
@EOL, ** El valor de retorno debe ser un objeto de cadena. ** es cómo la página de manual de referencia que señala expresa la restricción de que el valor de retorno debe ser una instancia de 'str' (un objeto Unicode no sería" a " objeto de cadena "). 'repr' se espera _normally_ devuelva ascii solamente (cosa de' repr (uo) 'para todos los objetos Unicode, por ejemplo: incluso _hathat_ devuelve ascii solamente - creo que ningún built-in o tipo de biblioteca estándar se comporta de otra manera) pero estrictamente hablando esa no es una restricción de idioma, por lo que no es asunto del manual de referencia. ¡Los parches de documentación propuestos son siempre bienvenidos, por cierto! -) –