Лучший тип вывода и методы кодирования для функций __repr __ ()?

В последнее время у меня много проблем с __repr__() , format() и кодировками. Должен ли вывод __repr__() быть закодирован или быть строкой unicode? Есть ли лучшая кодировка для результата __repr__() в Python? То, что я хочу выводить, имеет символы, отличные от ASCII.

Я использую Python 2.x и хочу написать код, который можно легко адаптировать к Python 3. Таким образом, программа использует

 # -*- coding: utf-8 -*- from __future__ import unicode_literals, print_function # The 'Hello' literal represents a Unicode object 

Вот некоторые дополнительные проблемы, которые беспокоили меня, и я ищу решение, которое их решает:

  1. Должна работать печать на терминал UTF-8 (у меня sys.stdout.encoding установлен в UTF-8 , но было бы лучше, если бы и другие случаи работали тоже).
  2. Труба вывода в файл (закодированная в UTF-8) должна работать (в этом случае sys.stdout.encodingNone ).
  3. Мой код для многих __repr__() настоящее время имеет много return ….encode('utf-8') , и это тяжело. Есть ли что-нибудь крепкое и легкое?
  4. В некоторых случаях у меня даже есть уродливые звери, вроде return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8') , т. return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8') Представление объектов декодируется, помещается в строку форматирования и затем повторно кодируется. Я бы хотел избежать таких запутанных преобразований.

Что бы вы посоветовали сделать, чтобы написать простые функции __repr__() которые хорошо относятся к этим вопросам кодирования?

  • Почему обратная косая черта появляется дважды?
  • Понимание функции repr () в Python
  • Можно ли изменить функцию в python?
  • Явный эквивалент Python repr ()?
  • Разница между __str__ и __repr__ в Python
  • 3 Solutions collect form web for “Лучший тип вывода и методы кодирования для функций __repr __ ()?”

    В Python2 __repr____str__ ) должен возвращать строковый объект, а не объект unicode. В Python3 ситуация обратная, __repr__ и __str__ должны возвращать объекты unicode, а не байтовые (née string) объекты:

     class Foo(object): def __repr__(self): return u'\N{WHITE SMILING FACE}' class Bar(object): def __repr__(self): return u'\N{WHITE SMILING FACE}'.encode('utf8') repr(Bar()) # ☺ repr(Foo()) # UnicodeEncodeError: 'ascii' codec can't encode character u'\u263a' in position 0: ordinal not in range(128) 

    В Python2 у вас действительно нет выбора. Вы должны выбрать кодировку для возвращаемого значения __repr__ .

    Кстати, прочитали ли вы вики PrintFails ? Он не может напрямую ответить на ваши другие вопросы, но я нашел полезным в освещении, почему возникают определенные ошибки.


    При использовании from __future__ import unicode_literals ,

     '<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8') 

    можно более просто написать как

     str('<{}>').format(repr(x)) 

    предполагая, что str кодирует utf-8 в вашей системе.

    Без from __future__ import unicode_literals выражение может быть записано как:

     '<{}>'.format(repr(x)) 

    Я думаю, что декоратор может __repr__ управлять несовместимостью __repr__ . Вот что я использую:

     from __future__ import unicode_literals, print_function import sys def force_encoded_string_output(func): if sys.version_info.major < 3: def _func(*args, **kwargs): return func(*args, **kwargs).encode(sys.stdout.encoding or 'utf-8') return _func else: return func class MyDummyClass(object): @force_encoded_string_output def __repr__(self): return 'My Dummy Class! \N{WHITE SMILING FACE}' 

    Я использую следующую функцию:

     def stdout_encode(u, default='UTF8'): if sys.stdout.encoding: return u.encode(sys.stdout.encoding) return u.encode(default) 

    Тогда мои функции __repr__ выглядят так:

     def __repr__(self): return stdout_encode(u'<MyClass {0} {1}>'.format(self.abcd, self.efgh)) 
    Interesting Posts
    Python - лучший язык программирования в мире.