C 標準では、ロケールはプログラム全体にわたる特性であり、その変更は 高価な処理であるとしています。加えて、頻繁にロケールを変更する ようなひどい実装はコアダンプを引き起こすこともあります。 このことがロケールを正しく利用する上で苦痛となっています。
そもそも、プログラムが起動した際、ロケールはユーザの希望するロケール
にかかわらず "C" です。プログラムは
setlocale(LC_ALL, '')
を呼び出して、明示的にユーザの希望する
ロケール設定を行わなければなりません。
setlocale() をライブラリルーチン内で呼ぶことは、 それがプログラム全体に及ぼす副作用の面から、一般的によくない考えです。 ロケールを保存したり復帰したりするのもよくありません: 高価な処理 であり、ロケールの設定が復帰する以前に起動してしまった他のスレッド に悪影響を及ぼすからです。
もし、汎用を目的としたモジュールを作っていて、ロケールによって 影響をうけるような操作 (例えば string.lower() や time.strftime() の書式の一部) のロケール独立の バージョンが必要ということになれば、標準ライブラリルーチンを 使わずに何とかしなければなりません。よりましな方法は、ロケール設定が 正しく利用できているか確かめることです。最後の手段は、 あなたのモジュールが "C" ロケール以外の設定には互換性がない とドキュメントに書くことです。
string モジュールの大小文字の変換を
行う関数はロケール設定によって影響を受けます。setlocale()
関数を呼んで LC_CTYPE 設定を変更した場合、変数
string.lowercase
、string.uppercase
および
string.letters
は計算しなおされます。
例えば from string import letters
のように、
`from ... import ...' を使ってこれらの変数を
使っている場合には、それ以降の setlocale() の影響を
受けないので注意してください。
ロケールに従って数値操作を行うための唯一の方法はこのモジュールで 特別に定義されている関数: atof()、 atoi()、 format()、 str() を使うことです。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。