Есть ли соглашение Python, когда вы должны реализовать __str__()
против __unicode__()
. Я видел, как классы переопределяют __unicode__()
чаще, чем, __str__()
но они не выглядят согласованными. Существуют ли конкретные правила, когда лучше реализовать одно против другого? Это необходимо / хорошая практика для реализации обоих?
213
__unicode__
а потом делаетеstr(obj)
?unicode
поднимаетNameError
на Python 3, это простой шаблон, который работает на 2 и 3?future
пакет также предоставляетpython_2_unicode_compatible
без Django в качестве зависимости.Если бы я не особенно заботился о микрооптимизации для данного класса, я бы всегда реализовывал
__unicode__
только ее, так как она более общая. Когда я забочусь о таких незначительных проблемах производительности (что является исключением, а не правилом), имея__str__
только один (когда я могу доказать, что в строковом выводе никогда не будет символов, не являющихся ASCII) или оба (когда возможны оба) Помогите.Я думаю, что это твердые принципы, но на практике это очень распространено в KNOW, что не будет ничего, кроме символов ASCII, без усилий доказать это (например, в строковой форме есть только цифры, пунктуация и, возможно, короткое имя ASCII ;-), в котором в случае, если довольно типично перейти непосредственно к «справедливому
__str__
» подходу (но если бы команда программистов, с которой я работал, предложила местное руководство, чтобы избежать этого, я был бы +1 в предложении, поскольку в этих вопросах легко ошибиться И «преждевременная оптимизация - корень всего зла в программировании» ;-).источник
Поскольку мир становится все меньше, есть вероятность, что любая строка, с которой вы столкнетесь, в конечном итоге будет содержать Unicode. Так что для любых новых приложений вы должны по крайней мере предоставить
__unicode__()
. Вне__str__()
зависимости от того, переопределите ли вы, это просто вопрос вкуса.источник
Если вы работаете в python2 и python3 в Django, я рекомендую декоратор python_2_unicode_compatible:
Как отмечалось в предыдущих комментариях к другому ответу, некоторые версии future.utils также поддерживают этот декоратор. В моей системе мне нужно было установить более новый модуль future для python2 и установить future для python3. После этого, вот функциональный пример:
Вот пример выходных данных (где venv2 / venv3 являются экземплярами virtualenv):
источник
Python 2: Реализуйте только __str __ () и возвращайте юникод.
Когда
__unicode__()
опущено и кто-то вызываетunicode(o)
илиu"%s"%o
, Python вызываетo.__str__()
и конвертирует в Unicode, используя системную кодировку. (См. Документацию__unicode__()
.)Обратное не верно. Если вы реализуете,
__unicode__()
но нет__str__()
, тогда, когда кто-то вызываетstr(o)
или"%s"%o
, Python возвращаетсяrepr(o)
.обоснование
Почему бы работать, чтобы вернуть
unicode
из__str__()
?Если
__str__()
возвращает юникод, Python автоматически конвертирует егоstr
в системную кодировку.В чем выгода?
① Это освобождает вас от беспокойства о том, что такое системная кодировка (т.е.
locale.getpreferredencoeding(…)
). Мало того, что это грязно, лично, но я думаю, что система должна заботиться в любом случае. ② Если вы осторожны, ваш код может оказаться кросс-совместимым с Python 3, в котором__str__()
возвращается юникод.Разве не обманчиво возвращать юникод из вызываемой функции
__str__()
?Немного. Тем не менее, вы, возможно, уже делаете это. Если у вас есть
from __future__ import unicode_literals
верхняя часть файла, есть большая вероятность, что вы вернете юникод, даже не зная об этом.А как насчет Python 3?
Python 3 не использует
__unicode__()
. Однако, если вы реализуете__str__()
так, что он возвращает юникод в Python 2 или Python 3, то эта часть вашего кода будет кросс-совместимой.Что, если я хочу
unicode(o)
существенно отличаться отstr()
?Реализуйте оба
__str__()
(возможно, возвращениеstr
) и__unicode__()
. Я предполагаю, что это было бы редко, но вы могли бы хотеть существенно различного вывода (например, ASCII-версии специальных символов, например,":)"
дляu"☺"
).Я понимаю, что некоторые могут найти это спорным.
источник
Стоит указать тем, кто не знаком с этой
__unicode__
функцией, некоторые из поведений по умолчанию, окружающих ее еще в Python 2.x, особенно когда они определены рядом с__str__
.выдает следующий вывод консоли ...
Теперь, когда я раскомментирую
__str__
методисточник