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

Sep 19, 2006 22:24


Originally published at Pythy. You can comment here or there.

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

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

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

if condition: x = true_value else: x = false_value
можно записать так:

x = true_value if condition else false_value
См. PEP 308 для подробностей.
PEP 309: Частично вычислимые функции

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

import functools def 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__.py pkg/main.py pkg/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.C from . import D # импортирует A.B.D from .. import E # импортирует A.E from ..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-2 else: else-block finally: 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)

python, Версии

Previous post Next post
Up