Мы используем сторонний промежуточный продукт, который позволяет нам писать код во встроенном интерпретаторе Python и который предоставляет API, к которому мы можем обращаться. Некоторые из этих вызовов API позволяют нам загружать различные типы файлов, а код загрузки реализован на языке C. Загрузка файлов происходит в отдельном потоке, и при наличии данных происходит обратный вызов в Python. Пока все хорошо и модно.
Мы использовали i14ing (хех) для нашего продукта, и нам хотелось бы отформатировать числовой вывод, ориентированный на пользователя, в соответствии с настройками языкового стандарта пользователя. Итак, из 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 )
Это кажется немного неуклюжим, и мне было интересно, является ли это обычным подходом к форматированию вывода с учетом локали для пользователя? Моя другая проблема заключается в том, что это, очевидно, не является потокобезопасным, поэтому, по-видимому, мы по-прежнему будем сталкиваться с проблемами, если при изменении локали какой-либо файл будет выполняться в отдельном потоке.
Любая информация о наилучшей практике приветствуется - у меня нет большого опыта в подобных вещах.