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

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

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

11.6. Классы и экземпляры классов

161

3.Если y является экземпляром класса:

(a)Если для y определен метод __coerce__(), x и y заменяются значениями, содержащимися в кортеже x.__coerce__(y); если же метод __coerce__() возвращает None, перейти к пункту 4.

(b)Если после преобразований ни x, ни y не является экземпляром, перейти к пункту 4.

(c)Если для y определен метод __rop__, вернуть y.__rop__(x), в противном случае восстановить значения x и y, которые были перед выполнением пункта 3a.

4.(a) Если x является последовательностью и op + или *, выполняется объединение и размножение соответственно.

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

__coerce__(self, other)

Вызывается для приведения операндов к общему11 типу. Должен возвращать кортеж, содержащий self и other, приведенные к общему типу, или None, если осуществить преобразование невозможно. В тех случаях, когда общий тип будет типом второго аргумента (other), эффективнее вернуть None, так как интерпретатор также будет пытаться вызвать метод __coerce__ второго аргумента (иногда, однако, реализация другого типа не может быть изменена, в этом случае полезно осуществить приведение к типу второго аргумента здесь).

__add__(self, other)

__sub__(self, other)

__mul__(self, other)

__div__(self, other)

__mod__(self, other)

__divmod__(self, other)

__pow__(self, other [, modulo])

__lshift__(self, other)

__rshift__(self, other)

__and__(self, other)

__xor__(self, other)

__or__(self, other)

Вызываются (для правого операнда) для реализации бинарных операторов +, -, *, /, %, встроенной функции divmod(), оператора ** и встроенной функции pow(), операторов <<, >>, &, ^ и | соответственно. Например, для того чтобы вычислить выражение x+y, где x является экземпляром класса, имеющим метод __add__,

11Иногда полезно возвратить значения разного типа, например список и целое число.

162

Глава 11. Встроенные типы данных

вызывается x.__add__(y). Обратите внимание, что, если должен поддерживаться вызов встроенной функции pow() с тремя аргументами, метод __pow__() должен быть определен с третьим необязательным аргументом.

__radd__(self, other)

__rsub__(self, other)

__rmul__(self, other)

__rdiv__(self, other)

__rmod__(self, other)

__rdivmod__(self, other)

__rpow__(self, other)

__rlshift__(self, other)

__rrshift__(self, other)

__rand__(self, other)

__rxor__(self, other)

__ror__(self, other)

Вызываются (для левого операнда) для реализации перечисленных выше операций, если правый операнд не имеет соответствующего метода (без буквы ‘r’). Например, для того чтобы вычислить выражение x-y, где y является экземпляром класса, имеющим метод __rsub__, вызывается y.__rsub__(x). Обратите внимание, что функция pow(), вызванная с тремя аргументами, не будет пытаться использовать метод __rpow__() (правила приведения типов были бы слишком сложными).

__iadd__(self, other)

__isub__(self, other)

__imul__(self, other)

__idiv__(self, other)

__imod__(self, other)

__ipow__(self, other)

__ilshift__(self, other)

__irshift__(self, other)

__iand__(self, other)

__ixor__(self, other)

__ior__(self, other)

Вызываются для реализации операций с присваиванием (изменением исходного объекта) +=, -=, *=, /=, %=, **= <<=, >>=, &=, ^= и |= соответственно. Эти методы должны не возвращать результат, а модифицировать объект, к которому метод применяется. Если соответствующий метод не определен, операция ‘x op= y’ выполняется как ‘x = x op y’.

11.7. Файловые объекты

163

11.7Файловые объекты

Объекты типа file создаются встроенной функцией open() (см. главу 12), а также с помощью функций os.popen() и os.fdopen() (см. описание модуля os). Кроме того, различные модули предоставляют пути создания объектов с аналогичным интерфейсом (например, метод makefile() объектов, представляющих сетевое соединение). Переменные sys.stdin, sys.stdout и sys.stderr (см. описание модуля sys) инициализируются файловыми объектами, соответствующими стандартным потокам ввода, вывода и ошибок.

Если при выполнении операции над объектом-файлом возникает ошибка вводавывода, включая ситуации, при которых по каким-либо причинам операция не определена (например, метод seek() файлового объекта, представляющего устройство tty, или запись в файл, открытый для чтения), генерируется исключение IOError.

Объекты file имеют следующие методы:

close()

Закрывает файл. При попытке произвести какую-либо операцию над закрытым файлом генерируется исключение ValueError. Допускается вызов метода close() более одного раза.

flush()

Сбрасывает содержимое внутреннего буфера.

isatty()

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

fileno()

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

read([size])

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

readline([size])

Считывает и возвращает строку из файла, включая завершающий символ новой

