Python / Django:ugettext_lazy函数如何与operator%完全一致?

时间:2016-10-04 13:02:00

标签: python django python-2.7 unicode translation

我正在使用python 2.7并遇到如下行的问题:     LOG.warning(_("text"))

这不会起作用,因为LOG.warning期望一个字符串(str),而ugettext_lazy只知道如何渲染unicode。

现在我找到的解决办法是在调用记录器之前强制执行unicode渲染:

    text = 'Test trans'
    LOG.warning(u"%s" % _(text))

然而,我很惊讶地注意到这段代码也有效:

LOG.warning(_(Test trans %(test)s.') % {'test': 1})
LOG.warning(_('Test trans %s.') % 1)

有人可以解释原因吗? %运算符是否在替换变量之前调用unicode呈现?

提前致谢。

1 个答案:

答案 0 :(得分:2)

ugettext_lazy中的u前缀表示此函数的返回值是Unicode字符串。 _lazy后缀表示返回值变为惰性,也就是说,当对字符串操作完成时,返回值仅在绝对最后的机会变为Unicode字符串。

尝试在python2 manage.py shell下运行此功能,看看我的意思:

>>> from django.utils.translation import ugettext_lazy as _
>>> _("hi")
<django.utils.functional.__proxy__ object at 0x10fa23b10>
>>> _("hi") + ""
u'hi'
>>> _("hi %s") % "hello"
u'hi hello'

我假设你假设LOG.warning只接受非Unicode字符串和惰性字符串是正确的。在您的情况下,也许您已将日志配置为不对警告日志消息执行任何操作,因此传递给LOG.warning的延迟字符串永远不会被评估,也永远不会转换为普通的非惰性Unicode字符串。

ugettextgettext_lazy比较,你会明白我的意思。

顺便说一下,我强烈建议升级到Python 3,它处理Unicode的方式比Python 2更清晰,更容易理解。