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

标签 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 渲染?

提前致谢。

最佳答案

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 更清晰、更容易理解。

关于Python/Django : how does the ugettext_lazy function exactly work with operator %?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853066/

相关文章:

Python pandas 等效于替换

python - 如何在 Python 中将十六进制字符串转换为 ObjectId

python - 根据其他列值创建 Pandas Dataframe 行

python - 如何在 matplotlib 中的绘图之间放置文本

json - 如何在 Django 1.9 中查询复杂的 JSONB 字段

具有远程编辑功能的 Python 和 Django IDE?

python - Django:用户对象的 'email' 属性

python - Django-MySQLdb : Symbol not found: _mysql_affected_rows

python - 如何优化推理一个简单的、保存的 TensorFlow 1.0.1 图?

python - 不能再在 Windows 上运行 python