Наконец то вышел Python 2.5

Наконец дождались релиза новой ветки Python — 2.5. Скачать новую версию можно с официального сайта. Что появилось нового в этой ветке по сравнению с 2.4 можно прочитать в PEP 356 и в документации.

Ниже я кратко рассмотрел основные возможности, добавленные в Python 2.5.

PEP 308: условные выражения

Появился тернарный оператор, теперь код

if condition:    x = true_valueelse:    x = false_value

можно записать так:

x = true_value if condition else false_value

См. PEP 308 для подробностей.

PEP 309: Частично вычислимые функции

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

import functoolsdef log(message, subsystem):    print "%s: %s" % (subsystem, message)server_log = functools.partial(log, subsystem='server')server_log("Unable to open socket")

Подробности см. в PEP 309.

PEP 314: Метаданные для пакетов ПО, версия 1.1

В distutils добавлены зависимости. Теперь в функции setup() есть параметры requires, provides и obsoletes.

VERSION = '1.1'setup(name='MyPyPackages',      version=VERSION,  requires=['numarray', 'zlib (>=1.1.4)'],  obsoletes=['OldPackages'],  download_url=('http://example.com/mypypackage/dist/pkg-%s.tar.gz'                 % VERSION),)

Помимо этого, добавлена команда upload, которая автоматически загружает пакет на CheeseShop Python Package index.

Подробности по использованию см. в PEP 314.

PEP 328: Абсолютный и относительный импорт

Ранее, если имелся пакет pkg:

pkg/pkg/__init__.pypkg/main.pypkg/string.py

то import string из модуля main импортировал pkg.string, а не стандартный модуль. В будущих версиях (где-то в районе Python 2.7) import string будет всегда импортировать стандартный модуль. Такого поведения (т.е. абсолютный импорт) можно и добиться в Python 2.5, выполнив директиву:

from __future__ import absoulte_import

Так что теперь нужно либо явно импортировать string из пакета pkg:

from pkg import string

Либо воспользоваться относительным импортом:

from . import string

Варианты использования таковы:

# код внутри модуля A.B.Cfrom . import D # импортирует A.B.Dfrom .. import E    # импортирует A.Efrom ..F import G   # импортирует A.F.G

Поправка: имена, начинающиеся с точки можно использовать только в конструкции from ... import.

Более полную информацию об абсолютном и относительном импорте см. в PEP 328.

PEP 341: Унифицированный try/except/finally

До Python 2.5 try использовался в двух вариантах: либо с finally, либо с except. Теперь можно использовать except и finally одновременно.

try:    block-1 ...except Exception1:    handler-1 ...except Exception2:    handler-2else:    else-blockfinally:    final-block

Выполняется код block-1. Если во время выполнения возбуждается исключение, то в зависимости от класса исключения (Exception1 либо Exception2) выполняется либо handler-1, либо handler2. Если исключение не возбуждается, то выполняется else-block. И вне зависимости от того, было ли возбуждено исключение и какого типа, выполняется final-block. Даже если в обработчиках были ошибки, или при выполнении else-block было возбуждено исключение, всё равно final-block будет выполнен.

Подробности см. в PEP 341.

PEP 342: Новые возможности генераторов

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

Немного освежим память о генераторах. Например, простой генератор:

def counter(maximum):    i = 0    while i < maximum:        yield i        i += 1

При вызове counter(10) получаем итератор, возвращающий значения от 0 до 9. Когда итератор наталкивается на yield, он возвращает переданное значение и “замораживает” выполнение функции, сохраняя при этом локальные переменные. Итератор “просыпается” при вызове метода next() и продолжает выполнение функции сразу после yield.

В Python 2.3 yield была инструкцией (statement), в Python 2.5 она стала выражением (expression). Так что теперь она возвращает значение, которое может быть присвоено переменной или другим образом обработано:

val = (yield i)

Ниже приведен переписанный на Python 2.5 пример:

def counter(maximum):    i = 0    while i < maximum:        val = (yield i)        # если это значение, меняем счетчик        if val is not None:            i = val        else:            i += 1

И вот так можно передавать значения:

>>> it = counter(10)>>> print it.next()0>>> print it.next()1>>> print it.send(8)8>>> print it.next()9>>> print it.next()Traceback (most recent call last):  File ``t.py'', line 15, in ?    print it.next()StopIteration

Зачем нужно проверять на None, какие новые методы помимо send() появились у генераторов можно узнать из PEP 342

PEP 343: Инструкция ‘with’

Инструкция with делает код более прозрачным в тех случаях, когда использовали try...finally для гарантии выполнения “очищающего” (clean-up) кода.

Для того, чтобы включить эту инструкцию в Python 2.5 необходимо выполнить директиву:

from __future__ import with_statement

Начиная с Python 2.6, инструкция with будет доступна и без этой директивы.

Общая структура кода с инструкцией with выглядит так:

with expression [as variables]:    with-block

И пример использования:

with open('/etc/passwd', 'r') as f:    for line in f:    print line    ... что-то еще ...

После завершения блока, объект f автоматически будет закрыт, даже если в цикле for было возбуждено исключение.

Другой пример, с блокировками (пакет threading):

lock = threading.Lock()with lock:    # критический код...

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

Более подробно об использовании with рассказано в соответствующем разделе документации и в PEP 343.

