2016-10-04 29 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

相關問題