полностью запутался сейчас ... Я занимаюсь разработкой на python / django и использую ведение журнала на python. Все мое приложение требует Unicode, и все мои модели имеют только методы unicode () `, return u '..'. Теперь при регистрации я столкнулся с действительно странной проблемой, что потребовалось много времени, чтобы обнаружить, что я могу воспроизвести ее. Я пробовал и Py 2.5.5 и Py 2.6.4 и то же самое. Итак
Всякий раз, когда я делаю прямую регистрацию, такую как:
logging.debug(u'new value %s' % group)
это вызывает группу моделей. Юникод (): вернуть юникод (group.name)
Все мои методы Unicode выглядят так:
def __unicode__(self):
return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
Это работает, даже если group.name имеет значение XXX или ÄÄÄ (требуется Unicode). Но когда я по какой-то причине хочу записать набор, список, словарь, набор django-запросов и отдельные экземпляры, например, в. список может быть в юникоде или нет, у меня неприятности ...
Так что я получу UnicodeDecodingError всякий раз, когда для group.name требуется Unicode, такой как Luleå (мой родной город)
logging.debug(u'new groups %s' % list_of_groups)
Обычно я получаю такую ошибку:
Exception Type: UnicodeDecodeError
Exception Value: ('ascii', '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')
Но если я сделаю print list_of_groups
, все будет хорошо на терминале
Итак, я понимаю, что список начинает генерировать себя и выполняет repr () для всех своих элементов, и они возвращают свои значения - в этом случае это должно быть 's2 | ÅÄÖÖ ', тогда список представляется как (ascii, the-stuff-in-the-list), а затем при попытке декодировать ascii в unicode это, конечно, не будет работать, так как один из элементы в списке восстановили u '...' самого себя, когда для него было выполнено repr.
Но почему это ???? ´
И почему все работает, и Unicode / Ascii обрабатываются правильно всякий раз, когда я регистрирую простые вещи, такие как group.name и т. Д. Или group, и вызываются методы unicode . Всякий раз, когда я становлюсь ленивым и хочу регистрировать список, набор или другие вещи, которые портятся, когда встречается символ Юникода ...
Еще несколько примеров, которые работают и терпят неудачу. Если group.name
, я иду в поле модели и group
вызывает __unicode__()
logging.debug("1. group: %s " % group.name) # WORKS
logging.debug(u"2. group: %s " % group) # WORKS
logging.debug("3. group: %s " % group) # FAILS
logging.debug(u"4. group: %s " % group.name) # WORKS
logging.debug("5. group: %s " % group.name) # WORKS
... и я действительно думал, что у меня есть контроль над Unicode; - (