Саммерфилд - Программирование на Python 3 (1077331), страница 48
Текст из файла (страница 48)
тогаас() ва метода зсг. Тогаас(). В шаблоне НТМЕ ТЕМРЕАТЕ в качестстр. 100 ве замещаемых полей мы использовали не числовые индексы, а имена, например, (С111е). Ниже мы увидим, что для передачи значений в эти поля нам необходимо будет использовать именованные аргументы. о1взв Сапсе11ебЕггог(Ехсерт1оп): разе Затем определяется нестандартное исключение; мы встретимся с ним в паре функций программы. Функция ва1п() программы устанавливает некоторые начальные значения и входит в цикл.
На каждой итерации пользователю предлагается ввести некоторую информацию о странице НТМТ, которая будет сгенерирована, и после создания каждой страницы предоставляется возможность завершить программу. бег ветл(); !пгогвас1оп = б1сс(паве=мопе, уеаг=басессае.басе.собву().уеаг, Г>1епаве=аопе, С!11е=Мопе, безсг!Ртсоп=Иоле, Кеупогбз=аопе, зту1езяееС=Моле) аы 1е Тгое: сгу: ргспс("Хпмаке нтмс зке1есопХп") роро1ате 1птогаат!оп(со!ответ!оп) ваКе ПСИ1 зхе1етоп(*.со!агав!!оп) ехсерс Сапсе11ебЕггог: рыпт("Сапсе11еб") 1( (цес зсг!пц("Хпсгевсе зпоспег (у/и)?", бетао1сы'у"). 1оаег() Пример: гпаКе Ь(гп( яКе(е1оп.ру 221 пс1 1п ("у", "уея")): Ьгеап Функция ба1е11ае. бз1е. 1обзу() возвращает объект бз1е11ве. ба1е, который хранит текущую дату.
Нам требуется лишь значение атрибута уеаг этого объекта. Во все остальные элементы данных записывается значение (!опе, так как для них не существует разумных значений по умолчанию. В цикле вп!1е программа выводит заголовок и вызывает функцию рорб1а1е !Ь(огаз1!оп(), передавая ей словарь !Ьгогвз1!оп. Внутри функции рорб1а1е !п10гаа11оп() производится заполнение этого словаря. Затем вызывается функция ааКе Ьта1 яКе1е10п(), она принимает большое число аргументов, но чтобы явно не указывать значение каждого из них, мы просто распаковываем словарь !Ьгс газ!!оп.
Если пользователь прерывает процесс создания заготовки страницы, например, отказом от ввода обязательного значения, программа выводит сообщение «Сансе!!ег[» (отменено). В конце каждой итерации (независимо от того, было ли отменено создание заготовки страницы или нет) пользователю задается вопрос: не желает ли он создать еще одну заготовку. Если пользователь отвечает отказом, производится выход из цикла и программа завершает работу. бе( рсрс1яге !Ьгсгаяг!сп(!Ь(сгваггсп): паве = де1 ягг1пд("еп1ег уссг паве (гсг ссруг!дьт)", "паве", »п(сгвя1!оп["паве"]) !( пс1 паве: гя!яе Сяпсе1!ебЕггсг() уеаг = 9е1 1п1едег("Еп1ег ссруг!9пя уеяг", "уеяг", !Ь(сгвя1!сп["уеяг"], 2000, баге11ве.бя(е.1сбау().уеаг + 1, Тгсе) !( уеяг == 0; га!яе Сапсе1!ебЕггсг() (г1епаве = де1 яггшд("Ешег Г!1епаае", "Г!1епяве") !( пс1 (!1епяае: гале Сапсе11ебЕггсг() !( пс1 (!1епаае.епбяв!1ь((".ь1а", ".ь(в!")): Гг1епяве «= ".Ьгв1" !Ьусгваг!сп.србаге (паве=паве, уеаг=уЕаг, Г!1епяве=(!1епяве, 1г11е=1!11Е, бЕЯСг1Р1!СП=бЕЯСг!р11яп, Кяу«пгбз=пеувогбз, Ягу1ЕЯЬеЕ(=я1у1еЯЬее1) Мы опустили программный код, который запрашивает заголовок и текст описания, ключевые слова НТМ( и имя файла с таблицами стилей.
Во всех этих случаях используется функция де1 я1г!пд(), которую мы увидим очень скоро. Достаточно лишь отметить, что эта функция принимает текст вопроса, «имя» соответствующей переменной (для вывода в сообщении об ошибке) и необязательное значение по умолчанию. Точно так же функция де1 1п1едег() принимает текст вопроса, гг~ Глава 4. Управляющие структуры и функции имя переменной, значение по умолчанию, минимальное и максималь- ное значения, а также признак — допустимо ли значение О. В конце функция заполняет словарь 1пгогаат1оп новыми значениями, используя именованные аргументы. В каждой паре Кеу=уа100 имя Кеу соответствует имени ключа в словаре, значение которого замещается указанным значением уа1ие, и в данном случае каждое значение уа)ие является переменной с тем же именем, что и соответствующий ей ключ словаря.
Эта функция не имеет явного возвращаемого значения (поэтому она возвращает значение Ноле). Она может также завершаться в случае появления исключения Сапсе11еОЕггог, в этом случае исключение будет передано вверх по стеку вызовов и обработано в функции за !п( ). Функцию ваке Нтэ1 аке1етоп() мы рассмотрим в два этапа. пег паке пта1 аке1етсп(уааг, паве, !!!10, аеасг1рттоп, кеуиогаа, ату1еапает, г!1епааа): соругтдлт = СОРУЯ10нт темРЕАТЕ.гагаат(уааг, ха1.аах.аахитт1а.еасара(папе)) тт(1е = ха1,аах.ваха!!1а.еасаре(т!11е) ааасгтрт1оп = ха1.аах.аахатт1а.еасаре(0аасгтрт!оп) кауиогаа = ",".)отп([ха1.аах.аахртт1а,еасаре(к) гог к тп кеуиогаа)) !г кеуиогаа е1аа ату1аапеет = (зту(еБнеет теиР!Ате,гола!(ату1еапеет) !Г ату1ааяеет 01ае "") пта1 = нти( темР(Ате.тогаат(т!11е=ттт1е, соругтдпт=ссруыдж, сеасг!Рттоп=ааасгтрттоп, Кауиогаа=кеуггогаа, ату1еааает=агу)ааяеат) Чтобы получить текст с указанием авторских прав, мы вызываем метод а! г, (агэат() для строки сОРун[6нт темр[Ате, передавая год и имя (дополнительно выполняя экранирование служебных символов НТМЬ) в виде позиционных аргументов для замены полей (О) и (1) .
В тексте заголовка и описания мы просто экранируем служебные символы НТМ1 . В случае ключевых слов у нас может быть два варианта действий, которые реализуются с использованием условного выражения. Если ключевые слова не были введены, то в качестве значения переменной Кеуиог00 будет использоваться пустая строка. В противном случае с помощью генератора списков выполняется обход всех ключевых слов и создается новый список строк, в каждой из которых выполняется экранирование служебных символов НТМЬ.
После этого, с помощью метода в!г.)о1п(), мы объединяем элементы списка в единую строку, разделяя их запятыми. Текст переменной вту1еаяеет создается аналогичным способом, что и текст с указанием авторских прав, но с применением условного выражения, чтобы в случае отсутствия имен файлов таблиц стилей получалась пустая строка. Пример: птаИе )тспт) Йе)есоп.ру 223 Текст для переменной )тсв1 создается из шаблона ИТИЕ Метод асг. ТЕИРЕАТЕ, где для передачи данных в замещаемые поля го,васИ используются не позиционные аргументы, как в других стр.
!00 строках шаблонов, а именованные. СП = Ионе сгу. сп = ореп(111епаве, "в", епооо!пд="нс(8") Го.вг!Се(отв)) ехоерт ЕпусгопвепСЕггог аа егг. рг!пт("ЕННОН", егг) е)ае: рг!пс("Нанео ахе1есоп", спепаве) т!па11у: 1Г ГП !а поС Ионе: то.о1оае() Как только заготовка файла КТО будет готова, мы записываем ее в файл с заданным именем. После етого пользователь извещается, что файл заготовки был сохранен, или выводится сообщение об ошибке, если что-то пошло не так.
Как обычно, чтобы гарантировать закрытие файла, если он был открыт, используется предложение г!па11у. оет цес ыг1пд(веаааде, паве="асг1пц", оегаи1с=иопе, всп1вив 1епдСП=О, вахюнв 1епдСП=80). веаааде в= ", " сс оегаи11 та иопе е1ае " Г(0)); ".(огвас(оеган11) ва!1е Тгне: сгу: 1спе = !при!(веаааде) сс пот 11пе; !г оетан1С та пот Ионе.' геснгп оеган1с сс в1псвнв 1епдСП == 0: геснгп "" е1ае; га!ае на1иееггог("(О) вау пос ье еврсу".гогвас( паве)) ст пос (в1п!вив 1епдсп <= 1еп( 1!не) <= вах!вив 1епдсп): гасае на1иееггог("(0) внес пане ас 1еаас (1) апо " "ас вовс (2) опагаосега".гогвас( паве, в!п1вив 1епцсп, вах!вив 1епдсп)) гетигп 11пе ехсерт На1неЕггог аа егг, рг1пС("ЕННОН", егг) Функция имеет один обязательный аргумент веаааде и четыре необязательных аргумента.
Если значение аргумента Оесан1С определено, оно включается в строку веаааде, чтобы пользователь мог видеть значение по умолчанию, которое будет использоваться, если он просто нажмет клавишу ЕНСег, не вводя никакого текста. Остальная часть функции заключена в бесконечный цикл. Цикл может быть прерван вводом 224 Глава 4. Управляющие структуры и функции допустимой строки или в результате простого нажатия клавиши Елсег, когда используется значение по умолчанию (если определено). Кроме того, пользователь может прервать цикл и завершить работу программы, нажав комбинацию клавиш С1г1+С, — в этом случае возбуждается исключение КеуЬоаг01птеггорт, но так как это исключение не обрабатывается ни одним из обработчиков, имеющихся в программе, это приведет к завершению программы с выводом диагностической информации.
Следовало ли оставлять такую возможность прерывать цикл? Если бы мы этого не сделали и в программе обнаружилась бы ошибка, мы ие оставили бы пользователю никакой возможности прервать работу программы, кроме как уничтожить процесс. Если нет достаточно веских причин препятствовать завершению программы по нажатию комбинации С(г(+С, не следует обрабатывать это исключение ни в одном из обработчиков. Примечательно, что эта функция достаточно универсальна и может использоваться не только в программе тале Мт( а)ге(етоп.ру, но и во многих других интерактивных программах подобного типа.
Такого многократного использования функции можно было бы добиться простым копированием текста, но такой прием может стать источником головной боли для того, кто будет сопровождать программы, В следующей главе мы узнаем, как создавать собственные модули, вмещающие функциональные возможности, которые могут совместно использоваться большим числом программ. оег дет 1птедег(аеаэаде, паяеычптедег", оегаи11Гяопе, а1пгаоя=о, аактэов=100, а11он гего=тгие): Эта функция по своей структуре настолько близка к функции дет втг1пд( ), что нет необходимости воспроизводить ее здесь. (Безусловно, эта функция присутствует в исходных текстах примеров к книге.) Параметр а11он лего может быть полезен, когда 0 не является допустимым значением, но когда желательно обеспечить возможность ввода ошибочного значения, чтобы предоставить способ прервать процедуру создания заготовки.
Другой способ, который можно было бы использовать, заключается в том, чтобы определить недопустимое значение в качестве значения по умолчанию; тогда возврат такого значения означал бы, что пользователь отменил операцию. Последняя инструкция в программе — это простой вызов функции за1п(). Общий объем программы составляет чуть больше 150 строк, иона демонстрирует некоторые особенности языка РУ1)топ, которые были представлены в этой и в предыдущих главах. В заключение В заключение В этой главе мы рассмотрели полный синтаксис всех управляющих структур языка Ру1Ьоп. Здесь также было показано, как возбуждать и обрабатывать исключения и как создавать свои типы исключений.
Большая часть главы была посвящена созданию собственных функций. Мы увидели, как создаются функции, познакомились с некоторыми правилами выбора имен для функций и их параметров. Мы также увидели, как можно добавлять описание функций. Подробно был рассмотрен универсальный синтаксис определения параметров и передачи аргументов в языке Ру1)зоп, включая возможность передачи фиксированного и переменного числа позиционных и именованных аргументов, а также возможность определения для аргументов значений по умолчанию — как неизменяемых, так и изменяемых типов.
Кроме того, мы коротко повторили порядок использования оператора распаковывания последовательностей ° и показали, как выполнять распаковывание отображений с помощью оператора * ° . Когда возникает необходимость присвоить глобальной переменной новое значение внутри функции, она должна быть объявлена с помощью инструкции В1оба1, чтобы предотвратить создание оператором присваивания новой локальной переменной. Однако вообще глобальные переменные лучше использовать только в качестве констант. Лямбда-функции часто используются в качестве значения аргументов других функций или в других случаях, где функция должна передаваться в виде параметра.