6

Mercurial では、多くの拡張機能がヘルプ/構文文字列をアンダースコア関数の呼び出しにラップします。次のようにします。

 _('[OPTION] [QUEUE]')

これは私を混乱させます。なぜなら、それは必要ではないようで (拡張機能の記述の説明では言及されていません)、クラスに _ が定義されていないように見えるからです。ラムダの別の言い方か、恒等関数のことか。さらに、ドキュメントが示唆するような生の文字列だけに比べて、この方法論 (それが何であれ) の利点は何なのか疑問に思っています。

私が見た Python ドキュメントでそのような関数について言及しているものは何もないので、これが本当に Python に関する質問なのか、それとも Mercurial に関する質問なのかはわかりません。

この構造を使用する 2 つの例を次に示します (cmdtableファイルの下部にある辞書を参照してください)。

4

2 に答える 2

8

45 行目を見てください。

from mercurial.i18n import _

これは、国際化パッケージgettextでの通常の省略形であり、おそらく他のパッケージでも、現在プログラムが実行されている言語への引数の翻訳を返す関数です。_ほぼすべての言語で使用されるため、便宜上 と省略されていますユーザーに表示されるメッセージ。

Mercurial はそれを独自のモジュールにラップしているようです。(「i18n」は「国際化」の略で、「i」と「n」の間に 18 文字あるためです。)

于 2010-06-19T21:08:05.847 に答える
7

_gettext(単一のアンダースコアの関数名)は、Pythonの標準ライブラリ(同じアーキテクチャ、完全に異なる実装)でも場所を見つけたGNUアプローチの先例により、国際化に関連付けられることがよくあります-モジュールのドキュメントに従って、

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])

これにより_()、関数 translation() に渡される domain、localedir、および codeset に基づいて、関数が Python の builtins 名前空間にインストールされます。Unicode フラグは、結果の翻訳オブジェクトの install() メソッドに渡されます。

names パラメータについては、翻訳オブジェクトの install() メソッドの説明を参照してください。

_() 以下に示すように、通常は、次のように関数の呼び出しでラップすることにより、アプリケーション内の翻訳候補の文字列をマークします。

print _('This string will be translated.') 

便宜上、_()関数を Python の builtins 名前空間にインストールして、アプリケーションのすべてのモジュールで簡単にアクセスできるようにします。

@ptomato が言及しているように、Mercurial はこの伝統に従って_、同じ国際化の目的で使用する独自の同等の関数に名前を付けています。

_次のように、「I don't care」識別子として使用する別の伝統もあります。

fee, fie, _, _, foo, _, fum = thesevenitemstuple

しかしもちろん、同じコードで両方の伝統を同時に使用しないほうがよいでしょう;-)

于 2010-06-19T21:21:35.813 に答える