164

Глава 11. Встроенные типы данных

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

readlines([sizehint])

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

seek(offset [, whence])

Устанавливает текущую позицию в файле. Необязательный аргумент whence указывает на точку отсчета: 0 (по умолчанию) — начало файла, 1 — текущая позиция и 2 — конец файла.

tell()

Возвращает текущую позицию в файле.

truncate([size])

Усекает файл до заданного (size) размера. По умолчанию размер равен текущей позиции. Наличие этого метода зависит от операционной системы.

write(s)

Записывает строку s в файл. Заметим, что из-за использования буферизации строка на самом деле может не быть записана в файл до тех пор, пока не будет вызван метод flush() или close().

writelines(slist)

Записывает строки из списка slist в файл. Метод writelines() не добавляет разделители строк. Начиная с версии 1.6, slist может быть последовательностью любого типа, не обязательно list.

Файловые объекты также имеют следующие атрибуты:

closed

Текущее состояние файлового объекта: истина, если файл закрыт, иначе ложь. Доступен только для чтения, значение изменяется при использовании метода close(). Этого атрибута может не быть у объектов, аналогичных файловым.

mode

Режим ввода/вывода. Если файловый объект был создан с помощью встроенной функции open(), равен переданному ей аргументу mode. Доступен только для чтения. Этого атрибута может не быть у объектов, аналогичных файловым.

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

11.8. Вспомогательные объекты

165

name

Если файловый объект был создан с помощью встроенной функции open(), равен имени файла. В противном случае, равен строке, которая указывает на происхождение файлового объекта, в виде ‘<РТПЙУИПЦДЕОЙЕ>’. Доступен только для чтения.

softspace

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

11.8 Вспомогательные объекты

11.8.1 Пустой объект

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

11.8.2 Объекты типа

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

Объекты типа имеют следующие атрибуты, доступные только для чтения:

__doc__

Строка документации, описывающая назначение объектов данного типа, или None.

__name__

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

Строковое представление объектов типа выводится (например, инструкцией print) в виде ¨<type ’ÉÍÑ ÔÉÐÁ’>¨.

166

Глава 11. Встроенные типы данных

11.8.3Представление расширенной записи среза

Эллипсис

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

Срез

 

 

 

 

Объекты

типа

slice

используются для представления расширенной записи сре-

зов,

то

есть,

если

срез записывается с использованием двух символов двое-

точия

(obj[i:j:s]),

указывается несколько срезов или используется эллипсис

(obj[i:j, k:l], obj[..., i:j]). Кроме того, Вы можете создать объект slice, используя встроенную функцию slice().

Объекты среза имеют следующие атрибуты, доступные только для чтения (каждый из них может быть любого типа и равен None, если соответствующий аргумент в записи среза ‘start:stop:step’ опущен):

start

Нижняя граница.

stop

Верхняя граница.

step

Шаг.

Фактически объект среза представляет множество индексов ‘range(start, stop, step)’.

11.9Детали реализации

11.9.1 Объекты кода

Объекты кода (code) используются для представления байт-компилированного исполняемого кода, такого как тело функции. Разница между объектом-кодом и объектомфункцией состоит в том, что объект-функция содержит явную ссылку на словарь, представляющий глобальное пространство имен модуля, в котором определена функция, в то время как объект-код “не знает” контекста, в котором он будет выполняться. Кроме того,

11.9. Детали реализации

167

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

Объект-код создается с помощью встроенной функции compile(), а также может быть извлечен из объекта-функции используя его атрибут func_code. Объект-код можно выполнить с помощью инструкции exec или вычислить представляемое им выражение с помощью встроенной функции eval().

Объекты кода имеют следующие атрибуты, доступные только для чтения:

co_name

Содержит имя функции (или ’?’, если объект-код создан с помощью функции compile()).

co_argcount

Число позиционных аргументов функции (включая аргументы, имеющие значения по умолчанию).

co_nlocals

Число локальных переменных (включая аргументы функции).

co_varnames

Кортеж, содержащий имена локальных переменных.

co_code

Строка, представляющая последовательность байт-компилированных инструкций.

co_consts

Кортеж, содержащий значения используемых литеральных выражений.

co_names

Кортеж всех используемых в байт-коде имен.

co_filename

Имя файла, из которого объект-код был скомпилирован.

co_firstlineno

Номер первой строки определения функции в файле.

co_lnotab

Строка, представляющая отображение смещения в байт-коде в номера строк (пустая строка, если включена оптимизация).

co_stacksize

Необходимый для выполнения размер стека (включая локальные переменные).

co_flags

Число, представляющее различные флаги интерпретатора. Для co_flags определены следующие биты (наиболее важные): бит 0x04 установлен, если функция

