Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
282
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

181

UnicodeError, ’ignore’ — недопустимые символы игнорируются (удаляются), ’replace’ — недопустимые символы заменяются универсальным символом замены (“REPLACEMENT CHARACTER”, u’\uFFFD’).

vars([object])

Без аргументов возвращает словарь, соответствующий локальному пространству имен. Если в качестве аргумента передан объект, представляющий модуль, класс или экземпляр класса (или любой другой объект, имеющий атрибут __dict__), возвращает словарь, соответствующий пространству имен объекта. Не следует вносить изменения в возвращаемый словарь: эффект на соответствующее пространство имен не определен5.

xrange([start,] stop [, step])

Эта функция работает аналогично функции range(), но возвращает объект xrange (см. раздел 11.2.4) вместо списка. Этот тип последовательности позволяет получать точно такие же значения, как и соответствующий список (полученный с помощью функции range() с такими же аргументами), на самом деле не храня их. Преимущества функции xrange() над функцией range() обычно минимальны и проявляются только на очень длинных рядах чисел.

zip(seq1 ...)

Возвращает список, каждый i-й элемент которого является кортежем, составленным из i-х элементов последовательностей seq1, ..., seqN в порядке их следования в списке аргументов. Требуется как минимум один аргумент, в противном случае, генерируется исключение TypeError. Длина возвращаемого списка равна длине самой короткой из последовательностей seq1, ..., seqN. Если все последовательности имеют одинаковую длину, функция zip ведет себя аналогично функции map с None в качестве первого аргумента. Функция доступна, начиная с версии 2.0.

5В текущих реализациях локальные переменные не могут быть изменены таким способом, а пространства имен объектов — могут. Ситуация может измениться в будущих версиях.

182

Глава 13

Встроенные классы исключений

Исключения в языке Python могут быть экземплярами классов и строками. Поддержка строк в качестве исключений оставлена для совместимости с ранними версиями и может быть удалена в будущем. Классы встроенных исключений определены в стандартном модуле exceptions. Нет необходимости явно импортировать этот модуль — все определенные в нем классы исключений всегда доступны аналогично другим встроенным объектам (определены в пространстве встроенных имен).

Если в ветви except инструкции try указывается объект-класс C, эта ветвь будет обрабатывать любое “совместимое” с указанным классом исключение, то есть если оно является экземпляром C или производного от него класса. Например, ветвь ‘except ValueError:’ будет обрабатывать исключения UnicodeError1, но ‘except UnicodeError:’ не будет перехватывать исключения ValueError. Два класса исключений, ни один из которых не является производным (прямо или косвенно) от другого, никогда не будут эквивалентными, даже если они имеют одинаковое имя (под именем исключения подразумевается имя класса, то есть значение атрибута __name__ объектакласса).

Описанные ниже встроенные исключения генерируются интерпретатором, встроенными функциями и методами объектов встроенных типов. Исключения могут иметь ассоциированное с ним значение (аргумент или несколько аргументов, используемые при его инициализации), описывающее причину возникновения исключительной ситуации. Если класс исключения является производным от стандартного класса Exception, аргументы, используемые при инициализации, сохраняются в атрибуте args.

Пользовательский код также может генерировать исключения встроенных типов для тестирования обработчиков ошибок, а также, если необходимо сообщить об ошибке (или другой исключительной ситуации), для которой данный встроенный класс исключений предназначен.

Ниже приведена иерархия встроенных классов исключений.

Exception

Базовый класс для всех встроенных классов исключений. Рекомендуется также использовать его для всех пользовательских классов исключений. Атрибут args его

1Здесь и далее под “исключениями SomeError” или “исключениями типа SomeError” подразумеваются “исключения, являющиеся экземплярами класса SomeError”, если речь идет о генерируемом исключении, и “исключения, являющиеся экземплярами SomeError и производных от него классов”, если речь идет о перехватываемом исключении.

