2016-10-04 5 views
1

私のpython 2.7を使用してのような行で問題があったのです: LOG.warning(_("text"))Python/Django:演算子%でugettext_lazy関数を正確に動作させる方法は?

LOG.warningは、文字列(STR)を期待しているように、これは動作しませんとugettext_lazyはUnicodeのみをレンダリングする方法を知っています。

今、私が見つけた解決策は、ロガーを呼び出す前に、Unicodeのレンダリングを強制することでした:

LOG.warning(_(Test trans %(test)s.') % {'test': 1}) 
LOG.warning(_('Test trans %s.') % 1) 

誰かが理由を説明することができます:

text = 'Test trans' 
    LOG.warning(u"%s" % _(text)) 

は、しかし、私は論文のコードも働くことに気づいて驚きました? 変数を置き換える前に、 "%"演算子がユニコードのレンダリングを要求していますか?

ありがとうございます。

答えて

1

接頭語ugettext_lazyの接頭辞は、この関数の戻り値が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 " + "演算子は、私の行' LOG.warning(u "%s"%_(text)) 'と同じようにUnicodeの表示を強制します。 私のロガーは警告レベルで「やるべきこと」をするように適切に設定されています。しかし、それ以上の操作がなくても、 '_(" text ")' の場合は、遅延文字列を評価しません。 だから私は実際には3つの解決策があります。最高のだろう何 ' U "%s" は%_(テキスト) _(テキスト).__ユニコード__() ugettext(テキスト) ' を?ロギングプロセスの場合、それはugettextに戻るのに違いがありますか?このコードは、例外が発生したときにのみ実行されます... – user6920919

+0

@ user6920919怠惰な機能を必要としない限り_lazyバリアントは使用しません。必要なときにUnicode文字列とgettextが必要なときに 'ugettext'を呼び出します非Unicode文字列です。 – Flimm

関連する問題