Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
285
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

17.2. gettext — выдача сообщений на родном языке

241

bindtextdomain(domain [, localedir])

Привязывает домен с именем domain к каталогу localedir. В дальнейшем модуль gettext будет искать двоичный файл с переведенными сообщениями с путем os.path.join(localedir, language, ’LC_MESSAGES’, domain +’.mo’). Если аргумент localedir опущен или равен None, возвращает каталог, к которому на данный момент привязан домен domain (по умолчанию используется каталог ‘os.path.join(sys.prefix, ’share’, ’locale’)’).

textdomain([domain])

Если задан и не равен None аргумент domain, возвращает текущий домен, иначе устанавливает глобальный (для всего приложения) домен равным domain и возвращает его.

gettext(message)

Возвращает перевод сообщения message на язык, соответствующий текущим национальным установкам. Поиск перевода производится в базе данных сообщений для текущего домена. Обычно эта функция используется под именем _() в глобальном пространстве имен приложения (см. пример ниже).

dgettext(domain, message)

Работает аналогично функции gettext(), но ищет перевод в базе данных для домена domain.

GNU gettext также определяет функцию dcgettext(), однако она считается бесполезной и поэтому на данный момент не реализована.

Приведем пример типичного использования описанного интерфейса:

import gettext gettext.textdomain(’myapplication’) _ = gettext.gettext

...

# чЩЧПД УФТПЛЙ, РПДМЕЦБЭЕК РЕТЕЧПДХ: print _(’This is a translatable string.’)

...

17.2.2 Интерфейс, основанный на классах

Этот интерфейс предоставляет большие гибкость и удобства, чем интерфейс GNU gettext. Поэтому мы рекомендуем его для использования в модулях и приложениях, написанных на языке Python. Модуль gettext определяет “класс-переводчик”, который реализует чтение ‘.mo’-файлов и предоставляет методы, возвращающие обычные строки или строки Unicode с переводом. Экземпляры этого класса могут установить функцию _() во встроенном пространстве имен.

242

Глава 17.

Средства интернационализации

find(domain [, localedir [, languages]])

 

Эта функция реализует

стандартный алгоритм

поиска ‘.mo’-файлов для до-

мена domain в каталоге localedir для языков, перечисленных в строке languages (по умолчанию используется значение одной из переменных окружения: LANGUAGE, LC_ALL, LC_MESSAGES или LANG). Строка languages (или одна из перечисленных переменных окружения) должна содержать список через двоеточие кодов языков в порядке убывания их приоритета. Функция find() возвращает путь к ‘.mo’-файлу, из которого следует брать перевод сообщения. Если ни один из файлов не найден, возвращает None.

translation(domain [, localedir [, languages [, class_]]])

Catalog(domain [, localedir [, languages [, class_]]])

Возвращает объект, реализующий перевод сообщений. Аргументы domain, localedir и languages передаются функции find() для поиска нужного ‘.mo’- файла. Возвращаемый объект является экземпляром класса class_ (по умолчанию используется GNUTranslations). Конструктор класса вызывается с одним аргументом — файловым объектом, реализующим доступ к ‘.mo’-файлу. Если ‘.mo’- файл не найден, генерируется исключение IOError. Функция translation() кэширует созданные объекты и использует их при повторных запросах объекта для того же ‘.mo’-файла.

Имя Catalog() определено для совместимости с версией модуля gettext, которую использует GNOME.

install(domain [, localedir [, unicode]])

Эквивалентно вызову ‘translation(domain, localedir).install(unicode)’. Эта функция предоставляет самый простой способ установить функцию _(), реализующую перевод сообщений. Для удобства _() устанавливается в пространство встроенных имен и, таким образом, доступна во всех модулях, используемых приложением.

Ниже описаны классы, непосредственно реализующие перевод строк сообще-

ний.

NullTranslations([fp])

Этот класс реализует основной интерфейс, и используется в качестве базового класса для остальных классов-переводчиков. При инициализации устанавливает “защищенные” атрибуты _info и _charset созданного экземпляра равными None и, если задан и не равен None аргумент fp, вызывает метод _parse(fp), который должен быть переопределен в производных классах.

