Мы используем сторонний продукт промежуточного программного обеспечения, который позволяет нам писать код во встроенном интерпретаторе Python и который предоставляет API, на который мы можем позвонить. Некоторые из этих вызовов API позволяют нам загружать различные типы файлов, а код загрузки реализован в C. Загрузка файлов происходит в отдельном потоке и пересылается обратно на Python, когда данные доступны. Пока все хорошо и денди.Использование locale.setlocale во встроенном Python без разбора синтаксического анализа в потоке C
Мы были i14ing (heh) нашим продуктом, и одна вещь, которую мы хотели бы сделать, - форматировать числовой вывод, обращенный к пользователю, в соответствии с настройками локали пользователя. Таким образом, с 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)
Это кажется немного неуклюжим, и мне было интересно, является ли общий подход к форматированию локализованную знают выход для пользователя? Моя другая проблема заключается в том, что это, очевидно, не является потокобезопасным, поэтому мы, вероятно, все еще будем сталкиваться с проблемами, если какой-либо анализ файлов происходит в отдельном потоке при изменении локали.
Любая информация о передовой практике оценена - у меня нет большого опыта в таких вещах.
Я не уверен, что понимаю, в чем проблема. Как именно пользовательский язык привязан к вашим приложениям для загрузки файлов? Как вы преобразовываете строку в float в C? – nosklo
Извините, что я никогда не видел вашего комментария; установка локали с LC_ALL влияет на strtof() и т. д., поэтому число «10.0» может быть интерпретировано, например, как «100». – kranzky