Сортировать коллекцию строк в Python, используя различные настройки локали
Я хочу отсортировать список строк с учетом предпочтений языка пользователя. У меня есть мультиязычное веб-приложение Python, и как правильно сортировать строки таким образом?
Я знаю, что могу настроить локаль, вот так:
import locale
locale.setlocale(locale.LC_ALL, '')
Но это должно быть сделано при запуске приложения (и док говорит, что оно не поточно-ориентированное!), Это хорошая идея, чтобы установить его в каждом потоке в соответствии с текущими настройками пользователя (запроса)?
Я хотел бы что-то вроде функции locale.strcoll (...) с дополнительным параметром - язык, который используется для сортировки.
4 ответа
Другим возможным решением является использование SQL-сервера, который имеет хорошую поддержку локали (к сожалению, sqlite не вариант). Затем я могу поместить все данные во временную таблицу памяти и выбрать их с помощью ORDER BY. IMO это должно быть лучшим решением, чем пытаться распределить настройки локали между несколькими процессами, как рекомендует ответ kaizer.se.
Я бы порекомендовал pyICU - привязки Python для богатой библиотеки интернационализации ICU с открытым исходным кодом IBM. Вы создаете объект Collator, например, с помощью:
collator = PyICU.Collator.createInstance(PyICU.Locale.getFrance())
и затем вы можете отсортировать, например, список строк в кодировке utf-8 по правилам для французского языка, например, используя thelist.sort(cmp=collator.compare)
,
Единственная проблема, с которой я столкнулся, заключалась в том, что я не нашел хорошей, готовой к употреблению версии PyICU плюс ICU для MacOSX - я закончил сборку и установку из источников: собственные источники ICU, 3.6, отсюда - есть бинарные файлы для Windows и несколько Версии Unix есть, но не для Mac; PyICU 0.8.1 отсюда.
Несмотря на эти проблемы сборки / установки и несколько скудные документы для привязок Python, ICU - это действительно находка, если вы выполняете значительный объем работы, связанной с i18n, а PyICU - очень полезный набор привязок к нему!
Вы захотите, чтобы новейшая возможная ICU под вашим pyICU получала самые лучшие и самые свежие данные.
Учитывая предупреждения документации, кажется, что вы сами, если вы пытаетесь установить локаль по-разному в разных потоках.
Если вы можете разделить свою проблему на один поток в каждой локали, разве вы не могли бы разделить ее на один подпроцесс в каждой локали, используя многопроцессорность Python 2.6?
Кажется, все, что решает эту проблему, должно быть хаком, вы даже можете подумать об использовании программы командной строки sort (1)
вызывается с разными LC_ALL для разных языков.