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

StackOverflow https://stackoverflow.com/questions/140295

Вопрос

Мы используем сторонний продукт промежуточного программного обеспечения, который позволяет нам писать код во встроенном интерпретаторе Python и предоставляет API, к которому мы можем обращаться.Некоторые из этих вызовов API позволяют нам загружать различные типы файлов, а код загрузки реализован на C.Загрузка файла происходит в отдельном потоке и вызывается обратно в Python, когда данные доступны.Пока все хорошо и классно.

Мы обдумывали (хех) наш продукт, и нам хотелось бы отформатировать числовой вывод, ориентированный на пользователя, в соответствии с настройками локали пользователя.Итак, из 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 )

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top