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

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

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

16.3. StringIO и cStringIO — работа со строками как с . . .

231

\g<name>’) аналогично методу sub() и возвращает результат. Этот метод доступен, начиная с версии 2.0.

pos

Значение аргумента pos, переданного функции (методу) search() или match().

endpos

Значение аргумента endpos, переданного функции (методу) search() или match().

lastgroup

Имя последней удовлетворенной группы (наиболее охватывающей) или None, если эта группа не имеет имени или не была удовлетворена ни одна группа. Например:

>>>import re

>>>re.match(’(?P<g1>a)(?P<g2>b(?P<g3>c))’,

... ’abc’).lastgroup ’g2’

lastindex

Номер последней удовлетворенной группы (наиболее охватывающей) или None, если не была удовлетворена ни одна группа. Например:

>>>import re

>>>re.match(’(?P<g1>a)(?P<g2>b(?P<g3>c))’,

... ’abc’).lastindex 2

re

Объект компилированного регулярного выражения, который использовался для выполнения операции поиска или сопоставления.

string

Значение аргумента string, переданного функции (методу) search() или match().

16.3StringIO и cStringIO — работа со строками как с файловыми объектами

Модуль StringIO реализует класс StringIO, экземпляры которого ведут себя аналогично файловым объектам, но работает не с реальным файлом, а со строковым буфером. Модуль cStringIO, реализованный на C (и поэтому более быстрый), предоставляет аналогичный интерфейс, за исключением того, что вместо класса он определяет функцию-конструктор StringIO(). Объекты, возвращаемые этой функцией, ведут себя аналогично экземплярам класса StringIO.

232

Глава 16. Работа со строками

Экземпляры класса StringIO поддерживают как обычные строки, так и строки Unicode. Однако следует быть осторожным при использовании одновременно обоих типов — если обычная строка содержит символы с установленным восьмым битом, методы write() и close() могут сгенерировать исключение UnicodeError. Объекты, созданные конструктором cStringIO.StringIO() поддерживают только обычные строки: строки Unicode, передаваемые методу write(), автоматически преобразуются и, если это невозможно, генерируется исключение UnicodeError.

StringIO([string])

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

Конструктор StringIO(), определенный в модуле cStringIO возвращает объекты разного типа в зависимости от наличия аргумента. В случае, если конструктор вызван с аргументом (должен быть обычной строкой, иначе будет сгенерировано исключение ValueError), Вы можете только читать информацию из созданного строкового буфера. При вызове без аргументов возвращаемый объект допускает как чтение, так и запись.

InputType (в модуле cStringIO)

Тип объекта, созданного вызовом функции cStringIO.StringIO() со строкой в качестве аргумента.

OutputType (в модуле cStringIO)

Тип объекта, созданного вызовом функции cStringIO.StringIO() без аргументов.

Объекты, возвращаемые конструктором StringIO() поддерживают операции, характерные для файловых объектов, а также имеют дополнительный метод:

getvalue()

Возвращает содержимое буфера в виде строки. Этот метод может быть вызван в любое время, до того как буфер был закрыт с помощью метода close().

16.4codecs — регистрация кодеров и работа с ними

Доступен, начиная с версии 1.6.

Этот модуль определяет базовые классы для кодеров и предоставляет доступ к внутреннему реестру кодеров.

16.4. codecs — регистрация кодеров и работа с ними

233

register(search_function)

Регистрирует search_function как функцию для поиска кодеров. Функция search_function вызывается с одним аргументом — именем кодировки, записанной строчными буквами, и должна возвращать кортеж объектов, поддерживающих вызов, ‘(encoder, decoder, stream_reader, stream_writer)’. encoder и decoder должны иметь интерфейс, аналогичный методам encode() и decode() экземпляров класса Codec, описанного ниже. stream_reader и stream_writer должны быть конструкторами, возвращающими объекты аналогичные экземплярам классов StreamReader и StreamWriter соответственно. Если search_function не может найти объекты для данной кодировки, она должна вернуть None.

lookup(encoding)

Ищет в реестре кодеров средства работы с кодировкой encoding и возвращает кортеж объектов ‘(encoder, decoder, stream_reader, stream_writer)’, описанный выше. Если объекты для данной кодировки не найдены, генерируется исключение LookupError.

Для упрощения работы с файлами и другими потоками, содержащими данные в определенной кодировке, модуль определяет следующие функции:

open(filename [, mode [, encoding [, errors [, buffering]]]])