Экземпляры NullTranslations имеют следующие методы:

_parse(fp)

Ничего не делает в базовом классе. В производных классах этот метод должен считывать данные из файла, представленного файловым объектом fp, и инициализировать каталог сообщений экземпляра.

17.2. gettext — выдача сообщений на родном языке

243

gettext(message)

В базовом классе возвращает сообщение message без изменений. В производных классах должен возвращать перевод сообщения.

ugettext(message)

В базовом классе возвращает сообщение message в виде строки Unicode. В производных классах должен возвращать перевод сообщения в виде строки Unicode.

info()

Возвращает значение “защищенного” атрибута _info (метаданные каталога в виде словаря).

charset()

Возвращает значение “защищенного” атрибута _charset (кодировка перевода сообщений в каталоге).

install([unicode])

Если аргумент unicode опущен или является ложью, устанавливает собственный метод gettext() в пространство встроенных имен под именем _(), в противном случае устанавливает собственный метод ugettext().

Заметим, что функция в пространстве встроенных имен становится доступной во всех модулях приложения. Сами модули никогда не должны использовать это метод. Чтобы обеспечить корректную работу модуля в тех случаях, когда импортирующее его приложение не устанавливает функцию _() в пространство встроенных имен, следует в начале модуля поместить примерно следующий код:

def gettext(message): return message

import __builtin__

if hasattr(__builtin__, ’ps1’):

# йУРПМШЪХЕФУС ЙОФЕТБЛФЙЧОЩК ТЕЦЙН _ = gettext

elif not hasattr(__builtin__, ’_’): __builtin__._ = gettext

Это также позволит обеспечить корректную работу (без перевода сообщений) при импортировании модуля в интерактивном режиме.

Модуль gettext также определяет класс GNUTranslations, производный от NullTranslations. Этот класс переопределяет метод _parse(), обеспечивая чтение ‘.mo’-файлов в формате GNU gettext (как big-endian, так и little-endian). Он также анализирует метаданные каталога и сохраняет их в “защищенном” атрибуте экземпляра _info. Если каталог содержит запись с ключом ’Content-Type’, то указанная в ней кодировка сохраняется в “защищенном” атрибуте _charset.

Если ‘.mo’ оказывается поврежденным, при инициализации экземпляра GNUTranslations будет сгенерировано исключение IOError.

244

Глава 17. Средства интернационализации

Класс

GNUTranslations также переопределяет методы gettext() и

ugettext(). Последний передает атрибут _charset встроенной функции unicode() для получения строки Unicode.

ОС Solaris определяет собственный формат ‘.mo’-файлов, который в настоящее время не поддерживается.

17.2.3Изготовление каталога переведенных сообщений

Для того, чтобы подготовить код на языке Python к интернационализации, необходимо взглянуть на строки в Вашем файле. Все строки, подлежащие переводу, должны быть записаны литерально и использоваться в качестве аргумента функции _(). Например:

filename = ’mylog.txt’

message = _(’writing a log message’)

fp = open(filename, ’w’) fp.write(message) fp.close()

Здесь строка ’writing a log message’ помечена как подлежащая переводу, в то время как ’mylog.txt’ и ’w’ — нет.

В стандартную поставку Python включена утилита pygettext, которая извлекает строки, подлежащие переводу, из файла с исходным кодом и помещает их в ‘.pot’-файл4. Именно с этим файлом работает человек, выполняющий перевод. С помощью утилит пакета GNU gettext Вы можете изготовить ‘.mo’-файл, который читается экземплярами класса GNUTranslations.

4Аналогичную работу выполняет программа xpot, доступная в пакете po-utils по адресу http://www.iro.umontreal.ca/contrib/po-utils/HTML.

245

Глава 18

Математический аппарат

Модули, описанные в этой главе, позволяют выполнять основные математические операции. Если Вас интересуют многомерные массивы и функции линейной алгебры, взгляните на пакет модулей “Numerical Python” (NumPy), доступный по адресу http://numpy.sourceforge.net/.

