Саммерфилд - Программирование на Python 3 (1077331), страница 51
Текст из файла (страница 51)
Если интерпретатор выполнил компиляцию файла с расширением .ру, он сохранит скомпилированную версию в одноименном файле с расширением .рус (или .руо, если интерпретатор был запущен с ключом командной строки -0', или если в переменной окружения РУТНОМОРТ1- М17Е установлено значение 0), при этом каталог должен быть доступен для записи. Сохранения байт-кода можно избежать, если запускать интерпретатор с ключом командной строки -В илн установив переменную окружения РУТНОМООМТМВ1ТЕВУТЕСООЕ. Использование файлов со скомпилированным байт-кодом ускоряет запуск программы, поскольку интерпретатору остается только загрузить и выполнить программный код, минуя этап компиляции (и сохранения, если это возможно), хотя сама скорость работы программы от этого не зависит.
При установке Ру1Ьоп компиляция модулей стандартной библиотеки в байт-код обычно является частью процесса установки. Пакеты Пакет — это простой каталог, содержащий множество модулей и файл с именем (п(1 .ру. Например, допустим, что у нас имеется некоторое множество файлов модулей, предназначенных для чтения и записи графических файлов различных форматов с именами В»пр.ру, Тренеру, Рпуру, ТЦТ.ру и Хрт.ру, в каждом из которых имеются функции 1оаб(), заче() и т. д.' Мы могли бы сохранить все эти модули в одном каталоге с программой, но в крупных программных продуктах, ис- Это символ «0», а не цифра О.
— Прим. перев. Широкая поддержка операций с графическими файлами обеспечивается различными модулями сторонних разработчиков, из которых наиболее примечательной является библиотека РуФЬоп 1п»авгия 1МЬгагу (алев.ругИоп. шаге.сот)рго«уис1зУрп). Модули и пакеты гЗб пользующих массу собственных модулей, модули для работы с графикой, скорее всего, лучше хранить отдельно.
Поместив их в свой собственный подкаталог, например (угаргт(се, их можно хранить все вместе. А если поместить в каталог СгарИсэ пустой файл т(Г .ру, этот каталог превратится в пакет: Огаротоэ/ гпы . Ру Вар.ру оред.ру Рпд.ру ттгг.ру Хрэ.ру Пока каталог ОУгара(сз является подкаталогом каталога с программой или находится в пути поиска Руй)гоп, мы будем иметь возможность импортировать любой из этих модулей и использовать их. Мы должны сделать все возможное, чтобы гарантировать несовпадение имени нашего модуля верхнего уровня (О гарб(сз) с каким-либо из имен верхнего уровня в стандартной библиотеке — с целью избежать конфликтов имен. (В системе 1)Н1Х это легко обеспечить, достаточно лишь использовать в качестве первого символа имени символ верхнего регистра, так как в именах модулей стандартной библиотеки используются только символы нижнего регистра.) Ниже показано, как импортировать и использовать наши модули: юрог( Огарп(сз.Вар таэде = Огарп(оз.Вар.
1оас("Ьазл(о1.оар") В небольших программах некоторые программисты предпочитают использовать более короткие имена, и язык Ру()уоп позволяет делать это двумя, немного отличающимися способами. 1ЭРОГ( ОГарл(СЗ.ОРЕ9 аз ород гааде = оред. 1оас("Оос.)род") Здесь мы импортировали модуль Оред из пакета ОгарЛтсз и сообщили интерпретатору, что вместо полного квалифицированного имени О гарЛ(сз. Оред хотим использовать более короткое имя Оред. Ггоэ Огаршоэ тэрог( Рпд тааде = Рпд.
1оас("Оореу.рпд") Этот фрагмент программного кода напрямую импортирует модуль Рпд из пакета Огарлтоз. Данная синтаксическая конструкция ((зрогт (гоа) обеспечивает непосредственный доступ к модулю Рпд. Мы не обязаны использовать в нашем программном коде оригинальные имена модулей. Например: Ггоэ Огарпуоэ шрог( тгтт аз роотоге тэаде = р~стоге. 1оас("дгоэру.(1(Г') 236 Глава 5. Модули Здесь мы используем модуль Т1[Т, но внутри нашей программы пере- именовали его в модуль р1сгс ге.
В некоторых ситуациях бывает удобно загружать все модули пакета одной инструкцией. Для этого необходимо отредактировать файл 1п11,ру пакета, записав в него инструкцию, которая указывала бы, какие модули должны загружаться. Эта инструкция должна присваивать список с именами модулей специальной переменной в11 .
Например, ниже приводится необходимая строка для файла Сгар/1[се/ 1п11 .ру: а1! = [ "Вар", ")рец", "Рпц", "Т1ГК, "Хра'1 Этим ограничивается необходимое содержимое файла т[г .ру, помимо этого, мы можем поместить в него любой программный код, какой только пожелаем. Теперь мы можем использовать другую разновидность инструкции 1зро гг: Ггое Вгармсв 1ерпгг * 1еаце = Хрп.1сас["в1ееру.пра") Синтаксис Т газ ресКаде 1прог1 * напрямую импортирует все имена модулей, упомянутые в списке а11 . То есть после выполнения этой инструкции мы получим прямой доступ не только к модулю Хрз, но и ко всем другим модулям. Как отмечалось ранее, этот синтаксис может применяться и к модулям, то есть Ггоа еоее1е 1зрогт *, в этом случае будут импортированы все функции, переменные и другие объекты, определяемые модулем (за исключением тех, чьи имена начинаются с символа подчеркивания).
При необходимости точно указать, что должно быть импортировано при использовании синтаксической конструкции [ гоа еоее1е 1арогг °, мы можем определить список а11 непосредственно в модуле; в этом случае инструкция [гоа зог)и1е 1арог1 * будет импортировать только те объекты, имена которых присутствуют в списке а11 До сих пор мы демонстрировали только один уровень вложенности, но РуФЬоп позволяет создавать столько уровней вложенности пакетов, сколько нам заблагорассудится. То есть мы можем поместить в каталог Сгарй[се подкаталог, скажем, Тгесгог, с файлами модулей внутри него Ере.ру и 8рИРу: Огаршсв/ 1п11 .ру Вар.ру )рец.ру Рпц ру Тпуу ру уесгог/ 1пы .
ру Ере.ру 237 Модули и пакеты цчц.ру Хра.ру Чтобы каталог Тгестог превратился в пакет, в него необходимо поместить файл т(1 .ру, который, как уже говорилось, может быть пустым или определять список а11 для обеспечения удобства тем программистам, которые предпочтут использовать инструкцию импортирования тгса Огарлтсз.уестог 1арсгт *. Для доступа к вложенному пакету мы можем использовать обычный синтаксис, который использовали ранее: тарогт згарптсз.чертог ерз гаазе = Огарпшз.чертог,ерэ, 1рап( 'зпеегу.ерз") Полные квалифицированные имена могут оказаться слишком длинными, поэтому некоторые программисты пытаются привести иерархию модулей к плоскому виду, чтобы избежать необходимости вручную вводить такие имена: тарогт цгарртсз.чертог.цчц аэ ячц тапсе = Бчц. 1рас(тапсе.зчц") Мы всегда можем использовать свои собственные короткие имена для модулей, как показано в этом примере, хотя это повышает риск появления конфликтов имен.
Собственные модули Поскольку модули — это всего лишь файлы с расширением .ру, они создаются без особых формальностей. В этом разделе мы рассмотрим два нестандартных модуля. Первый модуль, Тех10111 (в файле ТехШШ.ру), содержит всего три функции: 1з Ьа1апсес(), возвращающую Тгре, если в строке, переданной ей, соблюдена парность скобок разных типов; з По гтеп() (продемонстрированную ранее, на стр.
209) и зтар1тгу(), способную удалять лишние пробелы и другие символы из строки. При рассмотрении этого модуля мы также покажем, как использовать программный код в строках документирования в качестве модульных тестов. Второй модуль, Спагйгтс (в файле СгтагогЫ р(г), содержит сетку символов и позволяет «рисовать» линии, прямоугольники и текст в сетке и отображать сетку в консоли.
Этот модуль демонстрирует некоторые приемы, с которыми мы не сталкивались ранее, и является более типичным примером более крупных и более сложных модулей. Модуль Тех10Я Структура этого модуля (и большинства других модулей) немного отличается от структуры программы. Первая строка модуля — это строка «еЬеЬапа», вслед за которой следует несколько строк комментариев (обычно упоминание об авторских правах и информация о лицензионном соглашении). Затем, как правило, следует строка в тройных ка- Глава 5.
Модули вычках, в которой дается краткий обзор содержимого модуля, часто с несколькими примерами использования — это строка документирования модуля. Ниже приводится начало файла Тех(Ю((ру (правда, без комментария с упоминанием о лицензионном соглашении): й!г'ывгг'Ьгпггепч РУ!ЬопЗ й Соруг1дп! (с) 2008 О!гас Ь!О. А!1 г!длтв гевегчео.
Этот модуль предоставляет несколько функций ианипулирования строками. »> гв ьа1апсео("(Рутпоп (зв (по! (11вр))))") Тгце »> впогтеп("тпе сговвтпд", 1О) 'Тле Сго...' »> юшр11ту(" воще !ехт иг!и врыгтоцв иьг!еврасе ") 'воще техт иг!ь врыггоцв иь!!аврале' нпрогт м ггпд Строку документирования этого модуля можно сделать доступной программам (или другим модулям), если импортировать модуль как Тех!От!1. Пос . Вслед за строкой документирования следуют инструкции импортирования, в данном случае — единственная инструкция, и далее находится остальная часть модуля. а Мы уже видели полный текст функции влог!еп(), поэтоФункция впогтеп() МУ НЕ бУДем повторно воспроизводить его здесь. И постр.