Язык программирования Python. Альтернативные реализации. Что нового в 2.0

Автор: Олег Бройтман
http://phd.pp.ru/
phd@phd.pp.ru

Это пятая статья данного цикла лекций.

Перепечатка. Оригинал статьи опубликован по адресу http://www.softerra.ru/review/oses/linux/14375/

Другие реализации

Хотя у Python существует главная реализация, называемая CPython (потому что написана на C), существуют и альтернативные реализации интерпретатора. Jython состоит из двух частей; это, во-первых, компилятор из Питона в Джава byte-code, что позволяет писать апплеты на Питоне, а не Джаве; а во-вторых, интерпретатор Питона, написанный на Джаве. Stackless Python - специальный патч к CPython, позволяющий не использовать стандартный стек; это позволяет существенно увеличить глубину рекурсии и создавать такие нестандартные вещи как сопрограммы и генераторы (впрочем, в Python 2.2 генераторы реализованы без использования Stackless). Vyper - это альтернативная реализация на языке Caml; Vyper - это и интерпретатор, и компилятор. Интересное название, кстати. Viper - это "гадюка" (в обоих смыслах этого слова).

Что нового в последних версиях Питона

После трех увольнений (о чем я писал в первой статье), команда разработчиков нашла наконец теплое местечко, и развитие Питона понеслось вперед семимильными шагами. Python 2.1 и 2.2 правильнее было бы нумеровать 3.0 и 4.0.

Python 1.6

Между версиями 1.5.2 и 2.0 Гвидо, еще работая в CNRI, выпустил версию 1.6. Это контрактная версия (Contractual Obligations release), которую он обязался выпустить перед первым увольнением. На нее не следует обращать большого внимания, а можно сразу перейти к 2.0.

Python 2.0

Наиболее существенное в этой версии - изменение подхода к разработке. Дерево CVS переехало на SourceForge. Благодаря этому процесс разработки стал более открытым, более видимым для пользователей, появились механизмы обратной связи (bug tracker).

Появился механизм Python Enhancement Proposals (PEPs). PEP - это формализованный документ, предлагающий введение в язык новой конструкции, или в интерпретатор новой функциональности, или в библиотеку нового кода. Написать PEP может любой, и после обсуждения разработчики принимают решение - включать ли новый код в Питон, или отвергнуть.

Самая большая новая особенность Python 2.0 - поддержка Unicode. Появился новый тип данных - уникодовые строки, новые литералы, новые функции манипуляции строками, преобразования ASCII строк в Unicode и обратно, таблицы соответствия различных кодировок (koi8-r, cp1251 и прочие русские кодировки включены). Модуль codecs содержит функции перекодирования, включая функцию open, которая позволяет открыть файл с указанием кодировки файла, и кодировки данных в программе. Операции чтения/записи буду перекодировать данные автоматически. Соответственно, изменилась реализация регулярных выражений - они полностью поддерживают unicode.

У строк теперь появились методы: "Hello".upper(). Но строки по-прежнему неизменяемые объекты. Методы строк возвращают в результате операции новую строку. Методы нужны для того, чтобы единообразным образом обрабатывать как ASCII, так и Unicode строки.

Следующее новшество - списковое включение (list comprehension). Синтаксис его прост:

[ expression for expr in sequence1
              for expr2 in sequence2 ...
              for exprN in sequenceN
              if condition
]
. Это эквивалентно коду
result = []
for expr1 in sequence1:
     for expr2 in sequence2:
     ...
         for exprN in sequenceN:
              if (condition):
                  result.append(expression)

Расширенное присваивание (a += b) долгое время вызывало ожесточенные споры - включать его в Питон или не включать. Теперь споры закончились. Python 2.0 включает полную поддержку расширенного присваивания для всех операций (+, - и все остальные), включая переопределение его в классах, реализуемых программистом. Если при этом a - неизменяемый объект, будет выполнена операция a + b и результат присвоен в a. Если же a - изменяемый объект, его значение и будет изменено без создания нового объекта. В реализации классов программист сам решает, изменять или не изменять объект.

Появился новый, упрощенный синтаксис для вызова функций с переменным числом параметров. Это особенно удобно для вызова родительского конструктора - раньше для этого приходилось использовать apply. Появилась возможность переопределять в классах встроенный оператор in. Были изменены алгоритмы сравнения и удаления рекурсивных структур данных. Появился новый модуль gc для управления сборкой мусора; этот модуль может отслеживать рекурсивные структуры, на которые больше нет ссылок, и удалять их.

В версии 2.0 наконец-то появился пакет Distutils - набор средств для создания программ инсталляции ваших модулей, пакетов и программ.

В эту версию включен также большой пакет PyXML, содержащий как низкоуровневые средства (PyExpat - интерфейс к expat), так и высокоуровневые - SAX2 и DOM. В нем применен механизм для установки собственных пакетов пользователя, так что import xml будет импортировать пользовательские пакеты, а не дистрибутивные питоновские. Этим пользуется, например, 4Suite. При инсталляции 4Suite не затирает PyXML, но import xml будет импортировать 4Suite, а не PyXML.

Появилась поддержка OpenSSL. Если в момент компиляции Питона на машине имеются библиотеки OpenSSL - они будут подлинкованы к модулю socket, а библиотека httplib обретет обработчик протокола https.

Появилось много новых модулей, среди которых atexit (регистрация списка функций деинициализации модулей), mmap (отображаемые в память файлы, поддержка которых есть в UNIX и Windows), gettext (интерфейс к GNU gettext), robotparser (разбор файлов robots.txt), zipfile (ZIP-файлы, конечно же) и imputil (упрощают написание механизмов импорта).