math Математические функции для работы с вещественными числами. cmath Математические функции для работы с комплексными числами. random Генерация псевдослучайных чисел с различными распределениями. whrandom Генератор псевдослучайных чисел.

bisect Поддержание последовательностей в сортированном состоянии. Реализует алгоритм поиска путем деления пополам.

array Эффективные массивы чисел одинакового типа.

18.1math — математические функции для работы с вещественными числами

Модуль math всегда доступен и предоставляет доступ к стандартным математическим функциям. Эти функции не работают с комплексными числами — для этого следует использовать одноименные функции из модуля cmath.

acos(x)

Возвращает арккосинус x.

asin(x)

Возвращает арксинус x.

atan(x)

Возвращает арктангенс x.

atan2(x, y)

Эквивалентно atan(x/y). Аргумент y может быть равен 0 — в этом случае возвращает pi/2.

246

Глава 18. Математический аппарат

ceil(x)

Возвращает наименьшее вещественное число с нулевой дробной частью большее, чем x.

cos(x)

Возвращает косинус x.

cosh(x)

Возвращает гиперболический косинус x.

exp(x)

Возвращает e**x.

fabs(x)

Возвращает абсолютное значение x.

floor(x)

Возвращает наибольшее вещественное число с нулевой дробной частью меньшее, чем x.

fmod(x, y)

Результат этой функции зависит от реализации одноименной функции библиотеки языка C. Обычно дает такой же результат, как x % y.

frexp(x)

Возвращает пару ‘(m, e)’, где m — мантисса (вещественное число) и e — экспоненциальная часть (целое число). Для чисел m и e всегда выполняется условие ‘x == m * 2**e’. Если аргумент x равен нулю, возвращает ‘(0.0, 0)’. В противном случае всегда выполняется ‘0.5 <= abs(m) < 1’.

hypot(x, y)

Возвращает евклидово кодовое расстояние, ‘sqrt(x*x + y*y)’.

ldexp(m, e)

Функция, обратная frexp(). Возвращает ‘m * (2**e)’.

log(x)

Возвращает натуральный логарифм x.

log10(x)

Возвращает десятичный логарифм x.

modf(x)

Возвращает кортеж из пары вещественных чисел — дробной и целой части x. Оба возвращаемых числа имеют такой же знак, как у числа x.

pow(x, y)

Возвращает x**y.

sin(x)

Возвращает синус x.

18.2. cmath — математические функции для работы с . . .

247

sinh(x)

Возвращает гиперболический синус x.

sqrt(x)

Возвращает квадратный корень из x.

tan(x)

Возвращает тангенс x.

tanh(x)

Возвращает гиперболический тангенс x.

Обратите внимание, что функции frexp() и modf() имеют другой интерфейс, нежели их эквиваленты в языке C: они возвращают пару значений вместо того, чтобы возвращать второе значение через аргумент.

Модуль также определяет две константы:

pi

Число .

e

Число e.

18.2cmath — математические функции для работы с комплексными числами

Модуль cmath всегда доступен и предоставляет доступ к математическим функциям, работающими с комплексными числами.

acos(x)

Возвращает арккосинус x.

acosh(x)

Возвращает гиперболический арккосинус x.

asin(x)

Возвращает арксинус x.

asinh(x)

Возвращает гиперболический арксинус x.

atan(x)

Возвращает арктангенс x.

248

Глава 18. Математический аппарат

atanh(x)

Возвращает гиперболический арктангенс x.

cos(x)

Возвращает косинус x.

cosh(x)

Возвращает гиперболический косинус x.

exp(x)

Возвращает e**x.

log(x)

Возвращает натуральный логарифм x.

log10(x)

Возвращает десятичный логарифм x.

sin(x)

Возвращает синус x.

sinh(x)

Возвращает гиперболический синус x.

sqrt(x)

Возвращает квадратный корень из x.

tan(x)

Возвращает тангенс x.

tanh(x)

Возвращает гиперболический тангенс x.

Обратите внимание, что функции frexp() и modf() имеют другой интерфейс, нежели их эквиваленты в языке C: они возвращают пару значений вместо того, чтобы возвращать второе значение через аргумент.