168

Глава 11. Встроенные типы данных

использует запись ‘*args’ (воспринимает произвольное число позиционных аргументов); бит 0x08 установлен, если функция использует запись ‘**kwds’ (воспринимает произвольное число именованных аргументов).

Если объект кода представляет функцию, то первый элемент кортежа co_consts всегда является строкой документации (или None, если строка документации не определена).

11.9.2Кадр стека

Объект frame представляет кадр стека функции, “окружение”, в котором выполняются инструкции кода. Вы можете получить объект кадра стека через атрибут tb_frame объекта traceback (см. раздел 11.9.3). Объекты frame имеют следующие атрибуты (атрибутам f_trace, f_exc_type, f_exc_value и f_exc_traceback можно присвоить новое значение, остальные доступны только для чтения):

f_back

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

f_code

Объект кода (см. раздел 11.9.1), который выполняется в рассматриваемом кадре стека.

f_locals

Словарь, используемый для поиска локальных имен.

f_globals

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

f_builtins

Словарь, используемый для поиска встроенных имен.

f_restricted

Флаг, указывающий на то, что функция выполняется в защищенном режиме.

f_lineno

Номер последней выполненной в рассматриваемом кадре стека строки.

f_lasti

Номер последней выполненной в рассматриваемом кадре стека инструкции байткода (может использоваться в качестве индекса для строки байт-кода объекта code).

11.9. Детали реализации

169

f_trace

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

f_exc_type f_exc_value

f_exc_traceback

Эти атрибуты представляют последнее перехваченное в рассматриваемом кадре исключение.

11.9.3Объекты traceback

Объект traceback представляет путь, пройденный с момента генерации исключения до его перехвата. Таким образом, он создается при возникновении исключительной ситуации. Вы можете получить объект traceback в качестве третьего элемента кортежа, возвращаемого функцией sys.exc_info() (см. описание модуля sys). Если программа не содержит подходящего обработчика исключения, информация, хранящаяся в объекте traceback, выводится в стандартный поток ошибок. В интерактивном режиме объект traceback для последнего не перехваченного исключения доступен через переменную sys.last_traceback.

Объекты traceback имеют следующие атрибуты, доступные только для чтения:

tb_next

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

tb_frame

Ссылка на кадр стека, представляющего текущий уровень.

tb_lineno

Номер строки (на текущем уровне), в которой возникла исключительная ситуация.

tb_lasti

Номер (на текущем уровне) инструкции байт-кода, которая привела к возникновению исключительной ситуации (может использоваться в качестве индекса для строки байт-кода объекта code).

Значения атрибутов tb_lineno и tb_lasti объекта traceback могут отличаться от значений атрибутов f_lineno и f_lasti объекта frame, если исключительная ситуация возникла в теле инструкции try без подходящей ветви except или имеющей ветвь finally.

170

Глава 12

Встроенные функции

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

__import__(name [, globals [, locals [fromlist]]])

Эта функция вызывается инструкцией import. Вы можете заменить ее другой функцией, имеющей совместимый с __import__() интерфейс для того, чтобы изменить семантику инструкции import. Чтобы получить представление как и зачем это следует делать, смотрите описание стандартных модулей ihooks и rexec. Обратите также внимание на встроенный модуль imp, в котором определены некоторые операции, полезные для написания собственной функции __import__.

Например, инструкция ‘import spam’ приводит к выполнению ‘__import__(’spam’, globals(), locals(), [])’, а инструкция ‘from spam.ham import eggs’ — к выполнению ‘__import__(’spam.ham’, globals(), locals(), [’eggs’])’. Несмотря на то, что locals() и [’eggs’] передаются в качестве аргументов, сама функция __import__() не устанавливает локальную переменную eggs. На самом деле, стандартная функция __import__() вообще не использует аргумент locals, а аргумент globals использует только для определения контекста инструкции import.

Если аргумент name задан в виде ’РБЛЕФ.НПДХМШ’ и список fromlist пустой, функция __import__() возвращает объект-модуль, соответствующий имени ’РБЛЕФ’ (часть имени name до первой точки), а не объект-модуль с именем name. Однако, если задан не пустой аргумент fromlist, функция __import__() возвращает объект-модуль, соответствующий имени name. Это сделано для совместимости байт-кода, сгенерированного для разных вариантов инструкции import: при использовании ‘import spam.ham.eggs’, объект модуль spam должен быть помещен в пространство имен, соответствующее области видимости, в котором выполняется инструкция import, в то время как при использовании ‘from spam.ham import eggs’, объект-модуль spam.ham должен быть использован для поиска объекта eggs. Для получения объекта Вы можете воспользоваться встроенной функцией getattr(), например:

import string

def my_import(name):