183

экземпляров содержит список аргументов, которые использовались при его инициализации. Встроенная функция str(), при применении к экземплярам класса Exception, возвращает строковое значение аргумента (если при инициализации использовался один аргумент), кортежа аргументов (если при инициализации использовалось более одного аргумента) или пустую строку (если конструктор вызывался без аргументов). Кроме того, Вы можете получить доступ (только для чтения) к аргументам, используя операцию получения элемента по индексу (exc[i]).

StandardError

Базовый класс исключений, предназначенных для генерации при возникновении стандартных ошибок (то есть всех ошибок, которые могут возникнуть при использовании встроенных средств языка).

ArithmeticError

Базовый класс исключений, генерируемых при возникновении арифметических ошибок.

FloatingPointError

Исключения этого класса генерируются, если возникают проблемы с выполнением операции с плавающей точкой (могут генерироваться только если Python сконфигурирован с опцией --with-fpectl или в файле ‘config.h’ определено имя WANT_SIGFPE_HANDLER).

OverflowError

Используется, когда результат арифметической операции слишком большой, чтобы его можно было представить в рамках используемого типа. Заметим, что этого не может произойти при использовании длинного целого типа (long int) — скорее будет сгенерировано исключение MemoryError. Из-за того, что обработка ошибок при операциях с плавающей точкой в языке C не стандартизована, большинство таких операций не проверяются. Для обычных целых чисел (int), все операции, которые могут привести к переполнению, проверяются, за исключением сдвига влево, так как в этом случае потеря старших бит считается предпочтительнее генерации исключения.

ZeroDivisionError

Используется, если второй операнд операторов деления и получения остатка от деления равен нулю.

AssertionError

Исключения этого класса генерируются, если не выполняется условие, указанное в инструкции assert.

AttributeError

Исключения этого класса генерируются в случаях, когда невозможно получить значение атрибута с определенным именем, удалить его или присвоить ему новое значение. Если объекты данного типа вообще не поддерживают используемый доступ к атрибутам (получение значения, удаление или присваивание), генерируется исключение TypeError.

EOFError

Исключения этого класса генерируются некоторыми встроенными функциями (input(), raw_input()), если достигается конец файла и, при этом, из него не считано ни байта информации. Обратите внимание на то,

184 Глава 13. Встроенные классы исключений

что методы read() и readline() файловых объектов при достижении конца файла возвращают пустую строку.

EnvironmentError

Базовый класс исключений, генерируемых при ошибках, возникающих за пределами интерпретатора Python. Если при инициализации исключений этого типа используются 2 или 3 аргумента, первый из них считается кодом ошибки, второй — строкой, поясняющей причину ее возникновения, и третий (необязательный) — имя файла, с которым связана возникшая ошибка. В этом случае аргументы (помимо унаследованного атрибута args) сохраняются соответственно в атрибутах errno, strerror и filename и используются для создания строкового представления (функция str()) в виде ’[Errno errno] strerror’ или ’[Errno errno] strerror: filename’.

IOError

Используется при ошибках ввода/вывода, например, если не найден файл с указанным именем или на носителе нет свободного места.

OSError

Исключения этого класса (доступного также как os.error) в основном генерируются функциями модуля os.

WindowsError

Используется при ошибках, специфичных для операционных систем Windows или код ошибки не соответствует значению errno. Значения атрибутов errno и strerror создаются из значений, возвращаемых функциями Windows API GetLastError() и FormatMessage() соответственно. Добавлен в версии 1.6.

ImportError

Исключения этого класса генерируются, если модуль с указанным в инструкции import именем не может быть импортирован или в модуле не найдено имя, указанное в инструкции from ... import ....

KeyboardInterrupt

