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

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

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

15.4. types — имена для всех встроенных типов

201

register(func ...)

Регистрирует func как функцию, которая должна быть выполнена при завершении работы программы. Все остальные аргументы (позиционные и именованные) будут сохранены и использованы для вызова func.

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

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

try:

_count = int(open("/tmp/counter").read()) except IOError:

_count = 0

def incrcounter(n): global _count _count = _count + n

def savecounter():

open("/tmp/counter", "w").write("%d" % _count)

import atexit atexit.register(savecounter)

См. также реализацию модуля readline, демонстрирующую использование возможностей модуля atexit для чтения и записи файлов истории команд.

15.4types — имена для всех встроенных типов

Этот модуль определяет имена для всех встроенных типов объектов, используемых интерпретатором (сами типы описаны в главе 11). Вполне безопасно использовать инструкцию ‘from types import *’ — модуль не определяет никаких имен, кроме тех, которые здесь перечислены. Все имена, которые будут добавлены в будущих версиях этого модуля, будут иметь окончание ‘Type’.

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

202

Глава 15. Служебные модули

from types import * def delete(list, item):

if type(item) is IntType: del list[item]

else:

list.remove(item)

Модуль определяет следующие имена:

NoneType

Объект, имеющий тип None. Существует только один объект этого типа — None (пустой объект).

TypeType

Объект, имеющий тип type (тип) — тип объектов, возвращаемых встроенной функцией type(). Все объекты, определенные в этом модуле, являются объектами именно этого типа.

IntType

Объект, имеющий тип int (целое число, например, 1).

LongType

Объект, имеющий тип long int (длинное целое число, например, 1L).

FloatType

Объект, имеющий тип float (вещественное число, например, 1.0).

ComplexType

Объект, имеющий тип complex (комплексное число, например, 1.0j).

StringType

Объект, имеющий тип string (строка, например, ’Python’).

UnicodeType

Объект, имеющий тип unicode (строка Unicode, например, u’Python’).

TupleType

Объект, имеющий тип tuple (кортеж, например, ‘(1, 2, 3)’).

XRangeType

Объект, имеющий тип xrange. Объекты этого типа возвращаются встроенной функцией xrange().

BufferType

Объект, имеющий тип buffer (буфер, создается встроенной функцией buffer).

ListType

Объект, имеющий тип list (список, например, ‘[1, 2, 3]’).

15.4. types — имена для всех встроенных типов

203

DictType

DictionaryType

Два альтернативных имени для объекта, представляющего тип dictionary (словарь, например, ‘{’СЪЩЛ’: ’Python’, ’ЧЕТУЙС’: ’2.0’}’).

FunctionType

LambdaType

Два альтернативных имени для объекта, представляющего тип function (функция, определенная пользователем). Такой тип имеют объекты, определенные с помощью инструкции def или оператора lambda.

CodeType

Объект, имеющий тип code (объект кода, например, возвращаемый встроенной функцией compile()).

ClassType

Объект, имеющий тип class (класс). Объект-класс создается инструкцией class.

InstanceType

Объект, имеющий тип instance (экземпляр класса). Экземпляры создаются при применении операции вызова к объекту-классу.

MethodType

UnboundMethodType

Два альтернативных имени для объекта, представляющего тип method (метод, определенный пользователем).

BuiltinFunctionType

BuiltinMethodType

Два альтернативных имени для объекта, представляющего тип builtin_function_or_method (встроенная функция или метод, например,

abs()).

ModuleType

Объект, имеющий тип module (модуль).

FileType

Объект, имеющий тип file (файловый объект, например, создаваемый встроенной функцией open()).

SliceType

Объект, имеющий тип slice (срез). Объекты этого типа создаются при использовании расширенной записи среза и встроенной функцией slice().

EllipsisType

Объект, имеющий тип ellipsis. Существует только один объект этого типа — Ellipsis (эллипсис), он указывает на использование троеточия в расширенной записи среза.

