Что может вызвать следующее поведение?
>>> print str(msg)
my message
>>> print unicode(msg)
my message
Но:
>>> print '%s' % msg
another message
Дополнительная информация:
- my
msg
объект наследуется отunicode
. - методы
__str__
/__unicode__
/__repr__
были переопределены, чтобы вернуть строку'my message'
. - объект
msg
был инициализирован строкой'another message'
. - это работает на python 2.5
- переменная
msg
не была изменена между тестами - Это действительно настоящий докт, который действительно дает эти результаты.
Я бы хотел, чтобы решение, которое соответствует этому доктрину, с минимальной суматохой (особенно вокруг фактического наследования):
>>> print '%s' % msg
my message
Спасибо за все предложения.
Я не чувствую, что это поможет больше, но для любопытных читателей (и авантюрного питониста), здесь реализация объекта:
class Message(zope.i18nmessageid.Message):
def __repr__(self):
return repr(zope.i18n.interpolate(self.default, self.mapping))
def __str__(self):
return zope.i18n.interpolate(self.default, self.mapping)
def __unicode__(self):
return zope.i18n.interpolate(self.default, self.mapping)
Вот как мы создаем объект msg:
>>> msg = Message('another message', 'mydomain', default='my message')
Версия и код пакета Zope:
- zope.i18n-3.4.0 (код метода интерполяции())
- zope.i18nmessageid-3.4.3 (Код класса сообщений)
ИЗМЕНИТЬ ИНФОРМАЦИЮ:
- добавлены/обновлены имена методов, которые были переопределены
- добавлена дополнительная информация (версия python и небольшая информация).
- обновлена некорректная информация (класс `msg` основан на классе` unicode`, а не `basestring`)
- добавлена фактическая реализация используемого класса