Модуль также определяет две константы:

pi

Число (вещественное).

e

Число e (вещественное).

Заметим, что эти функции похожи, но не идентичны одноименным функциям в модуле math. Различия проявляются даже при использовании вещественных аргументов. Например, math.sqrt(-1) генерирует исключение, в то время как cmath.sqrt(-1) возвращает 1j. Кроме того, функции модуля cmath всегда возвращают комплексное число, даже если оно может быть выражено в рамках вещественного (в этом случае число имеет нулевую мнимую часть).

18.3. random — псевдослучайные числа с различными . . .

249

18.3random — псевдослучайные числа с различными распределениями

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

betavariate(alpha, beta)

Бета-распределение. Оба аргумента должны быть больше 1, возвращает значение между 0 и 1.

cunifvariate(mean, arc)

Циклическое равномерное распределение. mean — средний угол, arc — ширина диапазона. Оба аргумента должны быть в диапазоне от 0 до . Возвращаемое значение находятся в диапазоне от mean - arc/2 до mean + arc/2 (также приводится к диапазону от 0 до ).

expovariate(lambda)

Экспоненциальное распределение. Аргумент lambda равен единице, деленной на желаемое математическое ожидание распределения. Возвращает значения от 0 до

+1.

gamma(alpha, beta)

Гамма-распределение. Аргументы должны удовлетворять условиям alpha > -1 и beta > 0.

gauss(mu, sigma)

normalvariate(mu, sigma)

Нормальное распределение (Гаусса). mu — математическое ожидание и sigma — стандартное отклонение. Функция gauss() имеет немного более быструю реализацию.

lognormvariate(mu, sigma)

Логарифмически нормальное распределение. Натуральный логарифм от значений, возвращаемых этой функцией, дает нормальное распределение с математическим ожидание mu и стандартным отклонением sigma. mu может иметь любое значения, sigma должен быть больше нуля.

vonmisesvariate(mu, kappa)

Распределение фон Мизеса. mu — математическое ожидание, выраженное в радианах от 0 до 2 , kappa — коэффициент кучности, который должен быть больше или равен нулю. Если аргумент kappa равен нулю, это распределение вырождается в равномерное распределение в диапазоне от 0 до 2 .

paretovariate(alpha)

Распределение Парето. alpha — параметр формы распределения.

250

Глава 18. Математический аппарат

weibullvariate(alpha, beta)

Распределение Вейбулла. alpha — масштабный коэффициент, beta — параметр формы распределения.

Для удобства модуль random также экспортирует имена random(), uniform(), randrange(), randint() и choice() из модуля whrandom и переопределяет seed():

seed([obj])

Инициализирует генератор случайных чисел хэш-значением объекта obj. Если аргумент obj опущен или равен None, использует для инициализации текущее время (аналогично whrandom.seed()).

18.4 whrandom — генератор псевдослучайных чисел

Этот модуль определяет класс whrandom, реализующий генератор псевдослучайных чисел Вичмана-Хилла1:

whrandom([x, y, z])

Создает, инициализирует, вызывая метод seed(), и возвращает объект-генератор.

Экземпляры класса whrandom имеют следующие методы:

seed([x, y, z])

Инициализирует генератор целыми числами x, y и z. Числа должны быть в диапазоне от 0 до 255 (включительно). Если аргументы опущены или равны нулю, используются значения, производные от текущего времени. Если один или два аргумента равны нулю, нулевые значения заменяются единицей.

random()

Возвращает случайное вещественное число r такое, что 0.0 <= r < 1.0.

uniform(a, b)

Возвращает случайное вещественное число r такое, что a <= r < b.

randrange([start,] stop [, step])

Возвращает случайное целое число из ‘range(start, stop, step)’.

randint(a, b)

Возвращает случайное целое число из ‘range(a, b +1)’. Этот метод оставлен лишь для совместимости со старыми версиями модуля — используйте randrange().

1Wichmann, B. A. and Hill, I. D., “Algorithm AS 183: An efficient and portable pseudo-random number generator”, URL 31 (1982) 188–190.