204

Глава 15. Служебные модули

TracebackType

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

FrameType

Объект, имеющий тип frame (кадр стека). Объекты этого типа представляют окружение, в котором выполняется блок кода.

15.5 operator — операторы в виде функций

Модуль operator определяет набор функций, реализованных на языке C, соответствующих операторам языка Python. Обычно функции имеют такие же имена, как и специальные методы классов, предназначенных для выполнения соответствующих операций. Например, выражения ‘operator.add(x, y)’ и ‘x + y’ эквивалентны. Для удобства также определены имена без ‘__’ в начале и конце имени.

Модуль определяет следующие функции:

add(x, y)

__add__(x, y)

Возвращает x + y.

sub(x, y)

__sub__(x, y)

Возвращает x - y.

mul(x, y)

__mul__(x, y)

Возвращает x * y.

div(x, y)

__div__(x, y)

Возвращает x / y.

mod(x, y)

__mod__(x, y)

Возвращает x % y.

neg(x)

__neg__(x)

Возвращает -x.

pos(x, y)

__pos__(x, y)

Возвращает +x.

15.5. operator — операторы в виде функций

205

abs(x) __abs__(x)

Возвращает абсолютное значение x (см. описание встроенной функции abs()).

inv(x) __inv__(x)

invert(x) __invert__(x)

Возвращает ~x. Имена invert() и __invert__() добавлены в версии 2.0.

lshift(x, y)

__lshift__(x, y)

Возвращает x << y.

and_(x, y)

__and__(x, y)

Возвращает x & y.

or_(x, y)

__or__(x, y)

Возвращает x | y.

xor(x, y)

__xor__(x, y)

Возвращает x ^ y.

not_(x)

__not__(x)

Возвращает not x.

truth(x)

Возвращает 1, если x является истиной, иначе возвращает 0.

concat(seq1, seq2)

__concat__(seq1, seq2)

Возвращает seq1 + seq2, где seq1 и seq2 должны быть последовательностями встроенного типа.

repeat(seq, n)

__repeat__(seq, n)

Возвращает seq * n, где seq должен быть последовательностью встроенного типа, а n — целым числом.

contains(x, y)

__contains__(x, y) sequenceIncludes(x, y)

Возвращает результат проверки вхождения y in x. Обратите внимание на порядок следования операндов. Имя __contains__() определено, начиная с версии

206

Глава 15. Служебные модули

2.0, имя sequenceIncludes() присутствует лишь для совместимости с предыдущими версиями.

countOf(x, y)

Возвращает число вхождений y в x. Эта функция никогда не использует метод count() экземпляров-последовательностей, а просто последовательно перебирает и сравнивает с y все элементы последовательности x.

indexOf(x, y)

Возвращает индекс первого элемента x, равного y. Эта функция никогда не использует метод index() экземпляров-последовательностей, а просто последовательно перебирает и сравнивает с y элементы последовательности x. Если x не содержит y, генерируется исключение ValueError.

getitem(x, y)

__getitem__(x, y)

Возвращает x[y].

setitem(x, y, z)

__setitem__(x, y, z)

Выполняет присваивание ‘x[y] = z’.

delitem(x, y)

__delitem__(x, y)

Эквивалентно инструкции ‘del x[y]’.

getslice(x, y, z)

__getslice__(x, y, z)

Возвращает x[y:z].

setslice(x, y, z, v)

__setslice__(x, y, z, v)

Выполняет присваивание ‘x[y:z] = v’.

delslice(x, y, z)

__delslice__(x, y, z)

Эквивалентно инструкции ‘del x[y:z]’.

isCallable(obj)

Возвращает 1, если объект obj поддерживает вызов, иначе возвращает 0. Эта функция существует для совместимости с предыдущими версиями — используйте вместо нее встроенную функцию callable().

isMappingType(obj)

