Лутц М. - Изучаем Python (1077325), страница 67
Текст из файла (страница 67)
Чтобы подавить вывод пробела между элементами, не следует производить вывод таким способом— вместо этого нужно самостоятельно собрать строку с помощью средств конкатенации и форматирования, о которых рассказывалось в главе 7, и вывести эту строку: Программа «НеПо ЧЧогЫ» на языке РуФоп Чтобы вывести сообщение «йе!1о и огЫ», достаточно просто напечатать строку: № Вивести строковии обьвкт »> рг1пт 'Ье11о иог1О' Пе11о иог1О Поскольку результаты выражений в интерактивной оболочке выво- дятся автоматически, вы можете даже не использовать инструкцию ршпг — просто введите выражение, которое требуется вывести, и ре- зультат его вычисления немедленно будет выведен: № Интерактивная оболочка виводит автоиатически »> 'Ье11о иог1О' 'Ье11о иог1О' В действительности инструкция рг)пг — это всего лишь эргономичная особенность языка Ру$)гоп — она обеспечивает простой интерфейс к объекту вуз.вгбоог, добавляя незначительный объем форматирования.
Фактически, если вам нравится идти более трудным путем, вы можете запрограммировать вывод таким способом: »> 1врогт вув № Вывод более слоимми способом »> вув.втбоот.иг11ег Ье))о иог)О',и') Пе11а иог1О В этом фрагменте явно вызывается метод нгтге объекта вув. вгбсог — атрибут, предустановленный интерпретатором Ру$)гоп во время открытия файла, связанного с потоком вывода. Инструкция рг)пт скрывает большую часть этих подробностей, предоставляя простой инструмент для решения простых задач вывода.
Перенаправление потока вывода Итак, почему я показал пока единственный способ вывода7 Как оказывается, объект вув. вгбоог обеспечивает возможность вывода, эквивалентную базовой методике, используемой в языке РуЬйоп. Вообще говоря, инструкция ргтпг и объект вув.вГбсог связаны между собой следующим образом. Следующая инструкция: рг!пт Х »> рг1п1 х + у аЬ »> рггпт 'ьв...вв' 1 (», у) а .Ь Глава11.
Присааиэание, выражения и рпп1 309 Инструкция рпп1 является эквивалентом более длинной: 1ВРОГ1 ауа ауа.атоаотпигтте(втг(х) г 'Хп') которая вручную выполняет преобразование объекта в строку с помощью функции з1г, добавляет символ новой строки с помощью оператора + и вызывает метод нгтте потока вывода. Более длинная форма сама по себе не так удобна в использовании. Однако полезно знать, что она является точным эквивалентом инструкции рып1, потому что существует возможность перенаправить зуз. ассоц( в место, отличное от стандартного потока вывода. Другими словами, эта эквивалентность обеспечивает возможность заставить инструкцию ргтп1 выводить текст в другое место.
Например: !эраст ауа ауа.атоовт = преп('1од тхт', 'а') л лвреиаправита вывод в еайл Д Текст появится в Файле )од Гхт ргтпт х, у, х Здесь мы вручную перенаправили объект зуз. этсоо1 в файл, открытый вручную в режиме добавления. После этого все инструкции ргтп1 в программе будут выводить текст в конец файла 1оудх(, а не в стандартный поток вывода. Инструкции рг(п1 благополучно продолжают вызывать метод иг11е объекта эуз. зтооот независимо от того, куда он ссылается. Поскольку в каждом процессе существует всего один модуль зуз, перенаправление зуз. зтсоо1 таким способом будет воздействовать на все инструкции ргтп1 в программе. Фактически, как будет говориться в ближайшей врезке, описывающей инструкцию ргтп1 и объект з(соо1, существует возможность пере- направить зуа. атоса в объект, который даже не является файлом, при условии, что он соответствует ожидаемому протоколу (метод игтте),— в этом случае объект может быть классом, который может обрабатывать и перенаправлять выводимый текст произвольным образом.
Этот прием с перенаправлением потока вывода в первую очередь может оказаться полезен в программах, изначально рассчитанных на использование инструкции рг(п1. Если известно, что весь вывод должен отправляться в файл, вы всегда сможете организовать вызов методов записи в файл.
При перенаправлении потока вывода в программах, основанных на использовании инструкции ргтп1, настройка объекта зуа.з1((оо1 обеспечивает удобную альтернативу изменению поведения всех инструкций рг1п1 или применению перенаправления средствами командной оболочки системы. Расширение рипа» Ие Прием перенаправления вывода текста за счет назначения файла в объекте ауз. асооо1 очень часто используется на практике.
Однако в программном коде предыдущего раздела имеется одна потенциальная проблема — отсутствует прямой способ восстановления первоначального потока вывода, если вдруг после вывода данных в файл потребуется вернуться обратно к выводу на экран. Но поскольку зуз. зтбоо1 является обычным объектом, вы всегда можете в случае необходимости сохранить его и восстановить позднее № Вытолкнуть буферы на диск № Восстановить первоначальный поток »> рг1п1 'Ьасв Пете' Ьвсх Пете »> рг1пт орел(' 1оц. Ьхт'). гвас() зрвв 1 2 3 № Вывести нв экран № Результаты более ранних сбравений № к инструкции рг№пг Потребность в таком перенаправлении возникает на удивление часто, а ручное сохранение и восстановление оригинального потока вывода— процедура достаточно сложная, что привело к появлению расширения для инструкции рг(л1, которое делает такое перенаправление ненужным.
Когда инструкция рг(п1 начинается с символов», вслед эа которыми указывается объект файла (или другой объект) для вывода, такая инструкция посылает текст методу нг!1е указанного объекта, но при этом не происходит перенаправления объекта зуз. з(боо1. Поскольку в этом случае перенаправление носит временный характер, обычные инструкции рг!п1 продолжают выводить текст в оригинальный поток вывода: 1оц = орел('1оц.тхг', 'а') рг1пт » 1оц, х, у, г рг1пт а, Ь, с № Вывести в обьект, нзпоиинаавий файл № Вывести в оригинальный поток вывода Расширение » удобно использовать, когда в одной и той же программе необходимо организовать вывод и в файл, и в стандартный поток вывода. Однако, если вы собираетесь использовать эту форму инструкции, вам потребуется создать объект-файл (или объект, который имеет метод нг11е, как и объект файла) и передавать инструкции этот объект, а не строку с именем файла: Можно также использовать относительно новый атрибут зтоос1 объекта зуз, з1соит, который ссылается на первоначальное значение зув, зшос1, имевшееся на момент запуска программы.
Но вам и в этом случае необходимо вручную восстановить зуз. згбос1 в первоначальное значение зтбоот, чтобы вернуться к оригинальному потоку вывода. За дополнительными подробностями обращайтесь к описанию модуля зув в руководстве по стандартной библиотеке. »> 1врог1 вув »> тавр = вуз.в1СОЬ1 »> вув,втбОот = ОРеп('1ОЦ.тхт', »> ргьп1 'враз' »> рг1п1 1, 2, 3 »> вув.в1бост.с1ове() »> вув.всбоет = тезр Глвва11.
Г)рисззивание, выражения и рггл1 № Сохранить длл последующего восстановлении 'а') № Леренвпрзвить вывод в Файл № Вывести е файл, а не нв экран Инструкция рпп1 »> 1ор = орел('1ор.вх1', 'и') »> Рг1пс » 1оо, 1, 2, 3 »> рг1пв » 1оо, 4, 5, 8 »> 1оо.с1ове() »> рг1пс т, 8, 9 7 8 9 »> рг1пт орел('1ор.вхв'), гваб() 1 2 3 4 5 В Эта расширенная форма инструкции рг!пг нередко используется для вывода сообщений об ошибках в стандартный поток ошибок, вув. в(бегг.
Вы можете либо использовать его метод иг!(е и форматировать выводимые строки вручную, либо использовать синтаксис перенаправления: »> 1арогт вув »> вув.втбегг.иг11а(('Ваб!' * 8) + ''1п') Ваб.'Ваб,'Ваб'Ваб!Ваб'Ваб.'Ваб.'Ваб,' »> рг1пс » вув.втбегг, 'Ваб!' * 8 Ваб' Ваб! Ваб' Ваб' Ваб' Ваб' Ваб! Ваб.' Придется держать в уме: рипа и ВИои1 Эквивалентность инструкции р ы пс и метода и г !(е объекта вув.вшош имеет большое значение.
Она позволяет перенаправить объект вув.в(боы( в определяемый пользователем объект, который поддерживает те же методы, что и файлы (например, иг!1е). Так как инструкция рг(пг всего лишь передает текст методу вув. в!боб(. иг!(е, вы можете перехватывать выводимый текст, перенаправив вув. в(боы( в объект, обладающий методом иг11е для обработки текста. Например, можно отправить текст в окно графического интерфейса или отправить его в несколько мест, определив объект с методом иг!(е, который выполнит все необходимые действия. Пример использования такой возможности вы увидите далее в книге, когда мы будем изучать классы, но в общих чертах это выглядит примерно так: с1авв Е(1еЕаКег; бег иг!1е(ве!г, вгггпр): В Выполнить какие-либо действия со строкой 1арог1 вув вув.в1боы1 = Е11еЕаКвг() рг1пт воаебб)ес1в д Передает строку методу мгбге класса З1г Глава 11 Присваивание, выражения и рпп1 Этот прием возможен благодаря тому, что инструкция рг)пг является тем, что в следующей части книги мы назовем полиморфной операцией, — она не интересуется тем, что из себя представляет объект зув, зЬЬЬЬЬ, ей нужен всего лишь метод (т.
е. интерфейс) с именем нг)ге. В последних версиях РуФЬоп перенаправление в объекты реализовано еще проще, с помощью расширенной формы» инструкции рг1п1, благодаря чему нам не требуется явно перенаправлять объект вуз. зтбоо)К ауоЬ) = Р11вРаквг() В Перенаправление вывода для одной инструкции рыпт » ауоь), эоаеОь)вств в нв влияет нв объект вув.вгооот Встроенная функция гав 1при11) в языке Руь)гоп читает данные из файла вув. в1зш, поэтому существует возможность перенаправить ввод аналогичным образом, используя классы, реализующие метод геас. Смотрите примеры использования функции ган >прот и цикла нл>1е, которые приводятся в главе 10, чтобы получить дополнительные начальные сведения по этой теме.
Обратите внимание: вывод текста осуществляется в поток вгзоог, что обеспечивает возможность вывода документов НТМЕ в С01- сценариях. Кроме того, это позволяет выполнить перенаправление ввода и вывода для сценария на языке РуЫ>оп обычными средствами командной строки операционной системы: рутпоп всгтрт.ру < топоту>!е > оо1ро1Г>1е ьутпоп всггст.оу 1 г>1твгпгосгаа о б«Предполагается, что в РуЫ>оп 3.0 инструкция рг1пт превратится во встроенную функцию с эквивалентными возможностями, ио с несколько иным синтаксисом.
Выходной файл и необходимость вывода символа конца строки будут определяться аргументами с зарезервированными именами. Например, инструкция рггпт х, у превратится в вызов пгтпцх, у), а инструкция рг1пг » г, х— в вызов Пг1пцх, Г>1в=Г, впс=' Но все это будет в будущем, поэтому за дополнительной информацией обращайтесь к примечаниям к выпуску 3.0. В настоящее время предложено включить в версию 3.0 сценарий Гс рабочим названием «2ЬЬЗ»), который кроме всего прочего будет выполнять преобразование инструкций ргтпт в существующем программном коде в вызовы функции рг1пп Ов должен помочь зам в переходе с версии 2.х иа версию З.х (как и эта книга!).