Открывает файл с именем filename в кодировке encoding и возвращает файловый объект (экземпляр класса StreamReaderWriter, описанного ниже), обеспечивающий прозрачное кодирование/декодирование данных при записи/чтении. Аргумент mode указывает режим, в котором открывается файл (по умолчанию используется ’rb’). Во избежание потери данных файл всегда открывается в двоичном режиме. Аргумент errors определяет поведение при ошибках и может иметь значения ’strict’ (в случае возникновения ошибки генерируется исключение ValueError или производного от него класса; используется по умолчанию), ’ignore’ (ошибки игнорируются) или ’replace’ (используется подходящий символ замены, обычно ’\uFFFD’). Аргумент buffering имеет такое же значение, как и для встроенной функции open().

EncodedFile(file, input [, output, [errors]])

Возвращает файловый объект (экземпляр класса StreamRecoder, описанного ниже), обеспечивающий прозрачное перекодирование при работе с потоком file (файловый объект). Данные в файле хранятся в кодировке output, в то время как строки передаваемые методам write() и writelines() и возвращаемые методами read(), readline() и readlines() содержат данные в кодировке input. В качестве промежуточной кодировки обычно используется Unicode. Если кодировка output не задана, она считается равной input. Аргумент errors имеет такое же значение, как и для функции open().

234

Глава 16. Работа со строками

Модуль определяет следующие классы, которые могут быть использованы в качестве базовых:

Codec()

Базовый класс для кодеров/декодеров. Производные от него классы должны реализовать следующие методы:

encode(input [, errors])

Должен возвращать кортеж из строки, полученной при кодировании input, и количества обработанных символов.

decode(input [, errors])

Должен возвращать кортеж из строки, полученной при раскодировании input, и количества обработанных символов.

StreamWriter(stream [, errors])

Базовый класс для файловых объектов, обеспечивающих прозрачное кодирование данных при записи его в поток stream. Этот класс является производным от класса Codec и использует для кодирования свой метод encode(), который должен быть переопределен в производном классе.

StreamReader(stream [, errors])

Базовый класс для файловых объектов, обеспечивающих прозрачное декодирование данных при чтении их из потока stream. Этот класс является производным от класса Codec и использует для декодирования свой метод decode(), который должен быть переопределен в производном классе.

Для упрощения реализации методов encode() и decode() классов, производных от Codec, могут быть полезны следующие функции:

charmap_encode(input, errors, encoding_map)

Кодирует строку input, используя отображение кодов символов encoding_map. Возвращает результат в том виде, в котором должен возвращать метод encode().

charmap_decode(input, errors, encoding_map)

Декодирует строку input, используя отображение кодов символов encoding_map. Возвращает результат в том виде, в котором должен возвращать метод decode().

Хорошими примерами использования описанных выше классов могут служить исходные тексты модулей пакета encodings.

Экземпляры приведенных ниже классов возвращаются функциями open() и EncodedFile():

StreamReaderWriter(stream, Reader, Writer [, errors])

Создает файловый объект, обеспечивающий доступ на чтение с кодированием (через объект Reader(stream, errors)) и запись с декодированием (через объект

Writer(stream, errors)) к потоку stream.

16.4. codecs — регистрация кодеров и работа с ними

235

StreamRecoder(stream, encode, decode, Reader, Writer

[, errors])

Экземпляры этого класса обеспечивают прозрачное перекодирование при работе с потоком file (файловый объект). Данные в файле хранятся в кодировке output, в то время как строки передаваемые методам write() и writelines() и возвращаемые методами read(), readline() и readlines() содержат данные в кодировке input.

Следующие константы могут быть полезны при чтении и записи файлов, формат которых зависит от платформы:

BOM BOM_BE BOM_LE BOM32_BE BOM32_LE BOM64_BE BOM64_LE

Эти константы определяют метки, которые используются для обозначения порядка следования байтов (byte order mark, BOM). Константа BOM равна BOM_BE или BOM_LE и определяет “родной” порядок следования для данной платформы. Суффиксы ‘_BE’ и ‘_LE’ обозначают соответственно big-endian и little-endian.

236

Глава 17

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

Средства, описанные в этой главе, позволяют писать программы, учитывающие национальные установки пользователя.

locale Использование национальных особенностей.

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

17.1locale — использование национальных особенностей

Модуль locale позволяет работать с различными языками, не зная национальных и культурных особенностей каждой страны. Изначально система использует стандартные национальные установки (с именем ’C’).

Error

Исключения этого класса генерируются функцией setlocale(), если установки не могут быть изменены.

setlocale(category [, locale])

Если задан аргумент locale, изменяет текущие национальные установки категории category. Аргумент locale является именем, характеризующим национальную принадлежность (locale). Если аргумент locale равен пустой строке, используются пользовательские установки по умолчанию. Начиная с версии 2.0, Вы можете использовать в качестве locale кортеж из двух строк: кода языка и кодировки. В случае успешного изменения установок, возвращает новое имя, в противном случае генерирует исключение Error.

