在django和unicode中使用python日志记录时出现问题

jen*_*nlu 7 python django unicode logging decoding

完全被现在混淆了......我正在开发python/django并使用python日志记录.我的所有应用程序都需要unicode,我的所有模型都只有一个unicode()`,返回你'''方法.现在,在登录时,我遇到了一个非常奇怪的问题,它花了很长时间才发现我可以重现它.我已经尝试过Py 2.5.5和Py 2.6.4以及同样的事情.所以

每当我做一些直接记录时,如:

logging.debug(u'new value %s' % group) 
Run Code Online (Sandbox Code Playgroud)

这称为模型组.unicode():返回unicode(group.name)

我的unicode方法看起来像这样:

def __unicode__(self):
    return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
Run Code Online (Sandbox Code Playgroud)

即使group.name为XXX或ÄÄ(需要unicode),这也适用.但是当我出于某种原因想要记录一个集合,列表,字典,django-query集合以及例如列表中的各个实例可能是unicode或者我没有遇到麻烦...

每当group.name需要像Luleå(我的家乡)这样的unicode时,这会给我一个UnicodeDecodingError

logging.debug(u'new groups %s' % list_of_groups)
Run Code Online (Sandbox Code Playgroud)

通常我得到这样的错误:

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)')
Run Code Online (Sandbox Code Playgroud)

但是,如果我做的print list_of_groups一切在终端上变得很好

所以,我的理解是列表开始生成自己并对其所有元素执行repr()并返回它们的值 - 在这种情况下它应该是's2 | ÅÄÖÖ',然后列表呈现为(ascii,列表中的东西),然后当尝试将ascii解码为unicode时,这当然不起作用 - 因为列表中的一个元素已经回归当repr完成时,你自己就是一个'...'.

但是为什么这个????'

为什么每当我记录group.name之类的简单事物以及调用unicode方法时,事情都能正常处理并且unicode/ascii被正确处理.每当我变得懒惰并且想要记录列表时,无论何时遇到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
Run Code Online (Sandbox Code Playgroud)

...我真的以为我抓住了Unicode ;-(

Dan*_*man 0

我不明白你不明白的是什么,如果你明白我的意思的话。你的中间段落:

\n\n
\n

所以,我的理解是列表开始生成自身并对它的所有元素执行 repr() 并返回它们的值 - 在这种情况下它应该是 's2 | \xc3\x85\xc3\x84\xc3\x96\xc3\x96',然后列表将自身呈现为 (ascii, the-stuff-in-the-list) 然后当尝试将 ascii 解码为 un​​icode 时,这将是当然不行——因为当 repr 完成时,列表中的一个元素已经返回了它自己的 u'...' 。

\n
\n\n

准确解释了发生了什么 - 输出列表与打印其所有元素不同,因为在幕后它所做的只是对列表中的每个元素调用 repr() 。您可以记录一个列表理解,而不是输出原始列表,该列表理解在每个元素上调用 unicode,这将修复它。

\n