2016-10-04 102 views
1

我使用Python 2.7版和有问题与像行: LOG.warning(_("text"))Python/Django:ugettext_lazy函数如何与运算符%一起工作?

为LOG.warning期待一个字符串(STR)这将无法工作,ugettext_lazy只知道如何呈现的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

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

+0

所以,如果我的理解是正确的,“%” OU“ +“操作符强制unicode呈现方式与我的行LOG.warning(u”%s“%_(text))''一样。 我可以向你保证,我的记录器被正确设置为具有警告级别的“做事情”。但是,它不评估在以下情况下的懒惰字符串: '_(“text”)' 没有任何操作。 所以我其实有3个解决方案: ' U “%s的” %_(文本) _(文本).__的unicode __() ugettext(文本) ' 什么是最好的?对于日志记录过程,回到ugettext有什么不同吗?此代码仅在发生异常时执行... – user6920919

+0

@ user6920919除非需要懒惰功能,否则我不会使用_lazy变体,并且在需要Unicode字符串和gettext时,我会调用'ugettext'一个非Unicode字符串。 – Flimm

相关问题