InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Глава 11. Новое в версии 1.2


Данная глава описывает последние добавления в язык и библиотеку Python


11.1 Новые особенности классов


Семантика __coerce__ была изменена для большей приемлемости. Как пример, используя это, новый стандартный модуль Complex довольно полно реализует комплексные числа. Дополнительные примеры классов с и без метода __coerce__ можно найти в поддиректории Demo/classes , модилях Rat и Dates .

Если класс не определяет метода __coerce__ , то это эквивалентно следующему определению:

def __coece__(self, other): return self, other

Если __coerce__ принуждает самого себя к объекту другого типа, операция осуществляется с использованием того типа - в версии 1.1 это вызвало бы ошибку.

Сравнение, вовлекающее экземпляры класса, теперь обращаются к __coerce__ точно также, как если бы cmp(x,y) был бинарным оператором, подобно + (за исключением когда x и y - один и тот же объект).


11.2 Сигнальное обращение UNIX


На UNIX Python теперь поддерживает сигнальное обращение. Модуль signal экспортирует функции signal, pause и alarm, которые действуют подобно своим UNIX копиям. Модуль также экспортирует обычные имена для различных сигнальных классов (также полезно вместе с os.kill()) и SIG_IGN с SIG_DFL. Смотрите секцию signal в "Справочнике библиотеки Python" для получения дополнительной информации.


11.3 Исключения могут быть классами


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

Существует два новых допустимых (семантических) форм для оператора raise:

raise Class, instance
raise instance

В первом случае, instance должен быть экземпляром класса Class или унаследованного от него. Вторая форма - это сокращение для

raise instance.__class__, instance

Пункт except может перечислить классы как и строковые объекты. Класс в пункте except совместим с исключением, если это такой же класс или базовый для него класс. Для примера, следующий код напечатает "B", "C", "D" в том же порядке:

class B:
    pass
class C(B):
    pass
class D(C):
    pass

for c in [B, C, D]:
    try:
       raise C()
    except D:
       print "D"
    except C:
       print "C"
    except B:
       print "B"

Примечание: если реверсировать пункты except (c except B в начале), то вывелось бы "B", "B", "B" - сработает первое же совпадение пункта except.

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

В этой версии встроенные исключения все еще являются строками.


11.4 Постоянство объектов и копирование объектов


Два новых модуля picle и shelve поддерживают сохранение и восстановление (почти) произвольных объектов Python на диск, используя пакет dbm. Третий модуль copy предоставляет гибкие операции копирования объектов. Больше информации по этим модулям дается в "Справочнике библиотеки".


11.4.1 Постоянные объекты


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

Модуль pickle определяет простой протокол посредством которого определенные пользователем классы могут управлять тем как они будут разобраны и собраны. Метод __getinitargs__(), если определен, возвращает список аргументов для конструктора, чтобы использовать во время сборки (по умолчанию конструктор вызывается без аргументов). Методы __getstate__() и __setstate__() используются для передачи дополнительного состояния от разбора к сбору; по умолчанию передается и восстанавливается __dict__ экземпляра.

Замечание: picle не открывает и не закрывает файлы - его можно использовать одинаково хорошо для передачи объектов по сети или сохранения их в базе данных. Для облегчения отладки и неизбежных нечастых ручных поправок, конструируемый поток байт содержит только печатные символы ASCII (хотя это не спроектировано так, чтобы было красиво).

Модуль shelve предоставляет простую модель для хранения объектов в файлах. Операция shelve.open(filename) возвращает "полку", которая является простой непрерывной базой данных с интерфейсом как у словарей. Ключи базы данных - строки, объекты, хранимые в базе могут быть всем, что pickle в состоянии обрабатывать.


11.4.2 Копирование объектов


Модуль copy экспортирует две функции: copy() и deepcopy(). Функция copy() возвращает "поверхностную" копию объекта; deepcopy() возвращает "глубокую" копию. Разница между поверхностным и глубоким копированием актуальна только для составных объектов (объектов, содержащих другие объекты, подобно спискам экземпляров классов):

  • поверхностное копирование конструирует новый составной объект и затем (в масштабе возможного) вставляет в него те же самые объекты что и в исходном объекте;
  • глубокое копирование создает новый составной объект и затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

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


11.5 Документирующие строки


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

Здесь приводится гипотетический, вполне документированный модуль Spam:

