Саммерфилд - Программирование на Python 3 (1077331), страница 54
Текст из файла (страница 54)
Модуль С11агбг!С имеет один существенный недостаток: он поддерживает только одну сетку символов. Одно из решений, избавляющих от этого недостатка, заключается в создании коллекции сеток, но это попутно означает, что пользователи модуля должны были бы указывать ключ или индекс требуемой сетки во всех вызовах функций, чтобы идентифицировать сетку, над которой выполняется операция. В случаях, когда возникает необходимость иметь несколько экземпляров объекта, лучшее решение состоит в том, чтобы определить класс (собственный тип данных) и создать столько экземпляров (объектов данного типа), сколько потребуется. Дополнительное преимущество реализации на основе класса заключается в том, что мы можем отказаться от использования инструкции с1обз1, сохраняя данные в виде атрибутов (статических элементов) класса.
Как создавать классы, мы узнаем в следующей главе. Обзор стандартной библиотеки языка РуФоп Стандартная библиотека языка РуФоп обычно описывается, как «батарейки, входящие в комплект поставки», и обеспечивает доступ к широкому кругу функциональных возможностей, насчитывая в своем составе свыше 200 пакетов и модулей. Этот раздел представляет собой краткий обзор того, что может предложить стандартная библиотека, разделенный на тематические подразделы; из обзора исключены пакеты и модули„представляющие слишком узконаправленный интерес, а также модули, характерные для той или иной платформы.
В ходе описания будут демонстрироваться небольшие примеры, чтобы дать представление, что представляют собой те или иные пакеты и модули, Обзор стандартной библиотеки языка Ру(Ьоп 249 Обработка строк Модуль втг!пб содержит ряд полезных констант, таких как втгтлц. аВС!1 1е11егв и 91гтпб. леха!19. Кроме того, он предоставляет класс втг!пб.
Гогаатте г, на основе которого можно создать подкласс, обеспечивающий собственные средства форматирования.' Модуль тех!итар может использоваться для расстановки в тексте символов перевода строки, чтобы ограничить ширину строк заданным значением, а также для уменьшения отступов. Модуль в!гост содержит функции упаковывания и распаковывания чисел, логических значений и строк в/из объекты типа Ьутев, используя их двоичное представление. Это может потребоваться для организации передачи данных между программой и низкоуровневыми библиотеками, написанными на языке С.
Модули втгис1 и тех!- итар используются программой сопиег(-тс(г(еп(вру, описываемой в главе 7. а Тяп данных ЬутЕВ, стр. 344 а Модуль втгнс1, стр. 349 Модуль Ь!((11Ь содержит классы и методы сравнения последователь- ностей, таких как строки, способные воспроизводить результаты срав- нения как в стандартных форматах «61Л», так и в формате НТМВ. Самый мощный модуль в языке Ру()топ, связанный с обработкой строк, — это модуль ге (геяп1аг ехргеввюп — регулярные выражения).
Он подробно будет рассматриваться в главе 12. Класс то 51г! п010 может использоваться для создания объектов, подоб- ных строкам, которые ведут себя как текстовые файлы, размещенные в памяти. Это может быть удобно, когда необходимо использовать про- граммный код, выполняющий запись в файл, для записи в строку.
Пример: класс 1о.51плдЮ Выполнить запись в текстовый файл в языке Ру()топ можно разными способами. Один из способов состоит в использовании метода игтте() объекта файла, другой — в использовании функции рг1п1() с именован- ным аргументом (!1е, указывающим на объект файла, открытый для записи. Например: ргтпт("Ап еггог аевваре", гт1е=вув.втпов1) вув.в1сост.нгтте("Апо1пег еггог аеввввехп") Создание подкласса (вибо!авв(ля), нли специализация класса (грег(а((гтрк, означает создание собственного типа данных (класса) на основе (на базе, Ьавег( оп) другого класса. Эта тема подробно рассматривается в главе б. а перекрестные ссылки будут указывать страницы в книге, где можно найти дополнительные сведения об этих пакетах и модулях.
Глава 5. Модули В обоих случаях текст сообщения будет выведен в вув, в!бор! — объект файла, представляющий «стандартный поток вывода», который обычно связан с консолью и отличается от вув, в!бе г г, «стандартного потока вывода сообщений об ошибках», только тем, что при работе с последним используется небуферизованный вывод. (Интерпретатор автоматически создает и открывает яув, вгб!и, вув, в!бор! и вув, вгбегг при запуске программы.) По умолчанию Функция рг!и!() добавляет символ перевода строки, хотя такое ее поведение можно изменить с помощью именованного аргумента епб, передав в нем пустую строку. В некоторых ситуациях бывает удобно перехватывать и записывать в строку все то, что предназначено для вывода в файл.
Добиться этого можно с помощью класса !о. Ягг!пд10, экземпляр которого можно использовать как обычный объект файла, который записывает данные в строку. Если при создании объекта !о. 8! г!пд10 была указана начальная строка, его также можно использовать для чтения, как если бы это был файл. Выполнив инструкцию шрог! го, мы сможем использовать !е, Ягг!пд10 для перехвата любой информации, предназначенной для вывода в объект файла, такой как вув, в!бор!: вувимбоиг = го. Ягг1пд10() Если эту строку поместить в начало программы, вслед за инструкциями импорта, но перед любыми инструкциями, использующими вуя. в!без!, то любой текст„записываемый в вув. в!бор!, в действительности будет передаваться объекту !о, Я! г!пд10, созданному этой строкой кода и заменившему стандартный объект файла вув, в!бра!.
Теперь при выполнении приведенных выше строк с вызовами рг!пг() и вув. в!бее!. иг!ге() выводимый ими текст будет попадать в объект !о. Ягг!пд10, а не на консоль. (Оригинальное значение вуя. в!без! можно восстановить в любой момент, для чего достаточно выполнить инструкцию вув. в!бои! = вув. в!бор! .) Чтобы получить все строки, записанные в объект !о, Ягг!пд10, можно вызвать метод !с. Ягггпд10.
де!уа1ие(). В данном случае вызовом метода вув. в!боя!, де!уа1ие() можно получить строку, содержащую весь выводившийся текст. Эту строку можно напечатать, сохранить в Файл журнала или отправить через сетевое соединение, как и любую другую строку. Немного ниже (на стр. 266) мы увидим еще один пример использования класса !е. Я! г!пд10. Работа с аргументами командной строки Если нам потребуется иметь возможность в программе обрабатывать текст, который может быть получен в результате перенаправления в консоли или находиться в файлах, имена которых перечислены в командной строке, мы можем воспользоваться функцией Г!1е!прп!.!прпг() из модуля (!1е!прп!. Эта функция выполняет итерации по всем Обзор стандартной библиотеки языка Рубпоп строкам, полученным в результате операции перенаправления в консоли (если они есть), или по всем строкам из файлов, имена которых перечислены в командной строке, как будто это единая последовательность строк.
Модуль может сообщать имя текущего файла и номер строки с помощью функций тт1е[прот, тт1епаае() и гт1этпрот.1тпепо(), а также предоставляет возможность работать с некоторыми типами сжатых файлов. Для работы с параметрами командной строки в стандартной библиотеке имеется два модуля — ортрагзе и деторт. Модуль деторт популярен, так как он прост в использовании и к тому же давно входит в состав библиотеки. Модуль ортрагзе более новый и обладает более широкими возможностями, Пример: модуль ор1рагве Вспомните описание программы сер2атл«1.ру, которое Пример приводилось в главе 2.
В упражнениях к этой главе мы сзу»ьтэ1 предложили расширить программу так, чтобы она могла ру, стр. 1тэ принимать аргументы командной строки: аргумент «тах- и 1ЙЬ]т», принимающий целое число, и аргумент «1огшаЬ», принимающий строку. В решении (сзи2Ыл«12 алз.ру) для обработки аргументов имеется функция объемом 26 строк. Ниже приводится начало функции ва]п() для сзр2Ьтл«12 ору.ру — версии программы, в которой вместо нашей собственной функции для обработки аргументов командной строки используется модуль ортрагзе: сот мзтп(): рагзег = ортрзгзе.ОртюпРагзег[) рагзег.аос орттоп["-и", Р--вахтгтптл", Оезтывахнтстп", туреыппт", Пе1р=("тпе мах1мом псмоег от сЬагастегз тлат сап Ье " "острот то зтг1пд 11е!оз [оетас11; воетас11]")) рагзег.асс орттоп["-т", "--тогэат", Оезт="тогмат", Ье1р=["тпе тогмат сзес тог остротттпд псмЬегз " "[Оетзс)т: Ьоетзо)ЬГ )) рагзег.зет оетаи1тз[мзхтгтотп=тОО, тогмат=".ОГ ) ортз.
агдз = рзгзег.рзгзе агдз[) Для обработки аргументов потребовалось всего девять строк программного кода плюс строка с инструкцией тмрогт ортрагзе. Кроме того, нам не пришлось явно обрабатывать параметры -Ь и — Ье1р — эти параметры обслуживаются самим модулем остра гзе, который для вывода соответствующего сообщения использует текст из именованных аргументов Ье1р, где текст «»/» деХаи1С» замещается значениями по умолчанию соответствующих параметров. Обратите также внимание, что теперь параметры можно указывать в привычном для системы 1)]х]1Х стиле — как с помощью коротких, так с помощью длинных имен параметров, начинающихся с символа дефи- 252 Глава 5. Модули са. Короткие имена удобны для организации взаимодействий с пользователем в консоли, а длинные имена более понятны при использовании в сценариях командной оболочки. Например, чтобы ограничить максимальную ширину 80 символами, мы можем использовать любой из следующих вариантов определения параметра: -иВО, -и ВО, — пах- и1Ь1Ь=ВО или — захи1Ь(Ь ВО.
После разбора параметров командной строки доступ к их значениям можно получить с помощью имен, указываемых в аргументах оез1, например, ор(з. пахи(дгп и ор1э. Гогзаг. Все аргументы командной строки, которые не были обработаны (обычно это имена файлов), помещаются в список агре. Если в процессе разбора командной строки возникает ошибка, синтаксический анализатор модуля ор1рагэе произведет вызов зуз,ехж(2). Это приведет к завершению программы и возврату операционной системе числа 2 в качестве возвращаемого значения программы. Традиционно значение 2 свидетельствует об ошибке в использовании программы, значение 1 используется для индикации об ошибках любого другого типа и значение 0 означает благополучное завершение. Когда функция зуз, ехгг() вызывается без аргументов, операционной системе возвращается значение О. Математические вычисления и числа В дополнение к встроенным типам чисел (пц (1озг и соир1ех библиотека предоставляет числовые типы Ьесша1.
Оес1аа1 и Ггзс11опз. Ргас11оп. Также в библиотеке имеется три математические библиотеки: иагл, содержащая стандартные математические функции; сиагл — математические функции для работы с комплексными числами; гзпсоа, содержащая множество функций генерации случайных чисел. Все зти модули были представлены в главе 2. В модуле ппэоегз имеются различные числовые абстрактные классы языка Ру1)гоп (классы, которые могут наследоваться, но которые не могут использоваться непосредственно). Их удобно использовать для проверки того, что объект, пусть это будет х, принадлежит к любому числовому типу с помощью вызова 1з(пз(апсе(х, пивоегз.