Python/Что нового в Python 2.6
| Документация Python Эта статья — часть Документации по языку Python |
Что нового в Python 2.6? [*]
| Исходный текст | http://docs.python.org/whatsnew/2.6.html |
| Автор | А.М. Качлин (A.M. Kuchling) (amk на amk.ca) |
| Релиз | 2.6.1 |
| Версия от | 9 января 2009 |
Описание [*]
Эта статья расскажет вам о новых возможностях Python 2.6 вышедшем 1 октября 2008. Информация о выпуске описывается в PEP 361.
Основной темой Python 2.6 это подготовка к переходу на Python 3.0, на основной редизайн языка. Если это возможно, Python 2.6 включает новые функции и возможности из версии 3.0 сохраняя при этом старые возможности или синтаксис.
Python 3.0 [-]
Изменения в процессе разработки [*]
Пока разрабатывался Python 2.6, в процессе разработки произошло два значительных изменения: мы сменили систему контроля задач SourceForge на специально настроенную Roundup и документация была преобразована из LaTeX в reStructuredText.
Новая система контроля задач: Roundup [*]
В течение долгого времени разработчиков Python раздражал журнал ошибок SourceForge. Использование SourceForge не давало нужной гибкости; например, не было возможности настроить жизненный цикл задач.
Комитет Python Software Foundation начал поиск планировщиков задач, прося добровольцев установить различные продукты и импортировать некоторые ошибки из SourceForge. Было проверено четыре различных планировщика задач: Jira, Launchpad, Roundup и Trac. Вскоре комитет остановился на двух кандидатах: Jira и Roundup. Jira коммерческий продукт, который предоставляет бесплатные решения для проектов свободного ПО. Roundup это проект с открытым исходным кодом, который нуждается в добровольцах для администрирования и в сервере для размещения.
Новый формат документации: текст, переСтруктурированный с использованием Sphynx [-]
PEP 343: Оператор ‘with’ [*]
Оператор with появился в предыдущей версии Python - 2.5 - как необязательный и включался директивой from __future__ import with_statement. В Python 2.6 оператор with доступен всегда, а значит он является зарезервированным словом. Дальнейшее изложение повторяет информацию из "Что нового в Python 2.5" и может быть пропущено, если вы уже знакомы с описываемым оператором.
Оператор with упрощает код, который раньше использовал блоки try...finally для гарантированного исполнения завершающего кода. Здесь мы рассмотрим типичные применения оператора, а в следующем параграфе - детали реализации и возможность написания объектов, которые можно использовать с данным оператором.
Оператор with является еще одним оператором управления потоком команд и имеет следующий основной синтаксис:
with выражение [as переменная]:
блок кода
Здесь выражение вычисляется, и результатом его вычисления должен быть объект, поддерживающий протокол управления контекстом (context management), то есть иметь методы __enter__() and __exit__().
Метод __enter__() упомянутого выше объекта вызывается до вычисления блока кода, а значит, в нем можно выполнить необходимые подготовительные операции. Этот метод может вернуть некоторое значение, которое будет связано с переменной, если такая задана. Внимание: переменной присваивается не значение вычисленного выражения, а именно результат метода __enter__().
После выполнения блока кода выполняется метод __exit__(), даже если в блоке произошло исключение. Таким образом, этот метод может гарантированно выполнить необходимые операции восстановления.
Некоторые стандартные объекты Python уже поддерживают протокол управления контекстом и могут быть использованы в операторе with. Файловые объекты являются одним из примеров:
with open('/etc/passwd', 'r') as f:
for line in f:
print(line)
После выполнения этого оператора файловый объект f будет автоматически закрыт даже если внутри цикла возникнет исключение.
Замки и условные переменные модуля threading также поддерживают оператор with:
lock = threading.Lock()
with lock:
# Критическая секция кода
...
До выполнения критической секции замок закрывается и всегда открывается при выходе из нее.
Функция localcontext() из модуля decimal помогает сохранить и затем восстановить текущие настройки, такие как требуемую точность и характеристики округления при вычислениях:
from decimal import Decimal, Context, localcontext
# Печатать, используя точность по умолчанию (28 цифр)
v = Decimal('578')
print v.sqrt()
with localcontext(Context(prec=16)):
# Весь код в этом блоке использует точность в 16 цифр.
print v.sqrt()
# Первоначальные настройки восстанавливаются по выходе из блока