Саммерфилд - Программирование на Python 3 (1077331), страница 59
Текст из файла (страница 59)
Бторой модуль более сложный, имеет свои собственные исключения, использует возможность динамического создания функций с платформозависимой реализацией, частные глобальные данные, более сложные доктесты и выполняет функцию инициализации. Примерно половина главы была посвящена обзору стандартной библиотеки языка РуС)!оп. Было упомянуто несколько модулей, предназначенных для работы со строками, и представлена пара примеров использования объектов (о. Згг(пз10.
Один из примеров продемонстрировал, как можно записать текст в файл либо с использованием встроенной функции рг(лг(), либо с использованием метода объекта файла иг!ге(), и как можно использовать объект (о,бгг!лВ)0 вместо настоящего файла. Б предыдущих главах мы обрабатывали аргументы командной строки, непосредственно читая содержимое зуз, агзч, но при обзоре поддержки обработки аргументов командной строки, включенной в библиотеку, мы познакомились с модулем ар!за гзе, который существенно упрощает работу с аргументами командной строки, — далее мы широко будем использовать этот модуль.
Была упомянута имеющаяся в языке превосходная поддержка работы с числами, числовые типы в библиотеке, три модуля с математическими функциями, а также поддержка научных и инженерных вычислений, предоставляемая проектом Яс!Ру. Коротко были описаны библиотечные и созданные сторонними разработчиками классы для работы с датой/временем, а также представлены примеры, демонстрирующие, как можно получить текущие дату и время и как выполнять преобразования между типом Саге!!ее. Саге!!ее и количеством секунд, прошедших от начала эпохи. Также были рассмотрены дополнительные типы коллекций и алгоритмы работы с упорядоченными последовательностями, реализованные в стандартной библиотеке, наряду с несколькими примерами использования функций из модуля Леарс. Были представлены модули поддержки различных способов кодирования файлов (не имеющих отношения к кодировкам символов), модули для работы со сжатыми файлами в наиболее популярных форматах архивирования, а также модули поддержки работы с аудиоданными.
Был дан пример, демонстрирующий порядок использования кодировки Баве64 для сохранения двоичных данных в файлах .ру, а также программа, выполняющая распаковывание тарболлов. Библиотекой предоставляется существенная поддержка операций над файлами Глава 5. Модули и каталогами, причем все эти операции реализованы в виде платформонезависимых функций.
В приведенных примерах было показано, как можно создать словарь с именами файлов в виде ключей и временем последнего изменения в виде значений, а также продемонстрировано, как выполнить рекурсивный обход дерева каталогов с целью выявления дубликатов файлов, основываясь на их именах и размерах. Огромную долю библиотеки занимают модули для реализации сетевых взаимодействий. Мы очень коротко рассмотрели, что имеется в библиотеке, начиная от обычных сокетов (включая сокеты с шифрованием трафика) до серверов ТСР, 1)ВР и НТТР и поддержки %ГЯ01.
Также были упомянуты модули, предназначенные для работы с соо)с1ев, сценариями С01 и данными протокола НТТР, средства синтаксического анализа НТМЬ, ХНТМЬ и адресов 1)КЬ. Были упомянуты прочие модули, включая модули для работы с протоколом ХМЬ-КРС и высокоуровневыми протоколами, такими как ТР и )х))хГТР, а также поддержка работы с протоколом электронной почты ВМТР, как на стороне клиента, так и на стороне сервера, и поддержка протоколов 1МАР4 и РОЗ на стороне клиента. Помимо всего прочего была упомянута имеющаяся в составе библиотеки мощная поддержка возможности записи и парсинга формата ХМ1., включая парсеры РОМ, БАХ и дерева элементов, а также модуль ехра 1. Был приведен пример использования модуля хв!,еггее.
Е1езелгТгее. Также были упомянуты некоторые другие пакеты и модули, имеющиеся в библиотеке. Стандартная библиотека языка Ру1)гоп представляет собой чрезвычайно ценный ресурс, который позволит сэкономить массу сил и времени, и во многих случаях позволяет писать более короткие программы, опирающиеся на функциональные возможности, предоставляемые библиотекой. Кроме того, существуют еще буквально тысячи пакетов сторонних разработчиков, восполняющих любую нехватку возможностей, которую можно обнаружить в стандартной библиотеке. Все эти предопределенные функциональные возможности позволяют нам сосредоточиться на предметной стороне решаемой задачи, оставляя большую часть деталей реализации за библиотечными модулями.
Этой главой заканчивается обсуждение фундаментальных принципов процедурного программирования. В последующих главах, и в частности в главе 8, мы познакомимся с более передовыми и более специализированными приемами процедурного программирования, а в следующей главе будут представлены приемы объектно-ориентированного программирования.
Использование языка Руьлоп в качестве исключительно процедурного языка программирования вполне возможно и даже оправданно, особенно при создании небольших программ, но при разработке средних и крупных программ, собственных пакетов и модулей, а также для создания долгоживущих проектов, как правило, предпочтительнее использовать объектно-ориентированный подход. 271 Упражнение К счастью, все, о чем рассказывалось до сих пор, с успехом может при- меняться и в объектно-ориентированном программировании, поэтому в следующих главах мы продолжим накапливать наши знания и навы- ки, основываясь на уже заложенном фундаменте.
Упражнение Напишите программу, демонстрирующую содержимое каталогов подобно тому, как это делает команда б! г в ЪУ[пг[оигв или 15 в Шх[1Х. Преимущество наличия собственной программы отображения каталогов состоит в том, что мы можем заложить в нее предпочитаемые параметры по умолчанию и использовать одну и ту же программу в любой системе, не утруждая себя необходимостью запоминать различия между командами 01г и 15.
Программа должна иметь следующий интерфейс: Маада: 15.ру [ор!4опв] [ра!Л1 [ра!Л2 [... Са!ЛИ]]] тле ра!Ьв аге ор!7опа!; 17 по! д!иеп . 15 ивеб. Ор!4опв. -Л, --Ле1р опон !Л!5 Ла!р эевваде апб ех11 -Н, --Любеп впои Шббеп 771ев [беГаи11: СГГ] -е, --эоб1715б впои !аы эоб77!еб ба1е/!!эе [беГаи!1; оГГ] -о ОЯОЕЙ, --огбег=ОНОЕН огбег Ьу ('паве', 'и', 'гаоб!Г!аб', 'э', 5!75, '5') [беГаи!1: пасе] -г, --гасигв!ие гесигве 1и!о виьб!Гас!СГ155 [бегаи!1; огг] -в, --юаев влон в!аев [багаи11: огг] (Вывод программы был несколько изменен, чтобы уместить его в ши- рину книжной страницы.) Ниже приводится пример вывода содержимого небольшого каталога спомощьюкоманды1в.ру -ав -ов в!вс/: 7 74!55, 1 б7гес!огу Мы использовали группировку ключей командной строки (она обрабатывается модулем ор1рагве автоматически), но тот же самый эффект можно было бы получить, используя ключи по отдельности, например, 15, ру -э -в -ов э!вс/, или даже применив более плотную группировку, 15.
ру -эвов э!вс/, или используя длинные имена параметров, 15 ру — зоб!7!еб — 5 12ев — огбе С=51 2е а1вс/, или любую их комбинацию. 2007-04-10 15:49:01 2007-08-01 11:24:57 2007-10-12 09:00;27 2007-04-10 15:50;31 2008-02- 11 !4: 17:03 2008-02-05 14:22'38 2007-12-13 12:01:14 322 1, 039 2,445 2,848 12, 184 109,788 1,359,950 6!55/Спагв.рую э!вс/рГа-оид.руГГ э!во/!ев!.
1ои! э!вс/спагв.рпд э!во/аьв!Гас!.рбг э!вс/К1ас!7п!Го. 1Ух э!вс/!ГдсК1пд.рбГ э!55/рпопе!Сд/ Глава 5. Модули Обратите внимание на наличие ключа, управляющего включением в вывод программы «скрытых» файлов или каталогов, имена которых начинаются с точки (. ). Упражнение довольно сложное. Вам придется ознакомиться с документацией к модулю орграгве, чтобы узнать, как объявлять параметры, которые принимают значение Тгое, и как определить фиксированный перечень параметров. Если пользователь определяет в вызове параметр — гесс гв1»е, программа должна выполнить обход файлов (но не каталогов) с помощью функции ов.иа1К(); в противном случае она должна использовать для получения списка файлов и каталогов функцию ов, 11втсгг().
Еще один подводный камень — организация пропуска скрытых каталогов при рекурсии. Их можно удалять из списка С1гв, возвращаемого ов. иа1г,( ), и тем самым пропускать их, модифицируя список. Но будьте внимательны — не присваивайте новое значение непосредственно переменной б1 ге, поскольку это не повлияет на список, на который она ссылается, а просто (и совершенно бесполезно) заместит его. Подход, использованный в решении, основан на присваивании срезу всего списка, то есть с(гв(:) = (о1г Гог О1г 1п о1гв 1( по1 г)1г.втагтвимл(".")).
Лучший способ группировки разрядов при отображении размеров файлов состоит в том, чтобы импортировать модуль 1оса1е, вызвать функцию 1оса1е. ве11оса1е() для получения региональных настроек пользователя и использовать спецификатор формата и. Общий размер программы 1з.ру, разбитой на четыре функции, будет составлять около 130 строк. Объектно-ориентированное программирование Во всех предыдущих главах мы широко использовали объекты, но при этом наш стиль программирования был исключительно процедурным.