Сортировать коллекцию строк в Python, используя различные настройки локали - PullRequest
4 голосов
/ 06 октября 2009

Я хочу отсортировать список строк в соответствии с предпочтениями языка пользователя. У меня есть мультиязычное веб-приложение Python, и как правильно сортировать строки таким образом?

Я знаю, что могу настроить локаль, вот так:

import locale
locale.setlocale(locale.LC_ALL, '')

Но это должно быть сделано при запуске приложения (и док говорит, что это не потокобезопасно!), Это хорошая идея, чтобы установить его в каждом потоке в соответствии с настройками текущего пользователя (запроса)?

Я бы хотел что-то вроде функции locale.strcoll (...) с дополнительным параметром - языком, который используется для сортировки.

Ответы [ 4 ]

4 голосов
/ 06 октября 2009

Я бы порекомендовал pyICU - привязки Python для богатой открытой библиотеки IBM ICU с открытым исходным кодом. Вы делаете объект 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 - очень полезный набор привязок к ней!

1 голос
/ 08 октября 2009

Вы захотите, чтобы новейшая возможная ICU под вашим pyICU получала самые лучшие и самые свежие данные.

0 голосов
/ 09 октября 2009

Другим возможным решением является использование SQL-сервера, который имеет хорошую поддержку локали (к сожалению, sqlite не вариант). Затем я могу поместить все данные во временную таблицу памяти и выбрать их с помощью ORDER BY. ИМО, это должно быть лучшим решением, чем пытаться распространять настройки локали на несколько процессов, как рекомендует ответ kaizer.se.

0 голосов
/ 06 октября 2009

Учитывая предупреждения документации, кажется, что вы сами, если вы пытаетесь установить локаль по-разному в разных потоках.

Если вы можете разделить вашу проблему на один поток в каждой локали, разве вы не могли бы разделить ее на один подпроцесс в каждой локали, используя многопроцессорную обработку Python 2.6?

Кажется, все, что решает эту проблему, должно быть хаком, вы даже можете подумать об использовании программы командной строки sort (1), вызываемой с разными LC_ALL для разных языков.

...