Если аргумент locale опущен или равен None, возвращает текущие установки для категории category.

На большинстве платформ использование функции setlocale() небезопасно в многопоточных программах. Обычно приложения начинаются со следующих строк:

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

Это позволяет использовать пользовательские установки по умолчанию для всех

17.1. locale — использование национальных особенностей

237

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

localeconv()

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

’decimal_point’

 

(категория LC_NUMERIC)

Символ, используемый в качестве десятичной точки.

 

’grouping’

 

 

(категория LC_NUMERIC)

Список

чисел,

указывающих, в каких относительных пози-

циях

ожидается

использование

группирующего

разделителя

localeconv()[’thousands_sep’]. Если последовательность заканчивается символом CHAR_MAX, разделитель далее не используется. Если последовательность заканчивается нулем, далее повторно используется последний размер группы .

’thousands_sep’

(категория LC_NUMERIC)

Символ, используемый в качестве разделителя между группами.

’int_curr_symbol’

(категория LC_MONETARY)

Международное обозначение национальной валюты (в соответствии со стан-

дартом ISO 4217).

 

’currency_symbol’

(категория LC_MONETARY)

Местное обозначение национальной валюты.

 

’mon_decimal_point’

(категория LC_MONETARY)

Символ, используемый в качестве десятичной точки в денежных суммах.

’mon_grouping’

(категория LC_MONETARY)

Имеет такой же формат, как и localeconv()[’grouping’]. Используется

для денежных сумм.

 

’mon_thousands_sep’

(категория LC_MONETARY)

Символ, используемый в качестве разделителя между группами в денежных

суммах.

 

’positive_sign’

(категория LC_MONETARY)

’negative_sign’

(категория LC_MONETARY)

Символы, используемые для обозначения положительных и отрицательных

денежных сумм.

 

’int_frac_digits’

(категория LC_MONETARY)

’rac_digits’

(категория LC_MONETARY)

Число цифр после десятичной точки для международных и местных сумм.

’p_cs_precedes’

(категория LC_MONETARY)

’n_cs_precedes’

(категория LC_MONETARY)

0, если символ валюты указывается после суммы, и 1, если символ валюты

1В ОС Windows используются разные кодировки для консольных и графических приложений, для русского языка это cp866 и Unicode. Однако установки по умолчанию подразумевают кодировку, которая использовалась в старых версиях Windows в графическом режиме — cp1251. Поэтому использование национальных установок по умолчанию в Windows, к сожалению, не имеет смысла.

238

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

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

сумм соответственно.

 

’p_sep_by_space’

(категория LC_MONETARY)

’n_sep_by_space’

(категория LC_MONETARY)

1, если сумма и символ валюты должны быть разделены пробелом, иначе 0,

для положительных и отрицательных денежных сумм соответственно.

’p_sign_posn’

(категория LC_MONETARY)

’n_sign_posn’

(категория LC_MONETARY)

Указывает, в каком формате должна быть выведена денежная сумма со знаком (соответственно положительным и отрицательным): 0 — сумма и символ валюты заключаются в скобки, 1 — знак указывается перед суммой и символом валюты, 2 — после суммы и символа валюты, 3 — непосредственно перед символом валюты, 4 — непосредственно после символа валюты и CHAR_MAX — формат не установлен.

CHAR_MAX

Символическая константа, обычно используется в словаре, возвращаемом функцией localeconv(), если формат не установлен.

getdefaultlocale([envvars])

Пытается определить пользовательские национальные установки по умолчанию для данной категории и возвращает их в виде кортежа из строк с кодом языка и кодировкой (вместо строки может быть None, если значение не может быть определено)2. Если установки по умолчанию не могут быть определены с помощью системного вызова, используются переменные окружения с именами, приведенными в списке envvars (по умолчанию используется ‘[’LANGUAGE’, ’LC_ALL’, code’LC_CTYPE’, ’LANG’]’). Функция доступна, начиная с версии 2.0.

getlocale([category])

Возвращает текущие установки для категории category в виде кортежа из строк с кодом языка и кодировкой (вместо строки может быть None, если значение не может быть определено). Аргумент category может быть любой константой вида LC_*, кроме LC_ALL; по умолчанию используется LC_CTYPE. Функция доступна, начиная с версии 2.0.

normalize(locale)

Возвращает нормализованное имя национальных установок. Если имя locale не может быть нормализовано, оно возвращается без изменений. Если в исходном имени не указана кодировка, используется кодировка по умолчанию для данного языка (ISO8859-5 для русского). Функция доступна, начиная с версии 2.0.

