现在完全糊涂了。。。我在python/django中开发并使用python日志。我的所有应用程序都需要unicode,而我的所有模型都只实现了一个unicode()`,return u'..'方法。现在,当我登录时,我遇到了一个非常奇怪的问题,我花了很长时间才发现我可以复制它。我试过PY2.5.5和PY2.6.4,都是一样的。所以
每当我做一些直截了当的日志时,比如:
logging.debug(u'new value %s' % group)
这将调用模型组。unicode():返回unicode(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查询集合和其中的单个实例(例如,列表可能是unicode或不是unicode)时,我会遇到麻烦。。。
因此,每当group.name需要像Luleå(我的家乡)这样的unicode时,这将给我带来unicodedecoding错误
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)')
但如果我这么做,终端上一切都会好起来的
所以,我的理解是,列表开始生成自己,并对其所有元素执行repr(),它们返回它们的值——在本例中,它应该是“s2 |ÄÖ”,然后列表将自己呈现为(ascii,当试图将ascii解码成unicode时,这当然不起作用,因为当repr完成时,列表中的一个元素重新获得了u'…'。
但这是为什么????'
以及为什么每当我记录诸如group.name和so或group之类的简单事情时,都会正确处理unicode/ascii,并调用unicode方法。每当我懒洋洋地想记录一个列表、集合或其他东西时,每当遇到unicode字符时就会出错。。。
还有一些成功和失败的例子。如果group.name
我转到model字段并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;--
尝试在views.py的顶部使用此代码
这是我的测试代码:
当你运行它的时候上面的工作很好。但是,如果您将repr的声明更改为: defrepr(self):返回unicode(self.s)
然后它中止:
因此,看起来对象层次结构中的某个人有一个repr()实现,该实现错误地返回unicode字符串而不是普通字符串。正如其他人提到的,当您使用
mylist是一个序列,python会自动对其调用repr(),而不是unicode()(因为没有“正确”的方法将列表表示为unicode字符串)。
这可能是django的错,或者您在一个模型中错误地实现了
#__repr__
。我不能用简单的测试再现你的问题:
所以,正如Daniel所说,在您传递给日志的内容中,可能有一些不正确的Unicode。
另外,我不知道您使用的是什么处理程序,但请确保是否有文件处理程序显式指定要使用的输出编码,如果有流处理程序,您还可以使用
codecs
模块提供的编码包装器包装任何需要它的输出流(并将包装的流传递给日志记录)。相关问题 更多 >
编程相关推荐