私たちは組み込みPythonインタプリタでコードを書くことができ、呼び出し可能なAPIを公開するサードパーティのミドルウェア製品を使用しています。これらのAPI呼び出しの中には、さまざまな種類のファイルを読み込むことができ、読み込みコードはCで実装されています。ファイル読み込みは別のスレッドで行われ、データが利用可能なときにPythonにコールバックします。これまでのところ、すべてうまくやっている。埋め込みPythonでのlocale.setlocaleの使用Cのスレッドでのファイル解析を中断することなく
私たちは私たちの製品をi14しています。ユーザーのロケール設定に応じて、ユーザーに面する数値出力をフォーマットします。だから、Pythonのから、我々は次の操作を行います。
import locale
locale.setLocale(locale.LC_ALL, '')
は今、これは(そのユーザ向けの数字はそのロケールに対して正しくフォーマットされている中で)動作します。ただし、ユーザーのロケールがデフォルトのCロケールと異なる場合、後でロードされるファイルはすべて誤ったデータを返します。おそらく、すべての文字列から浮動小数点への変換が金属の影響を受けていると考えられます。
ロケール対応のファイル読み込みを実装することでこの問題を回避することはできません。そのため、現時点での回避策は、ユーザーの出力をフォーマットするときだけロケールを設定してから、再度設定することです。それは、のようなものです:
import locale
currentLocale = locale.getLocale(locale.LC_ALL)
locale.setLocale(locale.LC_ALL, '')
displayNumbersToTheUser()
locale.setlocale(locale.LC_ALL, currentLocale)
これは少し不格好ようだ、と私は、これはユーザーのロケール対応の出力をフォーマットする一般的なアプローチであるかどうか不思議でしたか?私の他の懸念事項は、これは明らかにスレッドセーフではないということです。したがって、ロケールが変更されたときに別のスレッドでファイルの解析が行われると、おそらく問題は発生します。
ベストプラクティスについての情報は高く評価されています。私はこの種のことに関して多くの経験がありません。
私は何が問題なのか分かりません。ユーザーのロケールがファイルをロードするアプリケーションの機能にどの程度忠実であるかどのようにCで文字列を浮動小数点に変換していますか? – nosklo
申し訳ありませんが、あなたのコメントは見たことがありません。ロケールをLC_ALLで設定するとstrtof()などに影響しますので、数字「10.0」は「100」と解釈されます。 – kranzky