Лутц М. - Изучаем Python (1077325), страница 173
Текст из файла (страница 173)
11пе() ве1(.с1егк.11пе() ве1Г. вос)ест. 1!пе( ) Ф Делегировать выполнение встроеннин и экэеипляраи Часть Ч)1. Исключения и инструменты Упражнения находятся в главе 29, в разделе»Упражнения к седьмой части». 1. 1гу/ехсер1. Ниже приводится моя версия функции оорв (файл оорз.ру). Что касается вопросов, не связанных с реализацией программного кода: если изменить функцию оорз так, чтобы вместо 1пбехЕг гог она возбуждала исключение КеуЕ г гог, то обработчик в инструкции Сгу не сможет перехватывать исключение (оно достигнет верхнего уровня и приведет к появлению сообщения об ошибке по умолчанию).
Имена КеуЕггог и 1пбехЕггог определены во встроенной области видимости. Импортируйте модуль Оот111п и передайте его функции 61 г, чтобы убедиться в этом: бет оорв(); га1ве 1пбехЕггог бет боозеб(): 1гу; оорв() ехсер1 1пбехЕггог: рг1пт 'саоолт ап (пбех еггогы е1ве: рг1пт 'по еггог саоолт...' паве == ' за1п '; боозеб() % руслоп оорз.ру саоож ап 1пбех еггог'.
МуЕггог = 'Пе11о' бе( оорз(): га1зе МуЕггог, 'ног)б' бе( боозеб(): ггу. оорв() ехсерг 1пбехЕггог: рг1п1 'савом ап 1пбех еггогы ехсер1 МуЕггог, баСа: рг1пг 'саоопг еггог:', муеггог, баса 2. Объекты исключений и списки. Ниже показано, как я дополнил модуль своим собственным исключением (для начала исключение определено в виде строки): 817 Решения упражнений е1ве: рг1п! 'по еггог саыцж ...
!Г паве == ' юа1п оооюео() % рузпоп оорв.ру саыцп! еггог: Пе11о ыог10 Чтобы идентифицировать исключение как класс, я просто изменил первую часть файла, как показано ниже, и сохранил его под име- нем оор сора.ру: с1авв ИуЕггог, рава бе( оорзО: гатзе МуЕггог() ...остальная часть осталась без изиенений... Как и в случае любого другого исключения на основе класса, в виде дополнительных данных передается сам экземпляр — теперь сооб- щение об ошибке содержит имя класса и указание на его экземпляр (<... >).
% рувпоп сор оорв.ру саыцлт еггог; юа1п,.яуЕггог < патп .МуЕггог тпв!апсе аг Ох00557550> !юрогт вув, !гасеоаск Ое( ва(е(еп!гу, *агре): Сгу: арр1у(ел!ту, агцв) ехсерс: тгасеьаск.рг!пт ехс() рг!и! 'бо!', вув.ехс туре, вув.ехс ча1ые Ф Перехватывать любые исключения !прог! оорв ва(е(оорв.оорв) % русаоп зауец,ру тгасеьасх (тппегпоз! 1аз!): Р11е "вате2.ру", 1!пе 5, тп вате арр1у(еп!гу, агцз) В Перехватывать любые исключения Ет1е "оорз.ру", 1тпе 4, тп оорз га1ве МуЕггог, 'яог1П' Не забывайте, что внешний вид сообщения можно улучшить, если определить метод герт или зтг в своем классе так, чтобы он возвращал нужную строку. Подробнее об этом рассказывается в главе 24.
3. Обработка ошибок. Ниже приводится мое собственное решение этого упражнения (файл ва7е2ру). Я добавил тесты непосредственно в файл, чтобы не проводить их в интерактивной оболочке, но результаты от этого не меняются. Приложение В Ье11о: ыог1б 6от пе1)о ыог)б Сегодня я реализовал бы эту функцию, как показано ниже, исполь- зуя новый синтаксис *агре и функцию ехс !про! бе( за(е(еп!гу, *агре): ггу; ел!ту(*агре) ехсерт; ггасеЬаси.рг1п! ехс() рг!п! 'Со!', вув.ехс 1пго()(0], вув.ехс 1пго()[!] Л Перехва тыла гь любые исключения а поиск наибольаего Файла е единстееннои каталоге б!главе = г'С:чгРуглоп2511!Ь' гарог! Оз, 910Ь а11в1гев = [] а11ру = 91оЬ.91оо(ов.рать.]огп(б!гпаае, '*.Ру )) Гог Г!1епаве гп а11ру: Гг!ее!ге = ов ра!П.ре!в!ге(Г!1епаае) а11вггев.аррепб((Г!1евгге, Г!1епаае)) а11з1гез.вогт() рггп! а11в1гев[:2] рг!п! а11в!гез[-2:] й Поиск наибольаего Файла е дерезе каталогов !арог! вув 1( вув р1а!Гога[гб] == 'ы!и': б1гпаае = г'С:)Ругооп25ч[!Ь' е1ве: б!гпаае = '/озг/11Ь/ру!Поп' 1арог! Ьз, 91ЬЬ апв!гев = [] тог (!и!вр!г, воьзнеге, (11евнеге) !п оз.на1и(б1гпаае): Гсг Г!1епаае гп Г11ЕВНЕГЕ: 1( (!1епаае.епбзы!!и('.Ру'): ГЬ11паае = ов.ра!Ь.)о!п(!Мв01г, (!1епаве) го11в1ге = оз.ра!ь.рета!ге(го11паве) а11в!гев.аррепб(((о11в!ге, Го11паае)) а1!ыгез.вогт() рггп! а11югез[:2] рггп! а11в!гев[-2:] й Поиск наибольаего Пайва с исходным программным кодои на лзике Ру!Ьоп й а пути поиска иодулей !арог! зув, оз, ррггпт 4.
Далее приводится несколько примеров для самостоятельного изучения на досуге; еще больше примеров программ на языке РуФ]гоп вы найдете в последующих книгах и в Сети: 819 Решения упражнений ч1з1!ес = () а11з!вез = [] (ог згсс!г 1п зуз.рась: (ог (1ь!зр!г, зиьзнеге, (!1езнеге) гп ов.на1к(згсс!г): !ьгз0!г = ов.ра(ь.легара!ь(гь!зр!г) !( !Ь!зргг.иррег() 1п ч!з!!ео.
солт!пие е1зе: ч!з!!ес[(Ь!зд!г.иррег()] = Тгие (ог (!1епаве !п (!1езнеге: г( Г!)епаае.елозя!(Ь( Ру ) рура!Ь = оз.ра(Ь,]о!и(!Ь!зр!г, (!1епаве) тгу: руз!ге = оз.рать.дега!ае(рурагь) Еховрг: Рг1п! 'зК1рргп9', аура!я а11з!вез.ароепб((руз!ае, Рурагп)) апз1хез.зог(() ррг!п!.Ррггп1(а11з!вез[:3]) ррг!и!.Ррг!п((а11з!вез[-Сп ]) в Сумма по столбцам, разделенныи запятыми, в текстовои Файле г[1епаве = 'сага.гх!' зиаз = () Гог !гпе [п орел(тг1епаие); со1з = 1!пе.зр1!!(',') пима = [1пг(со1) (ог со1 1п со1з] (ог (1х, пив) гп епивегате(пива): зивз[гх] = зиаз.де!(1х, О) ч пив Гог Хеу !п зогтес(зива): рг1п! Иеу, '=', зивз[ьеу] В То ве, что и выме, но суммы накапливается в списке, а не в словаре !врогг зуз г!1епаае = зув.агдч[1] пивсо1з = !п1(зуз.агдч[2]) гога1з = [О] ° пивсо1з (ог 1!пе !п орел((г1епаве): со1з = 1!пе.зр1!1(',') пийз "- [1п((х) гсг х !и со15] (о(а!з = [(х ь у) гог (х, у) гп а!Р(тога!з, пииз)] рг1п! (о(а1з В Регрессивное теотированив результатов работы нескольких сценариев 1арогт оз !ез!зсг!Р(з = [о!с1(зсггр!й'вез!1.Ру', агдз=''), о!с!(зсг!Рс='сез!2.ру', агдз='зрав')] Гог (ез!сазе 1п !ез!зсг!Ртз: Приложение В соввапо11пе = '%(всгсрс)в %(вгдв)в' % сев!саве ои1рис = ов.рореп(совввпб11пе).геас() геви1с = сев!саве['зсгсрс') г '.геви1с' !т пас ов.ра1п.ехсвсв(геви11): орел(гези11, 'и').иг!се(ои1рис) рг!пс 'Сгеасес:', геви1С е1ве; рг!оггеви11 = орел(геви11).геао() 11 оиСрис != рг1оггеви11; рг!п1 'РА1!ЕО:', Сезссазе['всгсрС') ргспс оисрис е1ве: ргспс 'Раввео:', севссаве['всгсрс') а Создание Гип с помощью ТК1п1ег; кнопка, иэиенявщая цвет и размер ГГОВ ТК1ПСЕГ 1ВРОГ1 * сврогс галсов гоп!в!се = 25 со1огв = ['геб', '9гееп', иЫие', 'уе11ам', 'огапде', 'нп11Е, 'суап', 'ригр1е ] ОЕС гЕР1у(СЕхт): ргсп1 сех1 рорир = Тор1еие1() со1ог = галсов.ело!се(со1огв) Еасе1(рорир, секс='Рорир', Ьд='Ь1асК', Гд=со1ог).расК() Ы соя!19(тд=со1ог) Оет 11вег(): [,солт!9(!9=галсов.ело!се(со1огв)) н!п,атсег(250, 11вег) оег дгом(): 910Ьа1 Госсе!Хе тоссе!Хе г= 5 Е.сопгсд(гоп!=('аг!а)', госсе!Хе, 'сса11с')) нсп.агсег(100, дган) нсп = ТК() 1 = Сесе!(м!и.
Сех1='Зрав', !опт=( агса1, гопсв!Хе, '!са11с ), Гд='уе11он', Ьд='поту', ге11еГ=ПА1ВЕО) Е.расК(в!се=ТОР, ехрапб=уЕВ, Г!П=ВОТН) Виссоп(мсп, 1ехс='ргевв', соввапс=(1авЬОа; гер1у('гес'))).расК(в1се=ВОТТОМ, С!11=Х) Виссоп(н1п, 1ехс='1!вег', соввепо=!свет).раск(в!ое=ВОттОм. 1111=х) Ви11оп(н1п, 1ехс='дгон', соввапс=дгом).расК(з1се=ВОТТОМ, 11!1=Х) н!п.васо!сор() В То же, что и виве, но на основе классов, поэтому каждое окно может в ииеть свое собственную информацию о состоянии Ггов Тхсптег !враг! сврогс галсов Решения упражнений с1азз Иубц(: ГИП с кнопками, которые изменяют цвет и размер надписи со1огз = ['Ь)це', 'дгееп', 'огапде', 'геб', Ьгоип', 'уе11ои'] бет тп1т (зе1(, рагепт, ттт1е='рорцр'): регент.т(т)е(т(т)е) зе)т,дгои1пд = Еа)зе зе1(.уоптз1ае = 10 зе1(.1аь = еаьецрагепт, техт='Оц11', гд='иыте', ьд='паху') зе1Г.
1аЬ раск(ехрапб=уЕБ, (111=ВОТИ) Во(топ(рагепт, техт='Брам'. совпало=зе1г.гер1у).раск(з1ое=ееет) Во(топ(рагепт, техт='Огои', сомюапс=зе1(.дгои).раск(зтсе=(ЕРТ) Вот(оп(рагепт, техт='Втор', соющапо=зе1(,втор).раск(з1оеГеерт) Оет гер1у(зе1Г): " при нажатии кнопки Брам изменяет цвет случайным образом " зе1(.(опта(ае += 5 со1ог = гапбощ.спо1се(зе)г.со1огз) зе1(,1аЬ. соп(19(Ьд=со1ог, тост=('соцгтег', зе1(.(остатке, 'Ьо1б [та1гс')) Оет дгои(зе1(): "при нажатии кнопки бгои начинает увеличивать размер надписи" зе1(,дгои[пд = Тгце зе1(.дгоиег() Оет дгоиег(зе1(): [Г зе1(.дгоитпд: зе1(.гопга1ге += 5 зе1Г. 1ао.сопутд((опт=('соцг1ег', зе1(.топ(в(ае, 'Ьо10')) зе1(.1ао.а(тег(500, зе1(.дгоиег) бе( втор(зе)Г): "при нажатии кнопки Втор останавливает увеличение размера" зе1(,дгоигпд = Еа1зе с1азз Мубцобц((Мубц!): со1огз = ['Ь)аск', 'рцгр1е'] № Настройка изменения цвета Мубцт(ТК(), 'юа[п') Мубц1(Тор1ече1() ) МубцЬбц1(Тор1еуе1() ) щатп1оор() № Сканирование и обслуживание ящика электронной почты Проверяет ящик входящей электронной почты, извлекает заголовки писем, позволяет удалять сообщения, не загружая их полностью 1мрогт рор1ть, де(раза, зуз ща[1зегуег = 'здесь требуется указать имя почтового сервера рор' № рор.
гмт. пег 822 Приложение В аа11цвег = 'здесь требуется указать имя пользователя' № Ьгсал аа11раввыс = детравз.де!рава('Равзыого Сот %в?' % аа11вегчег) ргспс 'СоппесСспд,..' вегчег = рор11Ь.РОРЗ(аас1вегчег) вегчег.цвет(аас1цвег) вегчег рава (аас1раввыс) сгу; рг1пС вегчег.десые1соае() авдСоцпС, испив!се = вегчег вСаС() рг1пС 'Тпеге аге', авдСоцпс, 'аа11 аеввадев, в!ге ', аЬохвсае авд!псе = вегчег. 1свс() ргспс авд1пто Сот с сп галде(авдСоцпс); авдпца = с+1 авда!Се = авдспсо[1 Ц 1].вр11с()[1] гевр, ьог11пев, оссесв = вегчег.сор(авдпца, 0) в 6ес ьогв оп1У ргспс '-'*80 рг!пс '[%О: оссесв=%0, в!се=%в]' % (авдпоа, оссесв, авда!ге) Саг 11пе сп Псг1спев.