По умолчанию, если интерпретатор получает сигнал SIGINT, например, при прерывании с клавиатуры (обычно клавишами Ctrl-C), генерируется исключение KeyboardInterrupt. Вы можете изменить реакцию на сигнал SIGINT, воспользовавшись функцией signal.signal(). Прерывание в момент ожидания ввода, при использовании функций input() и raw_input(), а также методов read(), readline() и readlines()

файлового объекта, представляющего устройство tty, также генерируется исключение KeyboardInterrupt2.

LookupError

 

Базовый

класс исключений, генерируемых, если последователь-

ность или

отображение не содержит элемента с заданным индек-

сом или ключом. Может быть сгенерировано напрямую функцией sys.setdefaultencoding().

2На самом деле, поведение зависит от используемой платформы. Например, под Windows NT при прерывании в момент работы функций input() и raw_input() сначала будет сгенерировано исключение

EOFError.

185

IndexError

Используется в случаях, когда индекс, используемый для получения элемента последовательности, выходит за пределы диапазона. Заметим, что индексы среза в этом случае считаются указывающими на конец или начало последовательности, и ошибки не возникает. Если индекс не является обычным целым числом, генерируется исключение

TypeError.

KeyError

Исключения этого класса генерируются, если в отображении не найдена запись с указанным ключом. В качестве аргумента при инициализации экземпляра исключения обычно используется ключ.

MemoryError

Используется, если для выполнения операции не хватает памяти, но из сложившейся ситуации еще можно выйти, удалив некоторые объекты. Экземпляр исключения может быть инициализирован строкой, указывающей род (внутренней) операции, для выполнения которой не хватило памяти. Заметим, что лежащая в основе интерпретатора архитектура управления памятью (функция malloc() языка C) не всегда позволяет полностью восстановиться из подобных ситуаций. В любом случае генерируется исключение MemoryError и сообщение об ошибке (включая информацию о месте ее возникновения) может быть выведена в стандартный поток ошибок.

NameError

Исключения этого класса генерируются, если используемое в программе локальное или глобальное имя не найдено. Это имя используется в качестве аргумента при инициализации экземпляра исключения.

UnboundLocalError

Используется в случае, если Вы неявно ссылаетесь на глобальную переменную (не использовав предварительно инструкцию global), а затем пытаетесь удалить ее или присвоить ей новое значение. Добавлен в версии 1.6.

RuntimeError

Используется при ошибках времени выполнения, которые не попадают ни в одну из описанных выше категорий. В качестве аргумента при инициализации используется строка с информацией об ошибке. Это исключение является пережитком прошлых версий языка и в настоящее время используется не слишком часто.

NotImplementedError

Исключения этого класса следует использовать при определении абстрактных методов пользовательских классов-интерфейсов для того, чтобы показать, что метод должен быть переопределен в производных классах.

SyntaxError

Используется синтаксическим анализатором при обнаружении синтаксических ошибок. Подобные ошибки могут возникнуть при использовании инструкций import и exec, функций eval() и input(), а также при чтении инструкций из файла или стандартного потока ввода (в том числе

186

Глава 13. Встроенные классы исключений

в интерактивном режиме).

Экземпляры этого класса исключений имеют атрибуты: filename и lineno — имя файла и номер строки в которых обнаружена ошибка, text — текст строки, содержащей ошибку, offset — место в строке, где ошибка была обнаружена синтаксическим анализатором, и msg — сообщение об ошибке. Экземпляр исключения инициализируется в виде ‘SyntaxError(msg, (filename, lineno, offset, text))’. Функция str(), применительно к экземплярам исключения, возвращает только сообщение об ошибке (атрибут msg).

SystemError

Исключения этого класса генерируются в случае обнаружения внутренних ошибок. В качестве аргумента при инициализации используется строка, с подробностями (используется терминология низкого уровня). О возникновении подобных ошибок следует сообщать авторам языка.

TypeError

Исключения этого класса генерируются, какая-либо операция применяется к объекту несоответствующего типа. В качестве аргумента при инициализации исключения используется строка, указывающая на детали несоответствия типа.

