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
будет автоматически закрыт даже если внутри цикла возникнет исключение.
Внимание! В данном случае f - это объект, созданный open, так как метод __enter__() файлового объекта возвращает self
|
Замки и условные переменные модуля 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()
# Первоначальные настройки восстанавливаются по выходе из блока