resetlocale([category])

Изменяет текущие национальные установки для категории category (по умолчанию LC_ALL) на пользовательские установки по умолчанию3. Функция доступна,

2 В Windows NT getdefaultlocale() возвращает верное значение, которое, однако, не может быть использовано в качестве аргумента функции setlocale(), так как последняя требует имя национальных установок в своем (не стандартном) виде. Ситуация возможно изменится в будущих версиях языка.

3Не работает в Windows NT из-за несовместимости функций getdefaultlocale() и setlocale() (см. также сноску 2).

17.1. locale — использование национальных особенностей

239

начиная с версии 2.0.

 

strcoll(string1, string2)

(категория LC_COLLATE)

Производит лексикографическое сравнение строк string1 и string2 в соответствии с текущими национальными установками. Как и другие функции сравнения возвращает положительное, отрицательное число или 0 в зависимости от того, располагается строка string1 до или после string2 или строки равны. Строки не должны содержать символов ’\000’.

strxfrm(string) (категория LC_COLLATE) Преобразует строку таким образом, чтобы можно было проводить более быстрое сравнение с помощью встроенной функции cmp() (или операторов сравнения) и результат был таким же, какой возвращает функция strcoll(). Строка не должна содержать символов ’\000’.

format(format, val [, grouping]) (категория LC_NUMERIC) Возвращает строковое представление числа с учетом текущих национальных установок. Строка формата следует соглашениям, принятым для оператора %. Функция принимает во внимание местный символ десятичной точки и, если задан и является истиной аргумент grouping, группирует соответствующим образом цифры.

str(float)

(категория LC_NUMERIC)

Возвращает строковое представление числа аналогично встроенной функции

str(), но использует символ десятичной точки в соответствии с текущими на-

циональными установками.

 

atof(string)

(категория LC_NUMERIC)

Преобразует строку, содержащую представление вещественного числа в соответствии с текущими национальными установками, в вещественное число и возвращает его.

atoi(string) (категория LC_NUMERIC) Преобразует строку, содержащую представление целого числа в соответствии с текущими национальными установками, в целое число и возвращает его.

Ниже перечислены константы, которые могут использоваться в качестве первого аргумента функции setlocale() (категории национальных установок):

LC_CTYPE

От установок этой категории зависит поведение методов обычных строк и функций модуля string, предназначенных для анализа и изменения регистра букв.

LC_COLLATE

От установок этой категории зависит поведение функций strcoll() и strxfrm().

LC_TIME

От установок этой категории зависит поведение функции time.strftime().

240

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

LC_MONETARY

Категория для формата денежных сумм (см. описание функции localeconv() выше).

LC_MESSAGES (UNIX) Эта категория обычно определяет язык выводимых сообщений. Однако в настоящих реализациях интерпретатора установки этой категории не используются (см. описание модуля gettext).

LC_NUMERIC

Категория, определяющая формат чисел. Влияет на поведение функций format(), atoi(), atof() и str(), определенных в этом модуле.

LC_ALL

Комбинация всех категорий. При использовании этой константы для изменения текущих установок функция setlocale() пытается изменить установки для всех категорий. Если изменение хотя бы для одной категории невозможно, установки для всех категорий остаются прежними. Если Вы используете LC_ALL для определения текущих установок, возвращается строка, указывающая установки для каждой категории. Эта строка может быть использована в дальнейшем для восстановления установок.

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

Модуль gettext предоставляет возможность модулям и приложениям выдавать сообщения на родном языке пользователя. Этот модуль поддерживает как интерфейс к каталогу сообщений GNU gettext, так и основанный на классах интерфейс более высокого уровня, который больше подходит для кода на языке Python. В обоих случаях Вы пишите модуль или приложение с сообщениями на одном естественном языке и предоставляете каталог переведенных сообщений на другие языки.

Замечание: в текущих реализациях язык, на который осуществляется перевод, не зависит от национальных установок, выбранных с помощью функции locale.setlocale(), а выбирается в зависимости от значений переменных окружения LANGUAGE, LC_ALL, LC_MESSAGES и LANG (первая из них, имеющая непустое значение) или указывается явно. Далее мы будем обозначать строку с кодом выбранного языка как language.

17.2.1 Интерфейс GNU gettext

Используя интерфейс GNU gettext, Вы затрагиваете все приложение. Обычно это то, что нужно для одноязычных приложений. Если же Вы пишите модуль или Вашему приложению необходимо менять язык “на лету”, Вам следует использовать интерфейс основанный на классах.