【问题标题】:Python/Django: how does the ugettext_lazy function exactly work with operator %?Python/Django:ugettext_lazy 函数如何与运算符 % 一起工作?
【发布时间】:2017-02-12 15:57:24
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: python django python-2.7 unicode translation


    【解决方案1】:

    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 更清晰易懂。

    【讨论】:

    • 所以如果我的理解是正确的,"%" 或 "+" 操作符强制 unicode 渲染的方式与我在LOG.warning(u"%s" % _(text)) 中的方式相同。我可以向您保证,我的记录器已正确设置为具有警告级别的“做事”。但是,它不会在以下情况下评估惰性字符串:_("text"),无需任何操作。所以我实际上有 3 个解决方案:` u"%s" % _(text) _(text).__unicode__() ugettext(text)` 什么是最好的?对于日志记录过程,返回 ugettext 是否有区别?此代码仅在发生异常时执行...
    • @user6920919 除非我需要惰性功能,否则我不会使用 _lazy 变体,当我需要 Unicode 字符串时我会调用 ugettext,当我需要非 Unicode 字符串时我会调用 gettext .
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2013-07-10
    • 2021-07-01
    • 2021-12-17
    • 2020-12-07
    相关资源
    最近更新 更多