Возвращает 1, если объект obj может быть отображением, то есть является словарем или экземпляром (произвольного) класса, иначе возвращает 0. Не существует надежного способа определить, поддерживает ли экземпляр класса все операции, характерные для отображения.

15.5. operator — операторы в виде функций

207

isNumberType(obj)

Возвращает 1, если obj может быть объектом числового типа, то есть является объектом встроенного числового типа или экземпляром (произвольного) класса, иначе возвращает 0. Не существует надежного способа определить, поддерживает ли экземпляр класса все операции, характерные для чисел.

isSequenceType(obj)

Возвращает 1, если obj может быть объектом числового типа, то есть является последовательностью одного из встроенных типов или экземпляром (произвольного) класса, иначе возвращает 0. Не существует надежного способа определить, поддерживает ли экземпляр класса все операции, характерные для последовательностей.

Чаще всего определенные здесь функции используются в качестве первого аргумента встроенных функций map() и reduce(). Например, самый быстрый способ подсчитать сумму элементов последовательности seq — вычислить выражение ‘reduce(operator.add, seq)’.

Для удобства ниже приведена таблица соответствия операторов функциям, определенным в модуле operator.

Оператор

Функция

a (точнее not not a)

truth(a)

not

a

not_(a)

-a

neg(a)

a +

b

add(a, b)

a -

b

sub(a, b)

a *

b

mul(a, b)

a /

b

div(a, b)

a %

b

mod(a, b)

~a

invert(a)

a &

b

and_(a, b)

a ^

b

xor(a, b)

a |

b

or_(a, b)

a << b

lshift(a, b)

a >> b

rshift(a, b)

seq1 +

seq2

concat(seq1, seq2)

seq

* i

repeat(seq, i)

o in seq

contains(seq, o)

o[k]

getitem(o, k)

o[k] = v

setitem(o, k, v)

del o[k]

delitem(o, k)

seq[i:j]

getslice(seq, i, j)

seq[i:j] = values

setslice(seq, i, j, values)

del seq[i:j]

delslice(seq, i, j)

 

 

 

208

Глава 15. Служебные модули

15.6traceback — модуль для работы с объектами traceback

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

Модуль traceback определяет следующие функции:

print_tb(traceback [, limit [, file]])

Выводит до limit уровней информации из объекта traceback, начиная с места перехвата исключения, в сторону места, где оно было сгенерировано (именно так описывают путь вложенные друг в друга объекты traceback). Если аргумент limit опущен или равен None, выводится информация для sys.tracebacklimit (10000, если переменная sys.tracebacklimit не определена) вложенных объектов traceback. Вся информация выводится в file (должен быть объектом с методом write()) или стандартный поток вывода, если аргумент file не задан.

print_exception(type, value, traceback [, limit [, file]])

Работает аналогично функции print_tb(), но помимо вывода информации из объекта traceback выполняет следующие действия:

Если аргумент traceback не равен None, выводит заголовок ‘Traceback (most recent call last):’.

Выводит информацию о возникшем исключении (type и value; должны быть объектами, описывающими тип и значение исключения).

Если type is SyntaxError и value имеет соответствующий формат, выводит строку, в которой возникла синтаксическая ошибка с символом ‘^’, указывающим на место обнаружения ошибки интерпретатором.

Именно таким образом выводятся сообщения об ошибке самим интерпретатором.

print_exc([limit [, file]])

Вызов этой функции эквивалентен вызову ‘print_exception(*(sys.exc_info() + (limit, file)))’.

print_last([limit [, file]])

Вызов этой функции эквивалентен вызову ‘print_exception(sys.last_type,

sys.last_value, sys.last_traceback, limit, file)’.

15.6. traceback — модуль для работы с объектами traceback

209

print_stack([frame [, limit [, file]]])