PEP 352: Исключения — классы нового типа

Во-первых сами исключения стали классами нового типа (new-style class). А во-вторых, изменилась иерархия. Теперь она выглядит примерно так:

BaseException       # новый, появился Python 2.5|- KeyboardInterrupt|- SystemExit|- Exception   |- (все остальные исключения)

В-третьих, использование строк как исключений (т.е. код raise "Error occurred") будет выдавать предупреждение.

Подробнее об этом см. в PEP 352.

Другие изменения в языке

Изменения, внесенные в язык:

  • В объектах типа dict появился новый магический метод __missing__(key), вызываемый в случае, если ключ key не найден в словаре.

  • К строкам добавлены методы partition(sep) и rpartition(sep) для разбивки строки разделителем

  • Методы startswith() и endswith() строк теперь в качестве аргумента могут принимать кортеж строк, а не только одну строку.

  • Функциям min() и max() теперь можно передавать параметр key (смысл этого параметра аналогичен таковому у sort())

  • Новые встроенные функции any() и all() определяют, содержит ли итератор True и False значения,. any() имеет смысл OR, а all() имеет смысл AND.

  • ACII теперь кодировка по умолчанию для модулей. Так что если не указана кодировка и модуль содержит 8-и битные символы, то Python будет интерпретировать это как ошибку синтаксиса. В Python 2.4 это было лишь предупреждением. Поэтому внимательно читайте PEP 263

  • Добавлено новое предупреждение, UnicodeWarning, возникает в случае сравнения unicode-строки и обычной, 8-и битной. При этом результат сравнения — False. До этого возбуждалось исключение UnicodeDecodeError.

  • Часто Python-программисты забывают добавлять файл __init__.py в каталог, чтобы Python считал это каталог пакетом. Ранее нельзя было импортировать каталог без __init__.py. Сейчас можно. При этом может быть показано предупреждение (по умолчанию оно выключено) ImportWarning.

  • Можно опускать базовый класс в описании класса. Т.е. такой код вполне нормален:

    class C():       pass

Новые модули

В Python 2.5 в стандартную поставку добавились модули:

  • contextlib — вспомогательные функции, используемые с инструкцией with
  • cProfile — C-реализация модуля profile
  • msilib — модуль для создания файлов Microsoft installer .msi и CAB.
  • spwd — модуль для доступа к БД теневых паролей (shadow password), на тех платформах, которые их поддерживают.
  • uuid — модуль для создания универсальных уникальных идентификаторов (UUID) по RFC 4122.
  • ctypes — известный модуль Томаса Хеллера для доступа к бинарным библиотекам (.so, .dll) теперь в составе стандартной библиотеки
  • ElementTree — модуль Фредрика Лундха для обработки XML включен в стандартную поставку под именем xml.etree.
  • hashlib — новый модуль Грегори Смита, пришел на замену md5 и sha. Реализует различные хеши (SHA-224, SHA-256, SHA-512).
  • sqlite3 — давно ожидаемый pysqlite вошел в стандартную библиотеку.
  • wsgiref — модуль, реализующий простой HTTP-сервер с поддержкой WSGI (см. PEP 333)
Подписаться Комментировать

Комментарии

20.09.2006 2:36 Юревич Юрий

[…] Только что прочитал у Pythy, что вышел Python 2.5. В нем много всего нового и змечательного, и что приятно, я даже не нашел на первый взгляд ничего, что вызвало бы отрицательную реакцию. […]

Форма комментирования для «Наконец то вышел Python 2.5»

Обязательное поле. Не больше 30 символов.

Обязательное поле

Пожалуйста, введите символы, которые вы видите на изображении

22.09.2006 20:33 Юревич Юрий

Добавляем тернарный оператор в пример и получаем полную питонизацию 2.5:

def counter(maximum):
i = 0
while i

23.09.2006 15:05 Юревич Юрий

Действительно, пример с генератором можно записать так:

P.S.Ваш код съел оператор “меньше”, wp воспринял его как часть html-тега

16.10.2006 20:26 Юревич Юрий

думал что начать питон или руби …
почитал различных отзывов, сравнений, док и решился уже всё же учить питон.
начал ставить и опа … засада как прикрутить mysql к python-у 2.5 … gjcktlybq gjllth;bdftvsq - 2.4

16.10.2006 23:36 Юревич Юрий

В этом смысле (готовность сторонних библиотек) на Py25 [пока] особо расчитывать не стоит. Например, PyQt4 тоже не собирается на Py25. Это закономерно и не нужно иллюзии строить. Если код pure python, то переход с Py23/24 на Py25 должен пройти относительно безболезненно. Разработчики cторонних библиотеки подтянуться и, я думаю, где-то через пол-года (может месяцев 8 ) большинство mainstream-библиотек будут работать с Py25.

Ну а mysql не панацея. Для модельных задач вполне хватает sqlite, который есть в стандартной поставке Py25, а там гляди, и mysqldb будет готов… А может Вам вообще не реляционное хранилище нужно, а объектное…

22.03.2007 1:17 Юревич Юрий

[…] Но не стоит тешить себя иллюзиями, что вы прочитаете про новые возможности генераторов в Python-2.5 или узнаете новости про Jython/IronPython — этим статьям уже сто лет в обед. […]