Использование locale.setlocale во встроенном Python без нарушения синтаксического анализа файла в потоке C

Мы используем сторонний промежуточный программный продукт, который позволяет нам писать код во встроенном интерпретаторе 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 )

Это кажется немного неуклюжим, и мне было интересно, является ли это распространенным подходом к форматированию вывода с учетом локали для пользователя? Другая моя проблема заключается в том, что это, очевидно, не потокобезопасно, поэтому мы, по-видимому, по-прежнему будем получать проблемы, если какой-либо синтаксический анализ файла будет происходить в отдельном потоке при изменении локали.

Приветствуется любая информация о передовой практике - у меня нет большого опыта в подобных вещах.


person kranzky    schedule 26.09.2008    source источник
comment
Я не уверен, что понимаю, в чем проблема. Как именно языковой стандарт пользователя влияет на способность ваших приложений загружать файлы? Как вы конвертируете строку в число с плавающей запятой в C?   -  person nosklo    schedule 27.09.2008
comment
Извините, что я никогда не видел ваш комментарий; установка локали с помощью LC_ALL влияет на strtof() и так далее, поэтому число 10.0 может быть интерпретировано, например, как 100.   -  person kranzky    schedule 25.11.2008


Ответы (1)


Установка локали после запуска нескольких потоков может привести к неожиданным результатам. Если бы я не смог придумать более тонкий подход, я бы, вероятно, просто разделил загрузку файлов и пользовательский интерфейс на отдельные процессы, взаимодействующие через канал или файловый сокет.

person Logan    schedule 27.09.2008
comment
Да, и мы, очевидно, не можем установить локаль до того, как потоки начнут работать, так как это меняет то, как они обрабатывают данные, загружаемые из файлов. Кажется, для нас нет решения, кроме написания собственного кода для отображения пользователю правильно отформатированных чисел. Спасибо, в любом случае! - person kranzky; 27.09.2008