""" Операции Spam.

Этот модуль экспортирует два класса, функцию и исключение:

class Spam: полная функциональность Spam ---
          три размера консервных банок
class SpamLight: ограниченная функциональность Spam ---
          только один размер консервной банки

def open(filename): открывает файл и возвращает соответствующий
    объект Spam или SpamLight

GoneOff: исключение, возникающее в случае ошибок; никогда не
    должно случиться

Примечание: всегда возможно конвертирование объекта SpamLight в
 объект Spam простым вызовом метода, но эта операция преобразования
 обычно дорогостоящая и может не удаться по ряду причин.
"""

class SpamLight:
   """ Ограниченная функциональность Spam.

   Поддерживается один размер консервной банки, без всякой приправы,
   и только жесткий диск.
   """

   def __init__(self,size=12):
      """ Конструирует новый экземпляр SpamLight.

      Аргумент - размер консервной банки.
      """
      # и т.д.

   # и т.д.

class Spam(SpamLight):
   """ Полная функциональность Spam.

   Поддерживается три размера консервных банок, две разновидности
   приправ, и все форматы дискет, все еще поддерживаемые аппаратным
   обеспечением.
   """

   def __init__(self, size1=8, size2=12, size3=20):
      """ Конструирует новый экземпляр Spam.

      Аргументы соответствуют трем размерам консервных банок.
      """
      # и т.д.

   # и т.д.

   def open(filename="/dev/null"):
      """ Открывает консервную банку Spam.

      Аргумент должен быть существующим файлом.
      """
      # и т.д.

class GoneOff:
   """ Класс, используемый для исключений Spam.

   Их не должно быть.
   """
   pass

После выполнения "import Spam", следующие выражения возвращают различные строки документации модуля:

Spam.__doc__
Spam.SpamLight.__doc__
Spam.SpamLight.__init__.__doc__
Spam.Spam.__doc__
Spam.Spam.__init__.__doc__
Spam.open.__doc__
Spam.GoneOff.__doc__

Существуют некоторые договоренности насчет содержания и форматирования документирующих строк.

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

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

Некоторые предпочитают копировать соглашение Emacs использования ВЕРХНЕГО РЕГИСТРА для параметров функций - это часто экономит несколько слов или строк.

Разборщик Python не обрабатывает абзацные отступы в многострочных строковых литералах, поэтому инструменты обработки документаций должны сами разбирать абзацные отступы. Это делается по следующему соглашению. Первая непустая строка после первой по счету строки определяет абзацный отступ для всей документирующей строки. (Мы не можем использовать самую первую строку, поскольку она в основном смежна с кавычками, открывающими строку и поэтому ее отступ не виден в строковом литерале.) Все последующие разбираемые строки будут начинаться на пробел "эквивалентный" этому абзацному отступу. Строк с меньшим отступом быть не должно, но если это все-таки случится, все их начальные пробелы должны быть разобраны. При расширении табуляцией должна быть проверена эквивалентность пробелов (обычно, 8 пробелов).

В этой версии несколько стандартных и встроенных функций и модулей имеют документирующие строки.


11.6 Управление импортированием и подмена набора встроенных объектов


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

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

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

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


11.7 Python и всемирная паутина (WWW)


Существует все возрастающее число модулей для написания WWW приложений. Еще предыдущая версия щеголяла модулями gopherlib , ftplib, httplib, и urllib (который объединяет три остальные) для доступа к данным через обычные WWW протоколы. Эта версия так же предоставляет cgi, облегчающий написание исполняемых на стороне сервера скриптов и использующий протокол Common Gateway Interface, поддерживаемый большинством WWW серверов. Модуль urlparse предоставляет точный разбор URL строки на составляющие компоненты (адресная схема, местоположение в сети, путь, параметры, запрос и идентификаторы).

Элементарный разборщик HTML файлов доступен в модуле htmllib. В настоящее время он поддерживает подмножество HTML 1.0 (если Вы приведете его в современный вид, я буду рад получить Вашу версию!). К сожалению, Python кажется слишком медленным для разбора и форматирования HTML в реальном времени как того требуют интерактивные WWW браузеры, но он достаточно хорош для написания "робота" (автоматизированного WWW браузера, который обследует Web в поисках информации).


11.8 Разное


  • Модуль socket экспортирует все необходимые константы, используемые для операций с сокетами, такие как SO_BROADCAST.
  • Функции popen() и fdopen() в модуле os теперь следуют шаблону встроенной функции open(): аргумент режима по умолчанию равен ‘r’, а необязательный третий аргумент, задает размер буфера, причем 0 означает без буферизации, 1 означает линейную буферизацию, а любое большее число означает размер буфера в байтах.

[Назад][Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua