6.26.2 Python 拡張の作者と、Python を埋め込むようなプログラムに関して

拡張モジュールは、現在のロケールを調べる以外は、決して setlocale() を呼び出してはなりません。 しかし、返される値もロケールの復帰のために使えるだけなので、 さほど便利とはいえません (例外はおそらくロケールが "C" か どうか調べることでしょう)。

Python があるアプリケーション内に埋め込まれており、アプリケーションが Python を初期化する前にロケールを設定した場合は一般的に問題はありません。 このとき Python は設定されているロケールを使います。ただしLC_NUMERIC ロケールは常に "C" に設定されます。

locale モジュールの関数 setlocale() は、LC_NUMERIC ロケール設定が操作できるような印象を Python プログラマに与えますが、C のレベルではこれは当てはまりません。 C コードでは、常に LC_NUMERIC ロケール設定は "C" になります。これは、小数点文字がピリオド以外の別の文字に変更 された場合にうまく動作しなくなるものがあまりにも多い (例えば Python パーザはうまく動作しません) からです。 補足説明: Python のグローバルインタプリタをロックしないまま 動作するスレッド間では、数値ロケール設定が一致しなくなることが あるかもしれません。 このため、LC_NUMERIC ロケールの設定を実装するための 可搬性のある唯一の方法は、数値ロケールをユーザの希望するロケールに 設定して、直接関係のある値を展開し、最後に "C" 数値ロケールを復帰する ことです。

ロケールを変更するために Python コードで locale モジュール を使った場合、Python を埋め込んでいるアプリケーションにも影響を 及ぼします。Python を埋め込んでいるアプリケーションに影響が及ぶ ことを望まない場合、config.c ファイル内の組み込みモジュールの テーブルから _locale 拡張モジュール (ここで全てを行っています) を削除し、共有ライブラリから _locate モジュールにアクセス できないようにしてください。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。