Skip to main content
 首页 » 编程设计

python /Django : how does the ugettext_lazy function exactly work with operator %

2024年10月17日34kenshinobiy

我使用的是 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 渲染?

提前致谢。

请您参考如下方法:

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字符串。

与 ugettext 比较和 gettext_lazy ,您会明白我的意思。

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