ValueError

Исключения этого класса генерируются, какая-либо операция применяется к объекту правильного типа, но имеющего несоответствующее значение, и ситуация не может быть описана более точно с помощью исключения другого типа (например, IndexError).

UnicodeError

Используется при ошибках преобразования строки в определенной кодировке в строку Unicode и наоборот. Добавлен в версии 1.6.

SystemExit

Исключения этого класса генерируются функцией sys.exit(). Если исключение не обрабатывается, выполнение программы молча прерывается. В качестве аргумента при инициализации используется целое число — код ошибки, передаваемый функции exit() языка C. По умолчанию и, если используется None, код завершения считается равным 0. Если при инициализации использован аргумент другого типа или несколько аргументов, аргумент или кортеж аргументов выводится в стандартный поток ошибок. В любом случае, аргумент или кортеж аргументов сохраняется в виде атрибута code. SystemExit является производным непосредственно от Exception, а не StandardError, так как фактически исключения SystemExit не являются ошибкой.

Вызов функции sys.exit() преобразуется в генерацию исключения для того, чтобы могла быть выполнена очистка (ветвь finally инструкции try) и отладчик мог выполнить программу без потери контроля. Если все же необходимо немедленно прервать выполнение программы (например, после вызова функции os.fork() в дочернем процессе), воспользуйтесь функцией os._exit().

Часть III

Библиотека стандартных модулей

189

Описание языка Python было бы неполным без описания библиотеки — огромной коллекции модулей. Некоторые модули написаны на C и встраиваются в интерпретатор, другие написаны на языке Python и доступны в исходном виде. Некоторые модули предоставляют услуги, характерные для языка Python (например, вывод сообщений об ошибках) или определенной операционной системы (например, доступ к определенным аппаратным средствам), другие определяют интерфейсы, характерные для некоторой области применения (например, WWW).

К сожалению, невозможно в рамках однотомного издания описать даже стандартные модули, обычно поставляемые вместе с интерпретатором языка. Поэтому мы постараемся остановиться на основных, наиболее универсальных.

190

Глава 14

Конфигурационные модули

14.1 site — общая конфигурация

Этот модуль автоматически импортируется при каждом запуске интерпретатора (за исключением случаев, когда используется опция командной строки -S) и предназначен, в первую очередь, для добавления путей поиска модулей, характерных для данной машины. По умолчанию в пути поиска добавляются каталоги с именами ‘sys.prefix + ’/lib/site-packages’ и ‘sys.prefix + ’/site-python’

(UNIX) или sys.prefix (другие платформы). Кроме того, модуль обрабатывает конфигурационные файлы путей вида ‘package.pth’ во всех указанных каталогах. Эти конфигурационные файлы должны содержать дополнительные пути (по одному каталогу в строке), которые будут включены в sys.path. Пустые строки и строки, начинающиеся с ‘#’, игнорируются.

Например, пусть стандартные библиотеки установлены в каталоге ‘/usr/lib/python1.5’, в котором присутствует подкаталог ‘site-packages’. Пусть каталог ‘/usr/lib/python1.5/site-packages’ в свою очередь содержит вложенные каталоги ‘foo’, ‘bar’ и ‘spam’ и конфигурационные файлы ‘foo.pth’ и ‘bar.pth’. Предположим, файл ‘foo.pth’ содержит следующие строки:

# foo package configuration

foo bar bletch

иbar.pth’ содержит:

#bar package configuration

bar

Тогда в sys.path будут добавлены каталоги ‘/usr/lib/python1.5/site-packages/bar’ и ‘/usr/lib/python1.5/site-packages/foo’.

Обратите внимание, что каталоги ‘bletch’ и ‘spam’ не добавляются, так как не существует файла или каталога с именем ‘bletch’ и каталог ‘spam’ не упомянут ни в одном из конфигурационных файлов.