Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16
Скачать 0.72 Mb.
|
любой объект Python в файле, а затем извлекать его обратно. Это называется длительным хранением объекта. Пример: (сохраните как pickling.py ): import pickle # имя файла, в котором мы сохраним объект shoplistfile = 'shoplist.data' # список покупок shoplist = [ 'яблоки' , 'манго' , 'морковь' ] # Запись в файл f = open (shoplistfile, 'wb' ) pickle dump(shoplist, f) # помещаем объект в файл f close() del shoplist # уничтожаем переменную shoplist (продолжение на следующей странице) 3 pickle – англ. «мариновать», «солить» (прим.перев.) 15.3. Pickle 124 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) # Считываем из хранилища f = open (shoplistfile, 'rb' ) storedlist = pickle load(f) # загружаем объект из файла (storedlist) Вывод: $ python3 pickling.py ['яблоки', 'манго', 'морковь'] Как это работает: Чтобы сохранить объект в файле, нам нужно сперва открыть файл с помощью open в режиме бинарной записи ( 'wb' ), после чего вызвать функцию dump из модуля pickle . Этот процесс называется «консервацией» («pickling»). После этого мы извлекаем объект при помощи функции load из модуля pickle , которая возвращает объект. Этот процесс называется «расконсерва- цией» («unpickling»). 15.4 Резюме Мы обсудили разные типы ввода/вывода, а также работу с файлами и использование мо- дуля pickle Далее мы познакомимся с концепцией исключений. 15.4. Резюме 125 Исключения Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или ес- ли файл был случайно удалён, пока программа работала? Такие ситуации обрабатывают- ся при помощи исключений. Это касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку. 16.1 Ошибки Рассмотрим простой вызов функции print . Что, если мы ошибочно напишем print как ? Обратите внимание на заглавную букву. В этом случае Python поднимает синтак- сическую ошибку. >>> Print( 'Привет, Мир!' ) Traceback (most recent call last): File " " , line 1 , in Print( 'Привет, Мир!' ) NameError : name 'Print' is not defined >>> ( 'Привет, Мир!' ) Привет, Мир! Обратите внимание, что была поднята ошибка NameError , а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок. 16.2 Исключения Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт. >>> s = input ( 'Введите что-нибудь --> ' ) Введите что-нибудь --> (продолжение на следующей странице) 126 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) Traceback (most recent call last): File " " , line 1 , in s = input ( 'Введите что-нибудь --> ' ) EOFError : EOF when reading a line Python поднимает ошибку с именем EOFError , что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D ) там, где не ожидал. 16.3 Обработка исключений Обрабатывать исключения можно при помощи оператора try..except 1 . При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок. Пример: (сохраните как try_except.py ) try : text = input ( 'Введите что-нибудь --> ' ) except EOFError : ( 'Ну зачем вы сделали мне EOF?' ) except KeyboardInterrupt : ( 'Вы отменили операцию.' ) else : ( 'Вы ввели {0} ' format(text)) Вывод: $ python3 try_except.py Введите что-нибудь --> # Нажмите ctrl-d Ну зачем вы сделали мне EOF? $ python3 try_except.py Введите что-нибудь --> # Нажмите ctrl-c Вы отменили операцию. $ python3 try_except.py Введите что-нибудь --> без ошибок Вы ввели без ошибок Как это работает: Здесь мы поместили все команды, которые могут вызвать исключе- ния/ошибки, внутрь блока try , а затем поместили обработчики соответству- 1 try – англ. «пытаться» (прим.перев.) 16.3. Обработка исключений 127 A Byte of Python (Russian), Версия 2.02 ющих ошибок/исключений в блок except . Выражение except может об- рабатывать как одиночную ошибку или исключение, так и список оши- бок/исключений в скобках. Если не указано имя ошибки или исключения, об- рабатываться будут все ошибки и исключения. Помните, что для каждого выражения try должно быть хотя бы одно соответствующее выражение except . Иначе какой смысл был бы в блоке try ? Если ошибка или исключение не обработано, будет вызван обработчик Python по умол- чанию, который останавливает выполнение программы и выводит на экран сообщение об ошибке. Выше мы уже видели это в действии. Можно также добавить пункт else к соответствующему блоку try..except . Этот пункт будет выполнен тогда, когда исключений не возникает. В следующем примере мы увидим, как можно получить объект исключения для дальней- шей работы с ним. 16.4 Вызов исключения Исключение можно поднять при помощи оператора raise 2 , передав ему имя ошиб- ки/исключения, а также объект исключения, который нужно выбросить. Вызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception Пример: (сохраните как raising.py ) class ShortInputException ( Exception ): '''Пользовательский класс исключения.''' def __init__ ( self , length, atleast): Exception __init__ ( self ) self length = length self atleast = atleast try : text = input ( 'Введите что-нибудь --> ' ) if len (text) < 3 : raise ShortInputException( len (text), 3 ) # Здесь может происходить обычная работа except EOFError : ( 'Ну зачем вы сделали мне EOF?' ) except ShortInputException as ex: ( 'ShortInputException: Длина введённой строки -- {0} ; \ ожидалось, как минимум, {1} ' format(ex length, ex atleast)) (продолжение на следующей странице) 2 raise – англ. «поднимать» (прим.перев.) 16.4. Вызов исключения 128 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) else : ( 'Не было исключений.' ) Вывод: $ python3 raising.py Введите что-нибудь --> а ShortInputException: Длина введённой строки -- 1; ожидалось, как минимум, 3 $ python3 raising.py Введите что-нибудь --> абв Не было исключений. Как это работает: Здесь мы создаём наш собственный тип исключения. Этот новый тип исклю- чения называется ShortInputException . Он содержит два поля: length , хра- нящее длину введённого текста, и atleast , указывающее, какую минималь- ную длину текста ожидала программа. В пункте except мы указываем класс ошибки ShortInputException , кото- рый будет сохранён как 3 переменная ex , содержащая соответствующий объ- ект ошибки/исключения. Это аналогично параметрам и аргументам при вы- зове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользова- телю. 16.5 Try .. Finally Представим, что в программе происходит чтение файла и необходимо убедиться, что объ- ект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally Сохраните как finally.py : import time try : f = open ( 'poem.txt' ) while True : # наш обычный способ читать файлы line = f readline() if len (line) == 0 : (продолжение на следующей странице) 3 as – англ. «как» (прим.перев.) 16.5. Try .. Finally 129 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) break (line, end = '' ) time sleep( 2 ) # Пусть подождёт некоторое время except KeyboardInterrupt : ( '!! Вы отменили чтение файла.' ) finally : f close() ( '(Очистка: Закрытие файла)' ) Вывод: $ python3 finally.py Программировать весело Если работа скучна, Чтобы придать ей весёлый тон - !! Вы отменили чтение файла. (Очистка: Закрытие файла) Как это работает: Здесь мы производим обычные операции чтения из файла, но в данном слу- чае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep , чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c , чтобы прервать/отменить выполнение программы. Пронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt , и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally , и файловый объект будет всегда закрыт. 16.6 Оператор with Типичной схемой является запрос некоторого ресурса в блоке try с последующим осво- бождением этого ресурса в блоке finally . Для того, чтобы сделать это более «чисто», существует оператор with 4 : Сохраните как using_with.py : with open ( "poem.txt" ) as f: for line in f: (line, end = '' ) 4 with – англ. «с» (прим.перев.) 16.6. Оператор with 130 A Byte of Python (Russian), Версия 2.02 Как это работает: Вывод должен быть таким же, как и в предыдущем примере. Разница лишь в том, что здесь мы используем функцию open с оператором with – этим мы оставляем автоматическое закрытие файла под ответственность with open За кулисами происходит следующее. Существует некий протокол, используе- мый оператором with . Он считывает объект, возвращаемый оператором open Назовём его в данном случае «thefile». Перед запуском блока кода, содержащегося в нём, оператор with всегда вы- зывает функцию thefile.__enter__ , а также всегда вызывает thefile. __exit__ после завершения выполнения этого блока кода. Так что код, который мы бы написали в блоке finally , будет автоматически обработан методом __exit__ . Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally Более обширное рассмотрение этой темы выходит за рамки настоящей книги, поэтому для более исчерпывающего объяснения см. PEP 343 16.7 Резюме Мы обсудили использование операторов try..except и try..finally . Мы также уви- дели, как создавать наши собственные типы исключений и как их вызывать. Далее мы ознакомимся со стандартной библиотекой Python. 16.7. Резюме 131 Стандартная библиотека Стандартная библиотека Python содержит огромное количество полезных модулей и яв- ляется частью стандартного комплекта поставки Python. Ознакомиться со стандартной библиотекой Python очень важно, так как множество задач можно решить очень быстро, если вы знакомы с возможностями этих библиотек. Рассмотрим некоторые наиболее часто используемые модули этой библиотеки. Деталь- ное описание всех модулей стандартной библиотеки Python можно найти в разделе «Library Reference» документации, входящей в комплект поставки Python. Давайте изучим несколько полезных модулей. Примечание Если темы в настоящей главе покажутся вам слишком сложными, вы можете её пропу- стить. Однако я настоятельно рекомендую вернуться к этой главе, когда вы будете чув- ствовать себя более уверенно с Python. 17.1 Модуль sys Модуль sys содержит функциональность, характерную для системы. Так мы видели, что список sys.argv содержит аргументы командной строки. Предположим, нам нужно узнать версию используемой команды Python с тем, чтобы, к примеру, убедиться в том, что мы используем как минимум версию 3. Модуль sys предо- ставляет такую возможность. >>> import sys >>> sys version_info (3, 0, 0, 'beta', 2) >>> sys version_info[ 0 ] >= 3 True 132 A Byte of Python (Russian), Версия 2.02 Как это работает: Модуль sys содержит кортеж version_info , который хранит информацию о версии. Первый элемент этого кортежа обозначает старшую версию. Мы мо- жем использовать его, например, для того, чтобы убедиться, что программа будет выполняться только в Python 3.0: Сохраните как versioncheck.py : import sys , warnings if sys version_info[ 0 ] < 3 : warnings warn( "Для выполнения этой программы необходима как минимум \ версия Python 3.0" , RuntimeWarning ) else : ( 'Нормальное продолжение' ) Вывод: $ python2.7 versioncheck.py versioncheck.py:6: Для выполнения этой программы необходима как минимум � , → версия Python 3.0 RuntimeWarning) $ python3 versioncheck.py Нормальное продолжение Как это работает: Мы используем один из модулей стандартной библиотеки, который называ- ется warnings и служит для отображения предупреждений пользователю. Ес- ли версия Python менее 3, мы показываем соответствующее предупреждение. 17.2 Модуль logging Представьте ситуацию, когда необходимо сохранить некоторые отладочные или другие важные сообщения где-нибудь, чтобы иметь возможность позже проверить, отработала ли программа, как ожидалось. Как мы «сохраним где-нибудь» эти сообщения? Сделать это можно при помощи модуля logging Сохраните как use_logging.py : import os , platform , logging if platform platform() startswith( 'Windows' ): logging_file = os path join(os getenv( 'HOMEDRIVE' ), \ (продолжение на следующей странице) 17.2. Модуль logging 133 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) os getenv( 'HOMEPATH' ), \ 'test.log' ) else : logging_file = os path join(os getenv( 'HOME' ), 'test.log' ) ( "Сохраняем лог в" , logging_file) logging basicConfig( level = logging DEBUG, format = ' %(asctime)s : %(levelname)s : %(message)s ' , filename = logging_file, filemode = 'w' , ) logging debug( "Начало программы" ) logging info( "Какие-то действия" ) logging warning( "Программа умирает" ) Вывод: $ python3 use_logging.py Сохраняем лог в C:\Users\swaroop\test.log Если открыть файл test.log , он будет выглядеть примерно так: 2012 - 10 - 26 16 : 52 : 41 , 457 : DEBUG : Начало программы 2012 - 10 - 26 16 : 52 : 41 , 474 : INFO : Какие - то действия 2012 - 10 - 26 16 : 52 : 41 , 475 : WARNING : Программа умирает Как это работает: Мы использовали три модуля из стандартной библиотеки: модуль os для вза- имодействия с операционной системой, модуль platform для получения ин- формации о платформе (т.е. операционной системе) и модуль logging для сохранения лога 1 Прежде всего, при помощи строки, возвращаемой функцией platform. platform() мы проверяем, какая операционная система используется (для более подробной информации см. import platform; help(platform) ). Ес- ли это Windows, то мы определяем диск, содержащий домашний каталог, путь к домашнему каталогу на нём и имя файла, в котором хотим сохранить ин- формацию. Сложив все эти три части, мы получаем полный путь к файлу. Для других платформ нам нужно знать только путь к домашнему каталогу пользователя, и мы получим полный путь к файлу. 1 log – англ. «журнал», «вести журнал» (прим.перев.) 17.2. Модуль logging 134 A Byte of Python (Russian), Версия 2.02 При помощи функции os.path.join() мы объединяем три части пути к файлу вместе. Мы используем эту функцию вместо простого объединения строк для того, чтобы гарантировать, что полный путь к файлу записан в фор- мате, ожидаемом операционной системой. Далее мы конфигурируем модуль logging таким образом, чтобы он записы- вал все сообщения в определённом формате в указанный файл. Наконец, мы можем выводить сообщения, предназначенные для отладки, ин- формирования, предупреждения и даже критические сообщения. После вы- полнения программы можно просмотреть этот файл и узнать, что происхо- дило в программе, хотя пользователю, запустившему программу, ничего не было показано. 17.3 Серия «Модуль недели» В стандартной библиотеке можно найти ещё много полезного. Например, отладка , обра- ботка параметров командной строки , регулярные выражения и так далее. Лучший способ дальнейшего изучения стандартной библиотеки – читать замечательную серию Дуга Хелмана «Модуль недели» или официальную документацию Python 17.4 Резюме Мы изучили лишь некоторые возможности некоторых модулей стандартной библиотеки Python. Я настоятельно рекомендую просмотреть документацию по стандартной библио- теке Python , чтобы увидеть все доступные модули. Далее мы обратимся к некоторым аспектам, которые сделают вашу экскурсию по Python более «завершённой». |