Отслеживает и выводит путь по стеку от кадра стека frame до корня программы (модуля __main__). Если аргумент frame опущен или равен None, считается равным кадру стека блока, из которого функция print_stack() была вызвана. Необязательные аргументы limit и file имеют такое же значение, как и в функции print_exception().

extract_tb(traceback [, limit])

Возвращает информацию о пути, содержащуюся в объекте traceback, в виде списка (каждый элемент представляет кадр стека, соответствующий очередному вложенному объекту traceback) кортежей ‘(filename, line_number, function_name, text)’, где filename — имя файла, line_number — номер строки в файле, function_name — имя функции и text — строка исходного текста с обрезанными символами пропуска (whitespace) в начале и конце или None. Необязательный аргумент limit имеет такое же значение, как и в функции print_exception().

extract_stack([frame [, limit]])

Возвращает информацию, описывающую путь от указанного или текущего кадра стека до корня программы. Возвращаемое значение имеет такой же формат, как и значение, возвращаемое функцией extract_tb(). Необязательные аргументы frame и limit имеют такое же значение, как и в функции print_stack().

format_list(list)

Возвращает список готовых к выводу (например, методом writelines файлового объекта) строк, полученных форматированием списка кортежей list — результата функции extract_tb() или extract_stack(). Каждая строка возвращаемого списка соответствует элементу с таким же индексом аргумента. Каждая строка заканчивается символом перехода на новую строку и может содержать несколько символов перехода на новую строку, если последний элемент соответствующего кортежа (строка исходного текста) не равен None.

format_exception_only(type, value)

Возвращает список строк, подготовленный для вывода (например, методом writelines файлового объекта) информации об исключении. Каждая строка в возвращаемом списке заканчивается символом перехода на новую строку. type и value должны быть объектами, представляющими тип и значение исключения. Обычно список содержит только одну строку. Однако для исключений SyntaxError список будет состоять из нескольких строк, содержащих, в том числе, фрагмент исходного текста программы и информацию о месте обнаружения синтаксической ошибки. Строка, описывающая исключение, всегда идет в списке последней.

format_exception(type, value, traceback [, limit])

Возвращает список строк, подготовленный для вывода (например, методом writelines файлового объекта) информации об исключении и информации, представляемой объектом traceback. Аргументы имеют такое же значение, как и соответствующие аргументы функции print_exception(). Каждая строка в воз-

210

Глава 15. Служебные модули

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

format_tb(traceback [, limit])

Вызов этой функции эквивалентен вызову ‘format_list(extract_tb(traceback, limit))’.

format_stack(frame [, limit])

Вызов этой функции эквивалентен вызову ‘format_list(extract_stack(frame, limit))’.

tb_lineno(traceback)

Возвращает номер текущей строки, представленной объектом traceback. Обычно возвращаемое значение равно traceback.tb_lineno. Однако при включенной оптимизации атрибут tb_lineno не обновляется корректно, в то время как функция tb_lineno() всегда возвращает правильное значение.

Следующий пример реализует простейший интерактивный интерпретатор, аналогичный стандартному:

import sys, traceback

def run_user_code(envdir): source = raw_input(">>> ") try:

exec source in envdir except:

print "йУЛМАЮЕОЙЕ Ч РПМШЪПЧБФЕМШУЛПН ЛПДЕ:" print ’-’*60 traceback.print_exc(file=sys.stdout)

print ’-’*60

envdir = {} while 1:

run_user_code(envdir)

Для создания более сложных интерактивных интерпретаторов лучше воспользоваться классами, определенными в модуле code.

Важное замечание: модуль traceback для считывания строк исходного кода использует модуль linecache, который держит в памяти содержимое всех файлов, к которым когда-либо были обращения. В долгоживущих программах, позволяющим пользователю каким-либо образом (например, путем ввода интерактивных команд) выполнять код из различных файлов, это может привести к нежелательному использованию большого количества памяти. Чтобы этого избежать, следует периодически очищать кэш с помощью функции linecache.clearcache().