2.6.md
1> **Источник:** https://python-all.ru/3.4/whatsnew/2.6.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 2.689| Автор: | А. М. Кухлинг (amk at amk.ca) |10| --- | --- |1112В этой статье описываются новые возможности Python 2.6, выпущенного 1 октября 2008 года. График выпуска описан в [**PEP 361**](https://python-all.ru/3.4/whatsnew/2.6.html).1314Главная тема Python 2.6 – подготовка путей миграции на Python 3.0, где язык был существенно переработан. Там, где это возможно, Python 2.6 включает новые возможности и синтаксис из 3.0, оставаясь при этом совместимым с существующим кодом – старые возможности и синтаксис не удаляются. Когда сделать это невозможно, Python 2.6 старается помочь: он добавляет функции совместимости в модуле `future_builtins` и ключ *-3*, который предупреждает об использовании конструкций, ставших недопустимыми в 3.0.1516В стандартную библиотеку добавлено несколько значимых новых пакетов, например модули [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) и [`json`](https://python-all.ru/3.4/library/json.html#module-json), однако новых возможностей, не связанных с Python 3.0, не так много.1718Python 2.6 также содержит ряд улучшений и исправлений ошибок по всему исходному коду. Поиск по журналам изменений показывает, что между Python 2.5 и 2.6 было применено 259 патчей и исправлено 612 ошибок. Обе цифры, вероятно, занижены.1920Эта статья не пытается дать полную спецификацию новых возможностей, а вместо этого предоставляет удобный обзор. За подробностями обращайтесь к документации Python 2.6. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности. По возможности «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.2122## Python 3.02324Цикл разработки версий Python 2.6 и 3.0 был синхронизирован: альфа- и бета-релизы для обеих версий выходили в одни и те же дни. Разработка версии 3.0 повлияла на многие возможности в версии 2.6.2526Python 3.0 – это масштабное перепроектирование Python, которое нарушает совместимость с серией 2.x. Это означает, что существующий код Python потребует некоторой конвертации, чтобы работать на Python 3.0. Однако не все изменения в 3.0 обязательно нарушают совместимость. В тех случаях, когда новые возможности не приводят к нарушению существующего кода, они были перенесены в 2.6 и описаны в этом документе в соответствующих разделах. Некоторые из возможностей, заимствованных из 3.0:2728- Метод [`__complex__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__complex__) для преобразования объектов в комплексное число.29- Альтернативный синтаксис перехвата исключений: `except TypeError as exc`.30- Добавление [`functools.reduce()`](https://python-all.ru/3.4/library/functools.html#functools.reduce) как синонима встроенной функции `reduce()`.3132В Python 3.0 появилось несколько новых встроенных функций, а у некоторых существующих изменилась семантика. Функции, которые являются новыми в 3.0, например [`bin()`](https://python-all.ru/3.4/library/functions.html#bin), просто добавлены в Python 2.6, а существующие встроенные функции не менялись; вместо этого в модуле `future_builtins` представлены версии с новой семантикой из 3.0. Код, написанный с прицелом на совместимость с 3.0, может при необходимости использовать `from future_builtins import hex, map`.3334Новый ключ командной строки *-3* включает предупреждения об особенностях, которые будут удалены в Python 3.0. Запустив код с этим ключом, можно оценить, сколько работы потребуется для переноса кода на 3.0. Значение этого ключа доступно в коде Python как логическая переменная `sys.py3kwarning`, а в C-расширениях – как `Py_Py3kWarningFlag`.3536> **См. также**37>38> Серия PEP 3xxx, содержащая предложения для Python 3.0. [**PEP 3000**](https://python-all.ru/3.4/whatsnew/2.6.html) описывает процесс разработки Python 3.0. Начните с [**PEP 3100**](https://python-all.ru/3.4/whatsnew/2.6.html), который описывает общие цели Python 3.0, а затем изучите PEP с более высокими номерами, предлагающие конкретные функции.3940## Изменения в процессе разработки4142Во время разработки 2.6 процесс разработки Python претерпел два существенных изменения: мы перешли с системы отслеживания ошибок SourceForge на настраиваемую установку Roundup, а документация была преобразована из LaTeX в reStructuredText.4344### Новая система отслеживания ошибок: Roundup4546Долгое время разработчики Python были всё более недовольны системой отслеживания ошибок SourceForge. Решение SourceForge, предоставляемое как услуга, не допускает значительной настройки; например, невозможно было настроить жизненный цикл задач.4748Поэтому комитет по инфраструктуре Python Software Foundation объявил конкурс на системы отслеживания ошибок, попросив добровольцев настроить различные продукты и импортировать некоторые ошибки и патчи из SourceForge. Были рассмотрены четыре различные системы: [Jira](https://python-all.ru/3.4/whatsnew/2.6.html), [Launchpad](https://python-all.ru/3.4/whatsnew/2.6.html), [Roundup](https://python-all.ru/3.4/whatsnew/2.6.html) и [Trac](https://python-all.ru/3.4/whatsnew/2.6.html). В конечном итоге комитет остановился на Jira и Roundup как на двух кандидатах. Jira – коммерческий продукт, который бесплатно предоставляет размещённые экземпляры для проектов свободного программного обеспечения; Roundup – проект с открытым исходным кодом, требующий добровольцев для его администрирования и сервера для его размещения.4950После объявления призыва добровольцев была установлена новая установка Roundup по адресу [https://bugs.python.org](https://python-all.ru/3.4/whatsnew/2.6.html). Одна установка Roundup может обслуживать несколько систем отслеживания, и этот сервер теперь также размещает системы отслеживания ошибок для Jython и для веб-сайта Python. В будущем он, несомненно, найдёт и другое применение. Там, где это возможно, это издание «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.5152Хостинг для системы отслеживания ошибок Python любезно предоставлен [Upfront Systems](https://python-all.ru/3.4/whatsnew/2.6.html) из Стелленбоша, Южная Африка. Мартин фон Лёвис приложил большие усилия для импорта существующих ошибок и патчей из SourceForge; его скрипты для этой операции импорта находятся по адресу [http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.4/whatsnew/2.6.html) и могут быть полезны другим проектам, желающим перейти с SourceForge на Roundup.5354> **См. также**55>56> **[https://bugs.python.org](https://python-all.ru/3.4/whatsnew/2.6.html)**57>58> Система отслеживания ошибок Python.59>60> **[http://bugs.jython.org](https://python-all.ru/3.4/whatsnew/2.6.html):**61>62> Система отслеживания ошибок Jython.63>64> **[http://roundup.sourceforge.net/](https://python-all.ru/3.4/whatsnew/2.6.html)**65>66> Загрузки и документация Roundup.67>68> **[http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.4/whatsnew/2.6.html)**69>70> Сценарии преобразования Мартина фон Лёвиса.7172### Новый формат документации: reStructuredText с использованием Sphinx7374Документация Python писалась с использованием LaTeX с момента запуска проекта около 1989 года. В 1980-х и начале 1990-х большинство документации распечатывалось для последующего изучения, а не просматривалось онлайн. LaTeX широко использовался, поскольку он обеспечивал привлекательный печатный вывод, оставаясь при этом простым в написании после освоения основных правил разметки.7576Сегодня LaTeX всё ещё используется для написания публикаций, предназначенных для печати, но ландшафт инструментов программирования изменился. Мы больше не распечатываем кипы документации; вместо этого мы просматриваем её онлайн, и HTML стал самым важным форматом для поддержки. К сожалению, конвертация LaTeX в HTML довольно сложна, и Фред Л. Дрейк-младший, многолетний редактор документации Python, потратил много времени на поддержание процесса конвертации. Время от времени предлагали перевести документацию в SGML, а затем в XML, но выполнить хорошую конвертацию – большая задача, и никто не взял на себя необходимое для завершения работы время.7778В ходе цикла разработки 2.6 Георг Брандль вложил много усилий в создание нового инструментария для обработки документации. Получившийся пакет называется Sphinx и доступен по адресу [http://sphinx.pocoo.org/](https://python-all.ru/3.4/whatsnew/2.6.html).7980Sphinx ориентируется на вывод HTML, создавая привлекательно оформленный и современный HTML; печатный вывод по-прежнему поддерживается через конвертацию в LaTeX. Входной формат – reStructuredText, синтаксис разметки с поддержкой пользовательских расширений и директив, широко используемый в сообществе Python.8182Sphinx – это самостоятельный пакет, который можно использовать для написания документации, и почти два десятка других проектов ([перечислены на веб-сайте Sphinx](https://python-all.ru/3.4/whatsnew/2.6.html)) приняли Sphinx в качестве своего инструмента документирования.8384> **См. также**85>86> **[Документирование Python](https://python-all.ru/3.4/devguide/documenting.html)**87>88> Описывает, как писать документацию для Python.89>90> **[Sphinx](https://python-all.ru/3.4/whatsnew/2.6.html)**91>92> Документация и код для инструментария Sphinx.93>94> **[Docutils](https://python-all.ru/3.4/whatsnew/2.6.html)**95>96> Базовый парсер reStructuredText и набор инструментов.9798## PEP 343: Оператор ‘with’99100В предыдущей версии, Python 2.5, оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ был добавлен как опциональная возможность, включаемая директивой `from __future__ import with_statement`. В версии 2.6 этот оператор больше не требует специального включения, то есть [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) теперь всегда является ключевым словом. Остальная часть раздела представляет собой копию соответствующего раздела из документа «Что нового в Python 2.5»; если вы знакомы с оператором ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ из Python 2.5, этот раздел можно пропустить.101102Оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ делает код понятнее в тех случаях, где раньше приходилось использовать блоки `try...finally` для гарантированного выполнения очистки. В этом разделе мы обсудим типичное применение оператора. В следующем разделе будут рассмотрены детали реализации и показано, как создавать объекты для работы с этим оператором.103104Оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ – это управляющая конструкция, имеющая следующую базовую структуру:105106```python107with expression [as variable]:108 with-block109```110111Выражение вычисляется, и в результате должен получиться объект, поддерживающий протокол управления контекстом (то есть имеющий методы [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__)).112113Метод [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__) объекта вызывается до выполнения *with-блока* и поэтому может выполнить подготовительный код. Он также может вернуть значение, которое при наличии ключевого слова *variable* привязывается к этому имени. (Обратите внимание: *variable* *не* присваивается результат *expression*.)114115После завершения выполнения *with-блока* вызывается метод [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) объекта, даже если блок вызвал исключение, и поэтому может выполнить код очистки.116117Некоторые стандартные объекты Python теперь поддерживают протокол управления контекстом и могут использоваться с оператором ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘. Файловые объекты – один из примеров:118119```python120with open('/etc/passwd', 'r') as f:121 for line in f:122 print line123 ... more processing code ...124```125126После выполнения этого оператора файловый объект в переменной *f* будет автоматически закрыт, даже если цикл [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) вызовет исключение в середине блока.127128> **Примечание**129>130> В этом случае *f* – это тот же объект, который создан функцией [`open()`](https://python-all.ru/3.4/library/functions.html#open), поскольку `file.__enter__()` возвращает *self*.131132Блокировки и условные переменные модуля [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) также поддерживают оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘:133134```python135lock = threading.Lock()136with lock:137 # Критическая секция кода138 ...139```140141Блокировка захватывается перед выполнением блока и всегда освобождается после завершения блока.142143Функция `localcontext()` в модуле [`decimal`](https://python-all.ru/3.4/library/decimal.html#module-decimal) упрощает сохранение и восстановление текущего десятичного контекста, который задаёт желаемую точность и правила округления для вычислений:144145```python146from decimal import Decimal, Context, localcontext147148# Отображается с точностью по умолчанию в 28 знаков149v = Decimal('578')150print v.sqrt()151152with localcontext(Context(prec=16)):153 # Весь код в этом блоке использует точность в 16 знаков.154 # Исходный контекст восстанавливается при выходе из блока.155 print v.sqrt()156```157158### Написание контекстных менеджеров159160Под капотом оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ устроен довольно сложно. Большинству людей достаточно использовать ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘ с уже существующими объектами, и вникать в детали необязательно – этот раздел можно пропустить. Но тем, кто создаёт новые объекты, понадобится разобраться в тонкостях реализации, так что им стоит читать дальше.161162Объяснение протокола управления контекстом на высоком уровне:163164- Выражение вычисляется и должно вернуть объект, называемый «менеджером контекста». Менеджер контекста должен иметь методы [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__).165- Вызывается метод [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__) менеджера контекста. Возвращённое значение присваивается *VAR*. Если конструкция `as VAR` отсутствует, значение просто игнорируется.166- Код внутри *блока* выполняется.167- Если *BLOCK* вызывает исключение, метод [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) менеджера контекста вызывается с тремя аргументами – информацией об исключении (`type, value, traceback` – те же значения, что возвращает [`sys.exc_info()`](https://python-all.ru/3.4/library/sys.html#sys.exc_info), а если исключения не было – `None`). Возвращаемое значение метода определяет, будет ли исключение возбуждено повторно: любое ложное значение повторно возбуждает исключение, а `True` – подавляет его. Подавлять исключение приходится крайне редко, потому что иначе автор кода, содержащего оператор ‘[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)‘, никогда не узнает, что что-то пошло не так.168- Если *BLOCK* не вызвал исключение, метод [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) всё равно вызывается, но *type*, *value* и *traceback* равны `None`.169170Рассмотрим пример. Мы не будем приводить подробный код, а лишь в общих чертах опишем методы, необходимые для базы данных, поддерживающей транзакции.171172(Для тех, кто не знаком с терминологией баз данных: набор изменений в базе данных группируется в транзакцию. Транзакции могут быть либо зафиксированы (committed) – это означает, что все изменения записаны в базу данных, либо откачены (rolled back) – что означает, что все изменения отменены, а база данных не изменена. За дополнительной информацией обращайтесь к любому учебнику по базам данных.)173174Предположим, что существует объект, представляющий подключение к базе данных. Наша цель – позволить пользователю написать такой код:175176```python177db_connection = DatabaseConnection()178with db_connection as cursor:179 cursor.execute('insert into ...')180 cursor.execute('delete from ...')181 # ... дополнительные операции ...182```183184Транзакция должна быть зафиксирована, если код в блоке выполняется без ошибок, или откачена, если возникло исключение. Вот базовый интерфейс для `DatabaseConnection`, который я буду использовать:185186```python187class DatabaseConnection:188 # Интерфейс базы данных189 def cursor(self):190 "Returns a cursor object and starts a new transaction"191 def commit(self):192 "Commits current transaction"193 def rollback(self):194 "Rolls back current transaction"195```196197Метод [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__) довольно прост: нужно только начать новую транзакцию. Для этого приложения результирующий объект курсора будет полезен, поэтому метод вернёт его. Затем пользователь может добавить `as cursor` в оператор '[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)', чтобы привязать курсор к имени переменной.198199```python200class DatabaseConnection:201 ...202 def __enter__(self):203 # Код для запуска новой транзакции204 cursor = self.cursor()205 return cursor206```207208Метод [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) самый сложный, потому что в нём выполняется большая часть работы. Метод должен проверить, произошло ли исключение. Если исключения не было, транзакция фиксируется. Если было, транзакция откатывается.209210В приведённом ниже коде выполнение просто дойдёт до конца функции, возвращая значение по умолчанию `None`. `None` – ложное значение, поэтому исключение будет возбуждено повторно автоматически. При желании можно быть более явным и добавить оператор [`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return) в отмеченном месте.211212```python213class DatabaseConnection:214 ...215 def __exit__(self, type, value, tb):216 if tb is None:217 # Исключения нет, поэтому фиксация218 self.commit()219 else:220 # Произошло исключение, поэтому откат221 self.rollback()222 # return False223```224225### Модуль contextlib226227Модуль [`contextlib`](https://python-all.ru/3.4/library/contextlib.html#module-contextlib) предоставляет несколько функций и декоратор, которые полезны при написании объектов для использования с оператором '[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)'.228229Декоратор называется `contextmanager()` и позволяет написать одну функцию-генератор вместо определения нового класса. Генератор должен выдать (yield) ровно одно значение. Код до [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield) будет выполняться как метод [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__), а выданное значение будет возвращаемым значением метода, которое будет связано с переменной в части [`as`](https://python-all.ru/3.4/reference/compound_stmts.html#as) оператора '[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)', если она есть. Код после [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield) будет выполняться в методе [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__). Любое исключение, возникшее в блоке, будет возбуждено оператором [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield).230231Используя этот декоратор, наш пример с базой данных из предыдущего раздела можно было бы записать так:232233```python234from contextlib import contextmanager235236@contextmanager237def db_transaction(connection):238 cursor = connection.cursor()239 try:240 yield cursor241 except:242 connection.rollback()243 raise244 else:245 connection.commit()246247db = DatabaseConnection()248with db_transaction(db) as cursor:249 ...250```251252Модуль [`contextlib`](https://python-all.ru/3.4/library/contextlib.html#module-contextlib) также содержит функцию `nested(mgr1, mgr2, ...)`, которая объединяет несколько менеджеров контекста, чтобы не нужно было писать вложенные операторы '[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)'. В этом примере один оператор '[`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)' одновременно начинает транзакцию базы данных и захватывает блокировку потока:253254```python255lock = threading.Lock()256with nested (db_transaction(db), lock) as (cursor, locked):257 ...258```259260Наконец, функция `closing()` возвращает свой аргумент, чтобы его можно было привязать к переменной, и вызывает метод `.close()` аргумента в конце блока.261262```python263import urllib, sys264from contextlib import closing265266with closing(urllib.urlopen('http://www.yahoo.com')) as f:267 for line in f:268 sys.stdout.write(line)269```270271> **См. также**272>273> **[**PEP 343**](https://python-all.ru/3.4/whatsnew/2.6.html) – Оператор «with»**274>275> PEP написан Гвидо ван Россумом и Ником Когланом; реализован Майком Блэндом, Гвидо ван Россумом и Нилом Норвитцем. В PEP показан код, генерируемый для оператора '276>277> [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with)278>279> ', что может быть полезно для понимания работы этого оператора.280>281> Документация для модуля [`contextlib`](https://python-all.ru/3.4/library/contextlib.html#module-contextlib).282283## PEP 366: Явные относительные импорты из главного модуля284285Опция [*-m*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-m) в Python позволяет запускать модуль как сценарий. При запуске модуля, находящегося внутри пакета, относительные импорты работали некорректно.286287Исправление для Python 2.6 добавляет атрибут [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) в модули. Когда этот атрибут присутствует, относительные импорты будут выполняться относительно значения этого атрибута, а не атрибута [`__name__`](https://python-all.ru/3.4/reference/import.html#__name__).288289Импортёры в стиле PEP 302 могут затем устанавливать [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) по необходимости. Модуль [`runpy`](https://python-all.ru/3.4/library/runpy.html#module-runpy), который реализует опцию [*-m*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-m), теперь делает это, поэтому относительные импорты будут работать корректно в сценариях, запускаемых изнутри пакета.290291## PEP 370: Персональный каталог `site-packages`292293При запуске Python пути поиска модулей `sys.path` обычно включает каталог, путь которого заканчивается на `"site-packages"`. Этот каталог предназначен для хранения локально установленных пакетов, доступных всем пользователям машины или конкретной установки.294295Python 2.6 вводит соглашение о каталогах site, специфичных для пользователя. Каталог зависит от платформы:296297- Unix и Mac OS X: `~/.local/`298- Windows: `%APPDATA%/Python`299300Внутри этого каталога будут подкаталоги, специфичные для версий, такие как `lib/python2.6/site-packages` в Unix/Mac OS и `Python26/site-packages` в Windows.301302Если каталог по умолчанию не устраивает, его можно переопределить с помощью переменной окружения. [`PYTHONUSERBASE`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONUSERBASE) задаёт корневой каталог, используемый для всех версий Python, поддерживающих эту возможность. В Windows каталог для данных приложения можно изменить, установив переменную окружения `APPDATA`. Также можно изменить файл `site.py` для вашей установки Python.303304Эту возможность можно полностью отключить, запустив Python с опцией [*-s*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-s) или установив переменную окружения [`PYTHONNOUSERSITE`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONNOUSERSITE).305306> **См. также**307>308> **[**PEP 370**](https://python-all.ru/3.4/whatsnew/2.6.html) – Персональный каталог `site-packages`**309>310> PEP написан и реализован Кристианом Хеймсом.311312## PEP 371: Пакет `multiprocessing`313314Новый пакет [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) позволяет программам Python создавать новые процессы, которые будут выполнять вычисления и возвращать результат родительскому процессу. Родительский и дочерние процессы могут общаться с помощью очередей и каналов, синхронизировать свои операции с помощью блокировок и семафоров, а также могут совместно использовать простые массивы данных.315316Модуль [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) изначально был точной эмуляцией модуля [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading), использующей процессы вместо потоков. Эта цель была отброшена на пути к Python 2.6, но общий подход модуля остаётся похожим. Основным классом является `Process`, которому передаётся вызываемый объект и набор аргументов. Метод `start()` запускает вызываемый объект в подпроцессе, после чего можно вызвать метод `is_alive()`, чтобы проверить, работает ли ещё подпроцесс, и метод `join()`, чтобы дождаться завершения процесса.317318Вот простой пример, где подпроцесс вычисляет факториал. Функция, выполняющая вычисление, написана так, что она работает значительно дольше, когда входной аргумент кратен 4.319320```python321import time322from multiprocessing import Process, Queue323324def factorial(queue, N):325 "Compute a factorial."326 # Если N кратно 4, эта функция будет выполняться намного дольше327 if (N % 4) == 0:328 time.sleep(.05 * N/4)329330 # Вычислить результат331 fact = 1L332 for i in range(1, N+1):333 fact = fact * i334335 # Поместить результат в очередь336 queue.put(fact)337338if __name__ == '__main__':339 queue = Queue()340341 N = 5342343 p = Process(target=factorial, args=(queue, N))344 p.start()345 p.join()346347 result = queue.get()348 print 'Factorial', N, '=', result349```350351`Очередь` используется для передачи результата факториала. Объект `очереди` хранится в глобальной переменной. Дочерний процесс будет использовать значение переменной на момент его создания; поскольку это `очередь`, родительский и дочерний процессы могут общаться через этот объект. (Если бы родитель изменил значение глобальной переменной, значение дочернего процесса не изменилось бы, и наоборот.)352353Два других класса, `Pool` и `Manager`, предоставляют интерфейсы более высокого уровня. `Pool` создаёт фиксированное количество рабочих процессов, и затем запросы могут быть распределены между рабочими процессами вызовом `apply()` или `apply_async()` для добавления одного запроса, и [`map()`](https://python-all.ru/3.4/library/functions.html#map) или `map_async()` для добавления нескольких запросов. Следующий код использует `Pool` для распределения запросов между 5 рабочими процессами и получения списка результатов:354355```python356from multiprocessing import Pool357358def factorial(N, dictionary):359 "Compute a factorial."360 ...361p = Pool(5)362result = p.map(factorial, range(1, 1000, 10))363for v in result:364 print v365```366367Это даёт следующий вывод:368369```python37013713991680037251090942171709440000373822283865417792281772556288000000037433452526613163807108170062053440751665152000000000375...376```377378Другой интерфейс высокого уровня, класс `Manager`, создаёт отдельный серверный процесс, который может хранить главные копии структур данных Python. Другие процессы могут затем обращаться к этим структурам данных и изменять их с помощью прокси-объектов. Следующий пример создаёт общий словарь вызовом метода [`dict()`](https://python-all.ru/3.4/library/stdtypes.html#dict); затем рабочие процессы вставляют значения в словарь. (Блокировка не выполняется автоматически, что в этом примере не важно. Методы `Manager` также включают `Lock()`, `RLock()` и `Semaphore()` для создания общих блокировок.)379380```python381import time382from multiprocessing import Pool, Manager383384def factorial(N, dictionary):385 "Compute a factorial."386 # Вычислить результат387 fact = 1L388 for i in range(1, N+1):389 fact = fact * i390391 # Сохранить результат в словаре392 dictionary[N] = fact393394if __name__ == '__main__':395 p = Pool(5)396 mgr = Manager()397 d = mgr.dict() # Создать общий словарь398399 # Запустить задачи с помощью пула400 for N in range(1, 1000, 10):401 p.apply_async(factorial, (N, d))402403 # Отметить пул как закрытый – больше задач добавить нельзя404 p.close()405406 # Ожидать завершения задач407 p.join()408409 # Вывести результаты410 for k, v in sorted(d.items()):411 print k, v412```413414Это выведет следующий результат:415416```python4171 141811 3991680041921 5109094217170944000042031 822283865417792281772556288000000042141 3345252661316380710817006205344075166515200000000042251 15511187532873822802242430164693032110632597200169861120000...423```424425> **См. также**426>427> Документация для модуля [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing).428>429> **[**PEP 371**](https://python-all.ru/3.4/whatsnew/2.6.html) – Добавление пакета multiprocessing**430>431> PEP написан Джесси Ноллером и Ричардом Удкерком; реализован Ричардом Удкерком и Джесси Ноллером.432433## PEP 3101: Расширенное форматирование строк434435В Python 3.0 оператор *%* дополнен более мощным методом форматирования строк [`format()`](https://python-all.ru/3.4/library/functions.html#format). Поддержка метода [`str.format()`](https://python-all.ru/3.4/library/stdtypes.html#str.format) была перенесена в Python 2.6.436437В версии 2.6 как 8-битные, так и строки Unicode имеют метод *.format()*, который рассматривает строку как шаблон и принимает аргументы для форматирования. Шаблон форматирования использует фигурные скобки (*{*, *}*) в качестве специальных символов:438439```python440>>> # Подставить позиционный аргумент 0 в строку441>>> "User ID: {0}".format("root")442'User ID: root'443>>> # Использовать именованные аргументы-ключевые слова444>>> "User ID: {uid} Last seen: {last_login}".format(445... uid="root",446... last_login = "5 Mar 2008 07:20")447'User ID: root Last seen: 5 Mar 2008 07:20'448```449450Фигурные скобки можно экранировать, удваивая их:451452```python453>>> "Empty dict: {{}}".format()454"Empty dict: {}"455```456457Имена полей могут быть целыми числами, указывающими на позиционные аргументы, например `{0}`, `{1}` и т.д., или именами именованных аргументов. Также можно указывать составные имена полей, которые читают атрибуты или получают доступ к ключам словаря:458459```python460>>> import sys461>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)462Platform: darwin463Python version: 2.6a1+ (trunk:61261M, Mar 5 2008, 20:29:41)464[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'465466>>> import mimetypes467>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)468'Content-type: video/mp4'469```470471Обратите внимание, что при использовании нотации в стиле словаря, например `[.mp4]`, не нужно заключать строку в кавычки; значение будет найдено по ключу `.mp4`. Строки, начинающиеся с цифры, преобразуются в целое число. Внутри строки формата нельзя писать более сложные выражения.472473До сих пор мы показывали, как указать, какое поле подставить в результирующую строку. Точное форматирование также можно контролировать, добавляя двоеточие и спецификатор формата. Например:474475```python476>>> # Поле 0: выравнивание влево, заполнить до 15 символов477>>> # Поле 1: выравнивание вправо, заполнить до 6 символов478>>> fmt = '{0:15} ${1:>6}'479>>> fmt.format('Registration', 35)480'Registration $ 35'481>>> fmt.format('Tutorial', 50)482'Tutorial $ 50'483>>> fmt.format('Banquet', 125)484'Banquet $ 125'485```486487Спецификаторы формата могут ссылаться на другие поля через вложение:488489```python490>>> fmt = '{0:{1}}'491>>> width = 15492>>> fmt.format('Invoice #1234', width)493'Invoice #1234 '494>>> width = 35495>>> fmt.format('Invoice #1234', width)496'Invoice #1234 '497```498499Выравнивание поля в заданной ширине можно указать:500501| Символ | Эффект |502| --- | --- |503| \< (по умолчанию) | Выравнивание влево |504| \> | Выравнивание вправо |505| ^ | По центру |506| = | (Только для числовых типов) Заполнение после знака. |507508Спецификаторы формата также могут включать тип представления, который управляет форматированием значения. Например, числа с плавающей запятой могут быть отформатированы как обычное число или в экспоненциальной нотации:509510```python511>>> '{0:g}'.format(3.75)512'3.75'513>>> '{0:e}'.format(3.75)514'3.750000e+00'515```516517Доступны различные типы представления. Обратитесь к документации Python 2.6 за [*полным списком*](https://python-all.ru/3.4/library/string.html#formatstrings); вот пример:518519| `b` | Двоичный. Выводит число по основанию 2. |520| --- | --- |521| `c` | Символьный. Преобразует целое число в соответствующий символ Unicode перед выводом. |522| `d` | Десятичное целое. Выводит число в системе с основанием 10. |523| `o` | Восьмеричный формат. Выводит число в системе с основанием 8. |524| `x` | Шестнадцатеричный. Выводит число по основанию 16, используя строчные буквы для цифр старше 9. |525| `e` | Экспоненциальная запись. Выводит число в научной нотации с использованием буквы 'e' для обозначения экспоненты. |526| `g` | Общий формат. Выводит число в формате с фиксированной точкой, если только число не слишком велико, в этом случае переключается на экспоненциальную нотацию 'e'. |527| `n` | Число. Аналогично 'g' (для чисел с плавающей запятой) или 'd' (для целых чисел), но с использованием текущей локали для вставки соответствующих разделителей разрядов. |528| `%` | Проценты. Умножает число на 100 и выводит в фиксированном формате ('f'), с последующим знаком процента. |529530Классы и типы могут определить метод [`__format__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__format__), чтобы управлять тем, как они форматируются. Он получает один аргумент – спецификатор формата:531532```python533def __format__(self, format_spec):534 if isinstance(format_spec, unicode):535 return unicode(str(self))536 else:537 return str(self)538```539540Существует также встроенная функция [`format()`](https://python-all.ru/3.4/library/functions.html#format), которая форматирует одно значение. Она вызывает метод [`__format__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__format__) типа с переданным спецификатором:541542```python543>>> format(75.6564, '.2f')544'75.66'545```546547> **См. также**548>549> **[*Синтаксис строк форматирования*](https://python-all.ru/3.4/library/string.html#formatstrings)**550>551> Справочная документация по полям формата.552>553> **[**PEP 3101**](https://python-all.ru/3.4/whatsnew/2.6.html) - Расширенное форматирование строк**554>555> PEP написан Талином. Реализован Эриком Смитом.556557## PEP 3105: `print` как функция558559Инструкция `print` становится функцией [`print()`](https://python-all.ru/3.4/library/functions.html#print) в Python 3.0. Превращение [`print()`](https://python-all.ru/3.4/library/functions.html#print) в функцию позволяет заменить её, написав `def print(...)` или импортировав новую функцию откуда-то ещё.560561В Python 2.6 есть импорт `__future__`, который удаляет `print` как синтаксис языка, позволяя вместо этого использовать функциональную форму. Например:562563```python564>>> from __future__ import print_function565>>> print('# of entries', len(dictionary), file=sys.stderr)566```567568Сигнатура новой функции:569570```python571def print(*args, sep=' ', end='\n', file=None)572```573574Параметры:575576> - *args*: позиционные аргументы, значения которых будут выведены.577> - *sep*: разделитель, который будет выводиться между аргументами.578> - *end*: завершающий текст, который будет выведен после того, как все аргументы будут выведены.579> - *file*: файловый объект, в который будет отправлен вывод.580581> **См. также**582>583> **[**PEP 3105**](https://python-all.ru/3.4/whatsnew/2.6.html) - Сделать print функцией**584>585> PEP написан Георгом Брандлом.586587## PEP 3110: Изменения в обработке исключений588589Одна ошибка, которую иногда допускают программисты Python, – написание следующего кода:590591```python592try:593 ...594except TypeError, ValueError: # Неверно!595 ...596```597598Вероятно, автор пытается перехватить исключения [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) и [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), но этот код на самом деле делает нечто иное: он перехватывает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) и связывает полученный объект исключения с локальным именем `"ValueError"`. Исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) не будет перехвачено вовсе. Правильный код указывает кортеж исключений:599600```python601try:602 ...603except (TypeError, ValueError):604 ...605```606607Эта ошибка возникает из-за неоднозначности использования запятой: обозначает ли она два разных узла в дереве разбора или один узел, являющийся кортежем?608609Python 3.0 устраняет эту неоднозначность, заменяя запятую словом «as». Чтобы перехватить исключение и сохранить объект исключения в переменной `exc`, нужно написать:610611```python612try:613 ...614except TypeError as exc:615 ...616```617618Python 3.0 будет поддерживать только использование «as» и, следовательно, интерпретирует первый пример как перехват двух разных исключений. Python 2.6 поддерживает как запятую, так и «as», поэтому существующий код продолжит работать. Поэтому рекомендуется использовать «as» при написании нового кода Python, который будет выполняться только в 2.6.619620> **См. также**621>622> **[**PEP 3110**](https://python-all.ru/3.4/whatsnew/2.6.html) - Перехват исключений в Python 3000**623>624> PEP написан и реализован Коллином Уинтером.625626## PEP 3112: Байтовые литералы627628Python 3.0 принимает Unicode в качестве основного строкового типа языка и обозначает 8-битные литералы иначе: либо как `b'string'`, либо с помощью конструктора [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes). Для обратной совместимости Python 2.6 добавляет [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) как синоним для типа [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), а также поддерживает нотацию `b''`.629630Тип [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) в 2.6 отличается от типа [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) в 3.0 по нескольким параметрам; самое заметное – конструктор совершенно другой. В 3.0 `bytes([65, 66, 67])` состоит из 3 элементов и содержит байты, соответствующие `ABC`; в 2.6 `bytes([65, 66, 67])` возвращает 12-байтовую строку, представляющую результат [`str()`](https://python-all.ru/3.4/library/stdtypes.html#str) от списка.631632Основное применение [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) в Python 2.6 будет заключаться в написании проверок типа объекта, таких как `isinstance(x, bytes)`. Это поможет конвертеру 2to3, который не может определить, предполагается ли в коде 2.x, что строки содержат символы или 8-битные байты; теперь можно использовать либо [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), либо [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), чтобы точно выразить своё намерение, и полученный код также будет корректен в Python 3.0.633634Существует также импорт `__future__`, который приводит к тому, что все строковые литералы становятся строками Unicode. Это означает, что управляющие последовательности `\u` можно использовать для включения символов Unicode:635636```python637from __future__ import unicode_literals638639s = ('\u751f\u3080\u304e\u3000\u751f\u3054'640 '\u3081\u3000\u751f\u305f\u307e\u3054')641642print len(s) # 12 символов Unicode643```644645На уровне C Python 3.0 переименует существующий 8-битный строковый тип, называемый `PyStringObject` в Python 2.x, в [`PyBytesObject`](https://python-all.ru/3.4/c-api/bytes.html#c.PyBytesObject). Python 2.6 использует `#define`, чтобы обеспечить возможность использования имён [`PyBytesObject()`](https://python-all.ru/3.4/c-api/bytes.html#c.PyBytesObject), [`PyBytes_Check()`](https://python-all.ru/3.4/c-api/bytes.html#c.PyBytes_Check), [`PyBytes_FromStringAndSize()`](https://python-all.ru/3.4/c-api/bytes.html#c.PyBytes_FromStringAndSize) и всех остальных функций и макросов, используемых со строками.646647Экземпляры типа [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) неизменяемы, как и строки. Новый тип [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray) хранит изменяемую последовательность байтов:648649```python650>>> bytearray([65, 66, 67])651bytearray(b'ABC')652>>> b = bytearray(u'\u21ef\u3244', 'utf-8')653>>> b654bytearray(b'\xe2\x87\xaf\xe3\x89\x84')655>>> b[0] = '\xe3'656>>> b657bytearray(b'\xe3\x87\xaf\xe3\x89\x84')658>>> unicode(str(b), 'utf-8')659u'\u31ef \u3244'660```661662Массивы байтов поддерживают большинство методов строковых типов, таких как `startswith()`/`endswith()`, `find()`/`rfind()`, а также некоторые методы списков, например `append()`, `pop()` и `reverse()`.663664```python665>>> b = bytearray('ABC')666>>> b.append('d')667>>> b.append(ord('e'))668>>> b669bytearray(b'ABCde')670```671672Существует также соответствующий C API с функциями [`PyByteArray_FromObject()`](https://python-all.ru/3.4/c-api/bytearray.html#c.PyByteArray_FromObject), [`PyByteArray_FromStringAndSize()`](https://python-all.ru/3.4/c-api/bytearray.html#c.PyByteArray_FromStringAndSize) и другими.673674> **См. также**675>676> **[**PEP 3112**](https://python-all.ru/3.4/whatsnew/2.6.html) - Байтовые литералы в Python 3000**677>678> PEP написан Джейсоном Орендорфом; портирован в 2.6 Кристианом Хаймсом.679680## PEP 3116: Новая библиотека ввода-вывода681682Встроенные файловые объекты Python поддерживают ряд методов, но файлоподобные объекты не обязательно поддерживают их все. Объекты, имитирующие файлы, обычно поддерживают `read()` и `write()`, но могут не поддерживать, например, [`readline()`](https://python-all.ru/3.4/library/readline.html#module-readline). Python 3.0 вводит многоуровневую библиотеку ввода-вывода в модуле [`io`](https://python-all.ru/3.4/library/io.html#module-io), которая отделяет буферизацию и обработку текста от базовых операций чтения и записи.683684Модуль [`io`](https://python-all.ru/3.4/library/io.html#module-io) предоставляет три уровня абстрактных базовых классов:685686- `RawIOBase` определяет низкоуровневые операции ввода-вывода: `read()`, `readinto()`, `write()`, `seek()`, `tell()`, `truncate()` и `close()`. Большинство методов этого класса обычно отображаются на один системный вызов. Также есть методы `readable()`, `writable()` и `seekable()` для определения того, какие операции разрешены для данного объекта.687688 Python 3.0 имеет конкретные реализации этого класса для файлов и сокетов, но Python 2.6 не перестраивал свои файловые объекты и сокеты таким образом.689- `BufferedIOBase` – это абстрактный базовый класс, который буферизует данные в памяти, чтобы уменьшить количество используемых системных вызовов, делая обработку ввода-вывода более эффективной. Он поддерживает все методы `RawIOBase` и добавляет атрибут `raw`, содержащий базовый низкоуровневый объект.690691 Есть пять конкретных классов, реализующих этот ABC. `BufferedWriter` и `BufferedReader` предназначены для объектов, поддерживающих только запись или только чтение, которые имеют метод `seek()` для произвольного доступа. Объекты `BufferedRandom` поддерживают чтение и запись на одном и том же базовом потоке, а `BufferedRWPair` предназначен для таких объектов, как TTY, которые имеют операции чтения и записи, действующие на несвязанных потоках данных. Класс `BytesIO` поддерживает чтение, запись и позиционирование в буфере в памяти.692- `TextIOBase`: предоставляет функции для чтения и записи строк (напомним, в Python 3.0 строки будут Unicode), а также поддержку [*универсальных символов новой строки*](https://python-all.ru/3.4/glossary.html#term-universal-newlines). `TextIOBase` определяет метод [`readline()`](https://python-all.ru/3.4/library/readline.html#module-readline) и поддерживает итерацию по объектам.693694 Есть две конкретные реализации. `TextIOWrapper` оборачивает буферизованный объект ввода-вывода, поддерживая все методы для текстового ввода-вывода и добавляя атрибут `buffer` для доступа к базовому объекту. `StringIO` просто буферизует всё в памяти, никогда ничего не записывая на диск.695696 (В Python 2.6 [`io.StringIO`](https://python-all.ru/3.4/library/io.html#io.StringIO) реализован на чистом Python, поэтому он довольно медленный. Поэтому пока следует придерживаться существующего модуля `StringIO` или `cStringIO`. Рано или поздно модуль [`io`](https://python-all.ru/3.4/library/io.html#module-io) Python 3.0 будет переписан на C для ускорения, и, возможно, реализация на C будет перенесена в версии 2.x.)697698В Python 2.6 базовые реализации не были перестроены, чтобы основываться на классах модуля [`io`](https://python-all.ru/3.4/library/io.html#module-io). Этот модуль предоставляется, чтобы упростить написание кода, совместимого с Python 3.0, и избавить разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.699700> **См. также**701>702> **[**PEP 3116**](https://python-all.ru/3.4/whatsnew/2.6.html) - Новый ввод-вывод**703>704> PEP написан Дэниелом Штуцбахом, Майком Вердоне и Гвидо ван Россумом. Код – Гвидо ван Россум, Георг Брандль, Вальтер Дёрвальд, Джереми Хилтон, Мартин фон Лёвис, Тони Лаундс и другие.705706## PEP 3118: Пересмотренный буферный протокол707708Протокол буфера – это C-уровневый API, который позволяет типам Python обмениваться указателями на свои внутренние представления. Например, файл, отображаемый в память, можно рассматривать как буфер символов, и это позволяет другому модулю, например [`re`](https://python-all.ru/3.4/library/re.html#module-re), обрабатывать такие файлы как строку символов для поиска.709710Основными пользователями буферного протокола являются пакеты для численных расчетов, такие как NumPy, которые предоставляют доступ к внутреннему представлению массивов, чтобы вызывающие могли записывать данные напрямую в массив, а не через более медленный API. Данный PEP обновляет буферный протокол с учетом опыта разработки NumPy, добавляя ряд новых возможностей, таких как указание формы массива или блокировка области памяти.711712Самая важная новая функция C API – это `PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)`, которая принимает объект и набор флагов и заполняет структуру `Py_buffer` информацией о представлении объекта в памяти. Объекты могут использовать эту операцию для блокировки памяти, пока внешний вызывающий код может изменять содержимое, поэтому существует соответствующая функция `PyBuffer_Release(Py_buffer *view)`, чтобы сообщить, что внешний вызывающий код завершил работу.713714Аргумент *flags* функции [`PyObject_GetBuffer()`](https://python-all.ru/3.4/c-api/buffer.html#c.PyObject_GetBuffer) задаёт ограничения на возвращаемую память. Некоторые примеры:715716> - `PyBUF_WRITABLE` указывает, что память должна быть доступна для записи.717> - `PyBUF_LOCK` запрашивает блокировку только для чтения или исключительную блокировку памяти.718> - `PyBUF_C_CONTIGUOUS` и `PyBUF_F_CONTIGUOUS` запрашивают C-непрерывный (последнее измерение изменяется быстрее всего) или Fortran-непрерывный (первое измерение изменяется быстрее всего) макет массива.719720Два новых кода аргументов для [`PyArg_ParseTuple()`](https://python-all.ru/3.4/c-api/arg.html#c.PyArg_ParseTuple), `s*` и `z*`, возвращают заблокированные буферные объекты для параметра.721722> **См. также**723>724> **[**PEP 3118**](https://python-all.ru/3.4/whatsnew/2.6.html) - Пересмотр буферного протокола**725>726> PEP написан Трэвисом Олифантом и Карлом Бэнксом; реализован Трэвисом Олифантом.727728## PEP 3119: Абстрактные базовые классы729730Некоторые объектно-ориентированные языки, такие как Java, поддерживают интерфейсы, объявляя, что класс имеет заданный набор методов или поддерживает определённый протокол доступа. Абстрактные базовые классы (или ABC) – это аналогичная возможность для Python. Поддержка ABC состоит из модуля [`abc`](https://python-all.ru/3.4/library/abc.html#module-abc), содержащего метакласс `ABCMeta`, специальной обработки этого метакласса встроенными функциями [`isinstance()`](https://python-all.ru/3.4/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.4/library/functions.html#issubclass), а также набора базовых ABC, которые разработчики Python считают широко полезными. Вероятно, будущие версии Python добавят больше ABC.731732Let’s say you have a particular class and wish to know whether it supports dictionary-style access. The phrase “dictionary-style” is vague, however. It probably means that accessing items with `obj[1]` works. Does it imply that setting items with `obj[2] = value` works? Or that the object will have `keys()`, `values()`, and `items()` methods? What about the iterative variants such as `iterkeys()`? [`copy()`](https://python-all.ru/3.4/library/copy.html#module-copy) and `update()`? Iterating over the object with [`iter()`](https://python-all.ru/3.4/library/functions.html#iter)?733734Модуль [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) в Python 2.6 содержит несколько разных ABC, отражающих эти различия. `Iterable` означает, что класс определяет [`__iter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__iter__), а `Container` – что класс определяет метод [`__contains__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__contains__) и, следовательно, поддерживает выражения `x in y`. Базовый интерфейс словаря – получение и установка элементов, а также `keys()`, `values()` и `items()` – определяется ABC `MutableMapping`.735736Можно наследовать свои классы от конкретной ABC, чтобы указать, что они поддерживают интерфейс этой ABC:737738```python739import collections740741class Storage(collections.MutableMapping):742 ...743```744745В качестве альтернативы можно написать класс без наследования от нужного ABC и вместо этого зарегистрировать класс, вызвав метод `register()` этого ABC:746747```python748import collections749750class Storage:751 ...752753collections.MutableMapping.register(Storage)754```755756Для классов, которые вы пишете, наследование от ABC, вероятно, понятнее. Метод `register()` полезен, когда вы написали новый ABC, который может описать существующий тип или класс, или если вы хотите объявить, что какой-то сторонний класс реализует ABC. Например, если вы определили ABC `PrintableType`, то вполне допустимо сделать так:757758```python759# Зарегистрировать типы Python760PrintableType.register(int)761PrintableType.register(float)762PrintableType.register(str)763```764765Классы должны следовать семантике, заданной ABC, но Python не может это проверить; автор класса должен сам понять требования ABC и реализовать код соответствующим образом.766767Чтобы проверить, поддерживает ли объект определённый интерфейс, можно теперь написать:768769```python770def func(d):771 if not isinstance(d, collections.MutableMapping):772 raise ValueError("Mapping object expected, not %r" % d)773```774775Не думайте, что теперь нужно начинать писать множество проверок, как в примере выше. У Python сложилась сильная традиция утиной типизации, где явная проверка типов никогда не выполняется, а код просто вызывает методы объекта, полагаясь, что эти методы существуют, и возбуждает исключение, если их нет. Будьте осмотрительны при проверке ABC и делайте это только в случае крайней необходимости.776777Можно создавать собственные ABC, используя `abc.ABCMeta` в качестве метакласса в определении класса:778779```python780from abc import ABCMeta, abstractmethod781782class Drawable():783 __metaclass__ = ABCMeta784785 @abstractmethod786 def draw(self, x, y, scale=1.0):787 pass788789 def draw_doubled(self, x, y):790 self.draw(x, y, scale=2.0)791792class Square(Drawable):793 def draw(self, x, y, scale):794 ...795```796797В приведённом выше ABC `Drawable` метод `draw_doubled()` отображает объект в двойном размере и может быть реализован через другие методы, описанные в `Drawable`. Поэтому классам, реализующим этот ABC, не нужно предоставлять собственную реализацию `draw_doubled()`, хотя они могут это сделать. Однако реализация `draw()` обязательна; ABC не может предоставить полезную общую реализацию.798799К методам, которые обязательно должны быть реализованы, можно применить декоратор `@abstractmethod`, например к `draw()`; тогда Python будет возбуждать исключение для классов, не определяющих этот метод. Обратите внимание, что исключение возбуждается только при попытке создать экземпляр подкласса, в котором отсутствует данный метод:800801```python802>>> class Circle(Drawable):803... pass804...805>>> c = Circle()806Traceback (most recent call last):807 File "<stdin>", line 1, in <module>808TypeError: Can't instantiate abstract class Circle with abstract methods draw809>>>810```811812Абстрактные атрибуты данных можно объявить с помощью декоратора `@abstractproperty`:813814```python815from abc import abstractproperty816...817818@abstractproperty819def readonly(self):820 return self._x821```822823Тогда подклассы должны определить свойство `readonly()`.824825> **См. также**826>827> **[**PEP 3119**](https://python-all.ru/3.4/whatsnew/2.6.html) – Введение абстрактных базовых классов**828>829> PEP написан Гвидо ван Россумом и Талином. Реализован Гвидо ван Россумом. Портирован в 2.6 Бенджамином Арангуреном при участии Алекса Мартелли.830831## PEP 3127: Поддержка и синтаксис целочисленных литералов832833Python 3.0 изменяет синтаксис восьмеричных (основание 8) целочисленных литералов, добавляя префикс «0o» или «0O» вместо ведущего нуля, а также добавляет поддержку двоичных (основание 2) целочисленных литералов с префиксом «0b» или «0B».834835Python 2.6 не отказывается от поддержки ведущего нуля для восьмеричных чисел, но добавляет поддержку «0o» и «0b»:836837```python838>>> 0o21, 2*8 + 1839(17, 17)840>>> 0b10111184147842```843844Встроенная функция [`oct()`](https://python-all.ru/3.4/library/functions.html#oct) по-прежнему возвращает числа с ведущим нулём, а новая встроенная функция [`bin()`](https://python-all.ru/3.4/library/functions.html#bin) возвращает двоичное представление числа:845846```python847>>> oct(42)848'052'849>>> future_builtins.oct(42)850'0o52'851>>> bin(173)852'0b10101101'853```854855Встроенные функции [`int()`](https://python-all.ru/3.4/library/functions.html#int) и `long()` теперь принимают префиксы «0o» и «0b», когда запрашивается основание 8 или 2, либо когда аргумент *base* равен нулю (что означает, что используемое основание должно определяться из строки):856857```python858>>> int ('0o52', 0)85942860>>> int('1101', 2)86113862>>> int('0b1101', 2)86313864>>> int('0b1101', 0)86513866```867868> **См. также**869>870> **[**PEP 3127**](https://python-all.ru/3.4/whatsnew/2.6.html) – Поддержка и синтаксис целочисленных литералов**871>872> PEP написан Патриком Мопином; портирован в 2.6 Эриком Смитом.873874## PEP 3129: Декораторы классов875876Декораторы были расширены с функций на классы. Теперь допустимо написать:877878```python879@foo880@bar881class A:882 pass883```884885Это эквивалентно:886887```python888class A:889 pass890891A = foo(bar(A))892```893894> **См. также**895>896> **[**PEP 3129**](https://python-all.ru/3.4/whatsnew/2.6.html) - Декораторы классов**897>898> PEP написан Коллином Уинтером.899900## PEP 3141: Иерархия типов для чисел901902Python 3.0 добавляет несколько абстрактных базовых классов для числовых типов, вдохновлённых числовой башней Scheme. Эти классы были перенесены в Python 2.6 как модуль [`numbers`](https://python-all.ru/3.4/library/numbers.html#module-numbers).903904Самый общий ABC – это `Number`. Он не определяет никаких операций и существует только для того, чтобы можно было проверить, является ли объект числом, с помощью `isinstance(obj, Number)`.905906`Complex` является подклассом `Number`. Комплексные числа поддерживают основные операции сложения, вычитания, умножения, деления и возведения в степень, а также позволяют получить действительную и мнимую части и сопряжённое число. Встроенный комплексный тип Python является реализацией `Complex`.907908`Real` является подклассом `Complex` и добавляет операции, которые работают только с вещественными числами: `floor()`, `trunc()`, округление, взятие остатка по модулю N, целочисленное деление и сравнения.909910Числа `Rational` происходят от `Real`, имеют свойства `numerator` и `denominator` и могут быть преобразованы в числа с плавающей запятой. Python 2.6 добавляет простой класс рациональных чисел `Fraction` в модуле [`fractions`](https://python-all.ru/3.4/library/fractions.html#module-fractions). (Он называется `Fraction`, а не `Rational`, чтобы избежать конфликта имён с [`numbers.Rational`](https://python-all.ru/3.4/library/numbers.html#numbers.Rational).)911912Целые числа `Integral` происходят от `Rational` и могут сдвигаться влево и вправо с помощью `<<` и `>>`, комбинироваться с помощью побитовых операций, таких как `&` и `|`, а также использоваться в качестве индексов массивов и границ срезов.913914В Python 3.0 PEP немного переопределяет существующие встроенные функции [`round()`](https://python-all.ru/3.4/library/functions.html#round), [`math.floor()`](https://python-all.ru/3.4/library/math.html#math.floor), [`math.ceil()`](https://python-all.ru/3.4/library/math.html#math.ceil) и добавляет новую, [`math.trunc()`](https://python-all.ru/3.4/library/math.html#math.trunc), которая была перенесена в Python 2.6. [`math.trunc()`](https://python-all.ru/3.4/library/math.html#math.trunc) округляет к нулю, возвращая ближайшее целое `Integral`, находящееся между аргументом функции и нулём.915916> **См. также**917>918> **[**PEP 3141**](https://python-all.ru/3.4/whatsnew/2.6.html) – Иерархия типов для чисел**919>920> PEP написан Джеффри Яскиным.921>922> [Числовая башня Scheme](https://python-all.ru/3.4/whatsnew/2.6.html) из руководства по Guile.923>924> [Типы чисел Scheme](https://python-all.ru/3.4/whatsnew/2.6.html) из спецификации R5RS Scheme.925926### Модуль [`fractions`](https://python-all.ru/3.4/library/fractions.html#module-fractions)927928Чтобы дополнить иерархию числовых типов, модуль [`fractions`](https://python-all.ru/3.4/library/fractions.html#module-fractions) предоставляет класс рациональных чисел. Рациональные числа хранят свои значения в виде числителя и знаменателя, образующих дробь, и могут точно представлять такие числа, как `2/3`, которые числа с плавающей запятой могут лишь аппроксимировать.929930Конструктор `Fraction` принимает два целых значения `Integral`, которые будут числителем и знаменателем результирующей дроби.931932```python933>>> from fractions import Fraction934>>> a = Fraction(2, 3)935>>> b = Fraction(2, 5)936>>> float(a), float(b)937(0.66666666666666663, 0.40000000000000002)938>>> a+b939Fraction(16, 15)940>>> a/b941Fraction(5, 3)942```943944Для преобразования чисел с плавающей запятой в рациональные числа тип float теперь имеет метод `as_integer_ratio()`, который возвращает числитель и знаменатель дроби, равной тому же значению с плавающей запятой:945946```python947>>> (2.5) .as_integer_ratio()948(5, 2)949>>> (3.1415) .as_integer_ratio()950(7074029114692207L, 2251799813685248L)951>>> (1./3) .as_integer_ratio()952(6004799503160661L, 18014398509481984L)953```954955Обратите внимание: значения, которые могут быть лишь аппроксимированы числами с плавающей запятой, например 1./3, не упрощаются до аппроксимируемого числа; дробь пытается соответствовать значению с плавающей запятой **в точности**.956957Модуль [`fractions`](https://python-all.ru/3.4/library/fractions.html#module-fractions) основан на реализации Шурда Мулендера (Sjoerd Mullender), которая долгое время находилась в каталоге `Demo/classes/` в Python. Эта реализация была значительно обновлена Джеффри Яскином (Jeffrey Yasskin).958959## Прочие изменения языка960961Некоторые небольшие изменения, внесённые в ядро языка Python:962963- Каталоги и zip-архивы, содержащие файл `__main__.py`, теперь можно запускать напрямую, передавая их имя интерпретатору. Каталог или zip-архив автоматически вставляется как первый элемент в sys.path. (Предложение и начальный патч от Энди Чу (Andy Chu), затем доработано Филлипом Дж. Иби (Phillip J. Eby) и Ником Когланом (Nick Coghlan); [issue 1739468](https://python-all.ru/3.4/whatsnew/2.6.html).)964- Функция [`hasattr()`](https://python-all.ru/3.4/library/functions.html#hasattr) перехватывала и игнорировала все ошибки, предполагая, что они означают, что метод [`__getattr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattr__) каким-то образом не сработал и возвращаемое значение [`hasattr()`](https://python-all.ru/3.4/library/functions.html#hasattr) поэтому будет `False`. Однако эту логику не следует применять к [`KeyboardInterrupt`](https://python-all.ru/3.4/library/exceptions.html#KeyboardInterrupt) и [`SystemExit`](https://python-all.ru/3.4/library/exceptions.html#SystemExit); Python 2.6 больше не будет отбрасывать такие исключения, когда [`hasattr()`](https://python-all.ru/3.4/library/functions.html#hasattr) сталкивается с ними. (Исправлено Бенджамином Петерсоном (Benjamin Peterson); [issue 2196](https://python-all.ru/3.4/whatsnew/2.6.html).)965- При вызове функции с использованием синтаксиса `**` для передачи именованных аргументов больше не требуется использовать словарь Python; теперь подойдёт любое отображение:966967 ```python968 >>> def f(**kw):969 ... print sorted(kw)970 ...971 >>> ud=UserDict.UserDict()972 >>> ud['a'] = 1973 >>> ud['b'] = 'string'974 >>> f(**ud)975 ['a', 'b']976 ```977978 (Автор: Александр Белопольский (Alexander Belopolsky); [issue 1686487](https://python-all.ru/3.4/whatsnew/2.6.html).)979980 Также стало разрешено указывать именованные аргументы после аргумента `*args` в вызове функции.981982 ```python983 >>> def f(*args, **kw):984 ... print args, kw985 ...986 >>> f(1,2,3, *(4,5,6), keyword=13)987 (1, 2, 3, 4, 5, 6) {'keyword': 13}988 ```989990 Раньше это приводило бы к синтаксической ошибке. (Автор: Амори Форжо д’Арк (Amaury Forgeot d’Arc); [issue 3473](https://python-all.ru/3.4/whatsnew/2.6.html).)991- Новая встроенная функция `next(iterator, [default])` возвращает следующий элемент из указанного итератора. Если передан аргумент *default*, он будет возвращён, когда *iterator* исчерпан; в противном случае будет возбуждено исключение [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration). (Перенесено в [issue 2719](https://python-all.ru/3.4/whatsnew/2.6.html).)992- Теперь кортежи имеют методы `index()` и `count()`, соответствующие методам `index()` и `count()` списков:993994 ```python995 >>> t = (0,1,2,3,4,0,1,2)996 >>> t.index(3)997 3998 >>> t.count(0)999 21000 ```10011002 (Автор: Рэймонд Хеттингер)1003- Встроенные типы теперь имеют улучшенную поддержку расширенного синтаксиса срезов, принимая различные комбинации `(start, stop, step)`. Раньше поддержка была частичной, и некоторые граничные случаи не работали. (Реализовано Томасом Воутерсом (Thomas Wouters).)1004- Свойства теперь имеют три атрибута: `getter`, `setter` и `deleter`, которые являются декораторами, предоставляющими удобные сокращения для добавления функции чтения, записи или удаления к существующему свойству. Использовать их можно так:10051006 ```python1007 class C(object):1008 @property1009 def x(self):1010 return self._x10111012 @x.setter1013 def x(self, value):1014 self._x = value10151016 @x.deleter1017 def x(self):1018 del self._x10191020 class D(C):1021 @C.x.getter1022 def x(self):1023 return self._x * 210241025 @x.setter1026 def x(self, value):1027 self._x = value / 21028 ```1029- Несколько методов встроенных типов множеств теперь принимают несколько итерируемых объектов: `intersection()`, `intersection_update()`, `union()`, `update()`, `difference()` и `difference_update()`.10301031 ```python1032 >>> s=set('1234567890')1033 >>> s.intersection('abc123', 'cdf246') # Пересечение всех входных данных1034 set(['2'])1035 >>> s.difference('246', '789')1036 set(['1', '0', '3', '5'])1037 ```10381039 (Автор: Raymond Hettinger.)1040- Добавлено много возможностей для чисел с плавающей запятой. Функция [`float()`](https://python-all.ru/3.4/library/functions.html#float) теперь преобразует строку `nan` в значение IEEE 754 Not A Number, а `+inf` и `-inf` – в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.4/whatsnew/2.6.html).)10411042 Другие функции модуля [`math`](https://python-all.ru/3.4/library/math.html#module-math), `isinf()` и `isnan()`, возвращают true, если их аргумент с плавающей запятой является бесконечным или Not A Number. ([issue 1640](https://python-all.ru/3.4/whatsnew/2.6.html))10431044 Были добавлены функции преобразования чисел с плавающей запятой в шестнадцатеричные строки ([issue 3008](https://python-all.ru/3.4/whatsnew/2.6.html)). Эти функции преобразуют числа с плавающей запятой в строковое представление и обратно, не внося ошибок округления при преобразовании между десятичной и двоичной системами. Числа с плавающей запятой имеют метод [`hex()`](https://python-all.ru/3.4/library/functions.html#hex), возвращающий строковое представление, а метод `float.fromhex()` преобразует строку обратно в число:10451046 ```python1047 >>> a = 3.751048 >>> a.hex()1049 '0x1.e000000000000p+1'1050 >>> float.fromhex('0x1.e000000000000p+1')1051 3.751052 >>> b=1./31053 >>> b.hex()1054 '0x1.5555555555555p-2'1055 ```1056- Числовая тонкость: при создании комплексного числа из двух чисел с плавающей запятой в системах, поддерживающих знаковые нули (-0 и +0), конструктор [`complex()`](https://python-all.ru/3.4/library/functions.html#complex) теперь сохраняет знак нуля. (Исправлено Марком Т. Дикинсоном; [issue 1507](https://python-all.ru/3.4/whatsnew/2.6.html).)1057- Классы, которые наследуют метод [`__hash__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__hash__) от родительского класса, могут установить `__hash__ = None`, чтобы указать, что класс не является хешируемым. Это заставит `hash(obj)` вызывать исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), и класс не будет считаться реализующим ABC `Hashable`.10581059 Это следует делать, когда вы определили метод `__cmp__()` или [`__eq__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__eq__), который сравнивает объекты по их значению, а не по идентичности. Все объекты имеют метод хеширования по умолчанию, использующий `id(obj)` в качестве хеш-значения. Нет аккуратного способа удалить метод [`__hash__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__hash__), унаследованный от родительского класса, поэтому присваивание `None` было реализовано как переопределение. На уровне C расширения могут установить `tp_hash` в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.4/c-api/object.html#c.PyObject_HashNotImplemented). (Исправлено Ником Коглан и Амори Форжо д'Арк; [issue 2235](https://python-all.ru/3.4/whatsnew/2.6.html).)1060- Исключение [`GeneratorExit`](https://python-all.ru/3.4/library/exceptions.html#GeneratorExit) теперь наследуется от [`BaseException`](https://python-all.ru/3.4/library/exceptions.html#BaseException) вместо [`Exception`](https://python-all.ru/3.4/library/exceptions.html#Exception). Это означает, что обработчик исключений вида `except Exception:` не будет случайно перехватывать [`GeneratorExit`](https://python-all.ru/3.4/library/exceptions.html#GeneratorExit). (Предложено Чедом Остином; [issue 1537](https://python-all.ru/3.4/whatsnew/2.6.html).)1061- Объекты-генераторы теперь имеют атрибут `gi_code`, который ссылается на исходный объект кода, лежащий в основе генератора. (Предложено Коллином Уинтером; [issue 1473257](https://python-all.ru/3.4/whatsnew/2.6.html).)1062- Встроенная функция [`compile()`](https://python-all.ru/3.4/library/functions.html#compile) теперь принимает именованные аргументы, а также позиционные параметры. (Предложено Томасом Воутерсом; [issue 1444529](https://python-all.ru/3.4/whatsnew/2.6.html).)1063- Конструктор [`complex()`](https://python-all.ru/3.4/library/functions.html#complex) теперь принимает строки, содержащие комплексные числа в скобках, то есть `complex(repr(cplx))` теперь будет возвращать исходное значение. Например, `complex('(3+4j)')` теперь возвращает значение (3+4j). ([issue 1491866](https://python-all.ru/3.4/whatsnew/2.6.html))1064- Метод строки `translate()` теперь принимает `None` в качестве параметра таблицы перевода, который рассматривается как тождественное преобразование. Это упрощает выполнение операций, которые только удаляют символы. (Предложено Бенгтом Рихтером и реализовано Рэймондом Хеттингером; [issue 1193128](https://python-all.ru/3.4/whatsnew/2.6.html).)1065- Встроенная функция [`dir()`](https://python-all.ru/3.4/library/functions.html#dir) теперь проверяет наличие метода [`__dir__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__dir__) у получаемых объектов. Этот метод должен возвращать список строк, содержащих имена допустимых атрибутов объекта, и позволяет объекту контролировать значение, которое возвращает [`dir()`](https://python-all.ru/3.4/library/functions.html#dir). Объекты, имеющие методы [`__getattr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattribute__), могут использовать это для рекламирования псевдоатрибутов, которые они будут поддерживать. ([issue 1591665](https://python-all.ru/3.4/whatsnew/2.6.html))1066- Объекты методов экземпляра имеют новые атрибуты для объекта и функции, составляющих метод; новый синоним для `im_self` – это `__self__`, а `im_func` также доступен как `__func__`. Старые имена по-прежнему поддерживаются в Python 2.6, но исчезли в 3.0.1067- Малоизвестное изменение: при использовании функции [`locals()`](https://python-all.ru/3.4/library/functions.html#locals) внутри инструкции [`class`](https://python-all.ru/3.4/reference/compound_stmts.html#class) результирующий словарь больше не возвращает свободные переменные. (Свободные переменные в данном случае – это переменные, на которые есть ссылки в инструкции [`class`](https://python-all.ru/3.4/reference/compound_stmts.html#class), но которые не являются атрибутами класса.)10681069### Оптимизации10701071- Модуль [`warnings`](https://python-all.ru/3.4/library/warnings.html#module-warnings) был переписан на C. Это позволяет вызывать предупреждения из парсера и может также ускорить запуск интерпретатора. (Предложено Нилом Норвитцем и Бреттом Кэнноном; [issue 1631171](https://python-all.ru/3.4/whatsnew/2.6.html).)1072- Объекты типов теперь имеют кэш методов, который может сократить работу, необходимую для поиска правильной реализации метода для конкретного класса; после кэширования интерпретатору не нужно обходить базовые классы, чтобы определить, какой метод вызвать. Кэш очищается, если базовый класс или сам класс изменяется, поэтому кэш должен оставаться корректным даже в условиях динамической природы Python. (Оригинальная оптимизация реализована Армином Риго, обновлена для Python 2.6 Кевином Джейкобсом; [issue 1700288](https://python-all.ru/3.4/whatsnew/2.6.html).)10731074 По умолчанию это изменение применяется только к типам, входящим в ядро Python. Модули расширения могут быть несовместимы с этим кэшем, поэтому они должны явно добавить `Py_TPFLAGS_HAVE_VERSION_TAG` в поле `tp_flags` модуля, чтобы включить кэш методов. (Чтобы быть совместимым с кэшем методов, код модуля расширения не должен напрямую обращаться и изменять член `tp_dict` любого из реализуемых типов. Большинство модулей этого не делают, но интерпретатор Python не может это определить. См. [issue 1878](https://python-all.ru/3.4/whatsnew/2.6.html) для обсуждения.)1075- Вызовы функций с именованными аргументами стали значительно быстрее за счет быстрого сравнения указателей, что обычно экономит время полного сравнения строк. (Предложено Рэймондом Хеттингером после первоначальной реализации Антуана Питу; [issue 1819](https://python-all.ru/3.4/whatsnew/2.6.html).)1076- Все функции модуля [`struct`](https://python-all.ru/3.4/library/struct.html#module-struct) были переписаны на C благодаря работе на спринте Need For Speed. (Предложено Рэймондом Хеттингером.)1077- Некоторые стандартные встроенные типы теперь устанавливают бит в своих объектах типа. Это ускоряет проверку, является ли объект подклассом одного из этих типов. (Автор: Neal Norwitz.)1078- Строки Unicode теперь используют более быстрый код для обнаружения пробельных символов и разрывов строк; это ускоряет метод `split()` примерно на 25% и `splitlines()` на 35%. (Предложено Антуаном Питу.) Использование памяти сокращено за счет применения pymalloc для данных строк Unicode.1079- Инструкция `with` теперь сохраняет метод [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) в стеке, что дает небольшое ускорение. (Реализовано Джеффри Яскиным.)1080- Для уменьшения использования памяти сборщик мусора теперь очищает внутренние списки свободных блоков при сборке мусора самого старшего поколения объектов. Это может вернуть память операционной системе быстрее.10811082### Изменения в интерпретаторе10831084Две опции командной строки зарезервированы для использования другими реализациями Python. Ключ [*-J*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-J) зарезервирован для использования Jython для специфических опций Jython, таких как ключи, передаваемые нижележащей JVM. [*-X*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-X) зарезервирован для опций, специфичных для конкретной реализации Python, такой как CPython, Jython или IronPython. Если любая из этих опций используется с Python 2.6, интерпретатор сообщит, что опция в настоящее время не используется.10851086Python теперь можно запретить запись файлов `.pyc` или `.pyo`, указав ключ [*-B*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-B) интерпретатору Python или установив переменную окружения [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Эта настройка доступна программам Python через переменную `sys.dont_write_bytecode`, и код Python может изменить значение, чтобы изменить поведение интерпретатора. (Предложено Нилом Норвитцем и Георгом Брандлем.)10871088Кодировку, используемую для стандартного ввода, вывода и стандартной ошибки, можно указать, установив переменную окружения [`PYTHONIOENCODING`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONIOENCODING) перед запуском интерпретатора. Значение должно быть строкой вида `<encoding>` или `<encoding>:<errorhandler>`. Часть *encoding* задает имя кодировки, например `utf-8` или `latin-1`; необязательная часть *errorhandler* определяет, что делать с символами, которые не могут быть обработаны кодировкой, и должна быть одним из значений: “error”, “ignore” или “replace”. (Предложено Мартином фон Лёвисом.)10891090## Новые и улучшенные модули10911092Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее значительных изменений, отсортированный по модулям в алфавитном порядке. Обратитесь к файлу `Misc/NEWS` в дереве исходных кодов для более полного списка изменений или просмотрите журналы Subversion для всех подробностей.10931094- Модули [`asyncore`](https://python-all.ru/3.4/library/asyncore.html#module-asyncore) и [`asynchat`](https://python-all.ru/3.4/library/asynchat.html#module-asynchat) снова активно поддерживаются, и было применено несколько патчей и исправлений ошибок. (Поддерживается Джозией Карлсоном; см. [issue 1736190](https://python-all.ru/3.4/whatsnew/2.6.html) для одного патча.)1095- Модуль `bsddb` также получил нового сопровождающего, Хесуса Сеа Авиона, и теперь пакет доступен как автономный. Веб-страница пакета: [www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/3.4/whatsnew/2.6.html). Планируется удалить пакет из стандартной библиотеки в Python 3.0, поскольку частота его выпусков намного выше, чем у Python.10961097 Модуль `bsddb.dbshelve` теперь использует самый высокий доступный протокол сериализации вместо того, чтобы ограничиваться протоколом 1. (Предложено У. Барнсом.)1098- Модуль [`cgi`](https://python-all.ru/3.4/library/cgi.html#module-cgi) теперь будет читать переменные из строки запроса HTTP POST запроса. Это позволяет использовать действия формы с URL, содержащими строки запроса, например “/cgi-bin/add.py?category=1”. (Предложено Александром Фиори и Нубисом; [issue 1817](https://python-all.ru/3.4/whatsnew/2.6.html).)10991100 Функции `parse_qs()` и `parse_qsl()` были перенесены из модуля [`cgi`](https://python-all.ru/3.4/library/cgi.html#module-cgi) в модуль `urlparse`. Версии, все еще доступные в модуле [`cgi`](https://python-all.ru/3.4/library/cgi.html#module-cgi), будут вызывать сообщения [`PendingDeprecationWarning`](https://python-all.ru/3.4/library/exceptions.html#PendingDeprecationWarning) в 2.6 ([issue 600362](https://python-all.ru/3.4/whatsnew/2.6.html)).1101- Модуль [`cmath`](https://python-all.ru/3.4/library/cmath.html#module-cmath) подвергся значительной доработке, предложенной Марком Дикинсоном и Кристианом Хаймсом. Было добавлено пять новых функций:11021103 - `polar()` преобразует комплексное число в полярную форму, возвращая модуль и аргумент комплексного числа.1104 - `rect()` делает обратное, преобразуя пару модуль, аргумент обратно в соответствующее комплексное число.1105 - `phase()` возвращает аргумент (также называемый углом) комплексного числа.1106 - `isnan()` возвращает True, если либо вещественная, либо мнимая часть его аргумента является NaN.1107 - `isinf()` возвращает True, если либо вещественная, либо мнимая часть его аргумента бесконечна.11081109 Ревизии также улучшили числовую надёжность модуля [`cmath`](https://python-all.ru/3.4/library/cmath.html#module-cmath). Для всех функций вещественная и мнимая части результатов точны до нескольких единиц последнего разряда (ulps), когда это возможно. Подробности см. в [issue 1381](https://python-all.ru/3.4/whatsnew/2.6.html). Также исправлены разрезы ветвей для `asinh()`, `atanh()` и `atan()`.11101111 Тесты для модуля были существенно расширены; почти 2000 новых тестов проверяют алгебраические функции.11121113 На платформах IEEE 754 модуль [`cmath`](https://python-all.ru/3.4/library/cmath.html#module-cmath) теперь обрабатывает специальные значения IEEE 754 и исключения с плавающей запятой в соответствии с Приложением ‘G’ стандарта C99.1114- Новый тип данных в модуле [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections): `namedtuple(typename, fieldnames)` – это фабричная функция, которая создаёт подклассы стандартного кортежа, поля которых доступны как по имени, так и по индексу. Например:11151116 ```python1117 >>> var_type = collections.namedtuple('variable',1118 ... 'id name type size')1119 >>> # Имена разделяются пробелами или запятыми1120 >>> # 'id, name, type, size' также будет работать1121 >>> var_type._fields1122 ('id', 'name', 'type', 'size')11231124 >>> var = var_type(1, 'frequency', 'int', 4)1125 >>> print var[0], var.id # Эквивалентно1126 1 11127 >>> print var[2], var.type # Эквивалентно1128 int int1129 >>> var._asdict()1130 {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}1131 >>> v2 = var._replace(name='amplitude')1132 >>> v21133 variable(id=1, name='amplitude', type='int', size=4)1134 ```11351136 Некоторые места в стандартной библиотеке, которые возвращали кортежи, были изменены так, чтобы возвращать экземпляры `namedtuple`. Например, метод `Decimal.as_tuple()` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11371138 (Автор: Raymond Hettinger.)1139- Ещё одно изменение в модуле [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections): тип `deque` теперь поддерживает необязательный параметр *maxlen*; если он указан, размер дека будет ограничен не более чем *maxlen* элементами. Добавление новых элементов в полный дек приводит к отбрасыванию старых.11401141 ```python1142 >>> from collections import deque1143 >>> dq=deque(maxlen=3)1144 >>> dq1145 deque([], maxlen=3)1146 >>> dq.append(1); dq.append(2); dq.append(3)1147 >>> dq1148 deque([1, 2, 3], maxlen=3)1149 >>> dq.append(4)1150 >>> dq1151 deque([2, 3, 4], maxlen=3)1152 ```11531154 (Автор: Raymond Hettinger.)1155- Объекты `Morsel` модуля `Cookie` теперь поддерживают атрибут `httponly`. В некоторых браузерах куки с этим атрибутом недоступны для чтения или изменения через JavaScript. (Автор: Arvin Schnell; [issue 1638033](https://python-all.ru/3.4/whatsnew/2.6.html).)1156- Новый метод окна в модуле [`curses`](https://python-all.ru/3.4/library/curses.html#module-curses), `chgat()`, изменяет атрибуты отображения для заданного числа символов на одной строке. (Автор: Fabian Kreutz.)11571158 ```python1159 # Текст жирным шрифтом, начинающийся с y=0, x=211160 # и влияющий на остальную часть строки1161 stdscr.chgat(0, 21, curses.A_BOLD)1162 ```11631164 Класс `Textbox` в модуле [`curses.textpad`](https://python-all.ru/3.4/library/curses.html#module-curses.textpad) теперь поддерживает редактирование как в режиме вставки, так и в режиме замены. Режим вставки включается передачей истинного значения для параметра *insert\_mode* при создании экземпляра `Textbox`.1165- Методы `strftime()` модуля [`datetime`](https://python-all.ru/3.4/library/datetime.html#module-datetime) теперь поддерживают код формата `%f`, который разворачивается в количество микросекунд в объекте, дополненное слева нулями до шести знаков. (Автор: Skip Montanaro; [issue 1158](https://python-all.ru/3.4/whatsnew/2.6.html).)1166- Модуль [`decimal`](https://python-all.ru/3.4/library/decimal.html#module-decimal) был обновлён до версии 1.66 [Общей спецификации десятичных чисел](https://python-all.ru/3.4/whatsnew/2.6.html). Новые возможности включают некоторые методы для основных математических функций, таких как `exp()` и `log10()`:11671168 ```python1169 >>> Decimal(1).exp()1170 Decimal("2.718281828459045235360287471")1171 >>> Decimal("2.7182818").ln()1172 Decimal("0.9999999895305022877376682436")1173 >>> Decimal(1000).log10()1174 Decimal("3")1175 ```11761177 Метод `as_tuple()` объектов `Decimal` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11781179 (Реализовано Facundo Batista и Mark Dickinson. Поддержка именованных кортежей добавлена Raymond Hettinger.)1180- Класс `SequenceMatcher` модуля [`difflib`](https://python-all.ru/3.4/library/difflib.html#module-difflib) теперь возвращает именованные кортежи, представляющие совпадения, с атрибутами `a`, `b` и `size`. (Автор: Raymond Hettinger.)1181- В конструктор класса [`ftplib.FTP`](https://python-all.ru/3.4/library/ftplib.html#ftplib.FTP), а также в метод `connect()`, был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.) Кроме того, методы `storbinary()` и `storlines()` класса `FTP` теперь принимают необязательный параметр *колбэк*, который будет вызываться с каждым блоком данных после его отправки. (Автор: Phil Schwartz; [issue 1221598](https://python-all.ru/3.4/whatsnew/2.6.html).)1182- Встроенная функция `reduce()` также доступна в модуле [`functools`](https://python-all.ru/3.4/library/functools.html#module-functools). В Python 3.0 эта встроенная функция была удалена, и `reduce()` доступна только из [`functools`](https://python-all.ru/3.4/library/functools.html#module-functools); в настоящее время планов удалять её из серии 2.x нет. (Исправление: Christian Heimes; [issue 1739906](https://python-all.ru/3.4/whatsnew/2.6.html).)1183- Когда это возможно, модуль [`getpass`](https://python-all.ru/3.4/library/getpass.html#module-getpass) теперь использует `/dev/tty` для вывода приглашения и чтения пароля, при необходимости переключаясь на стандартный поток ошибок и стандартный ввод. Если пароль может отображаться на терминале, перед показом приглашения выводится предупреждение. (Автор: Gregory P. Smith.)1184- Функция [`glob.glob()`](https://python-all.ru/3.4/library/glob.html#glob.glob) теперь может возвращать имена файлов в Unicode, если использовался путь в Unicode и в каталоге есть соответствующие имена в Unicode. ([issue 1001604](https://python-all.ru/3.4/whatsnew/2.6.html))1185- Новая функция в модуле [`heapq`](https://python-all.ru/3.4/library/heapq.html#module-heapq), `merge(iter1, iter2, ...)`, принимает любое количество итерируемых объектов, возвращающих данные в отсортированном порядке, и возвращает новый генератор, который выдает содержимое всех итераторов, также в отсортированном порядке. Например:11861187 ```python1188 >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))1189 [1, 2, 3, 5, 8, 9, 16]1190 ```11911192 Ещё одна новая функция, `heappushpop(heap, item)`, добавляет *item* в *heap*, затем извлекает и возвращает наименьший элемент. Это эффективнее, чем последовательный вызов `heappush()` и `heappop()`.11931194 [`heapq`](https://python-all.ru/3.4/library/heapq.html#module-heapq) теперь реализован так, что использует только операцию «меньше», а не «меньше или равно», как было раньше. Это делает использование типов в [`heapq`](https://python-all.ru/3.4/library/heapq.html#module-heapq) совместимым с методом [`list.sort()`](https://python-all.ru/3.4/library/stdtypes.html#list.sort). (Автор: Raymond Hettinger.)1195- В конструкторы классов `httplib.HTTPConnection` и `HTTPSConnection` был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.)1196- Большинство функций модуля [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect), таких как `getmoduleinfo()` и `getargs()`, теперь возвращают именованные кортежи. Помимо поведения как у кортежей, элементы возвращаемого значения также можно получить как атрибуты. (Автор: Raymond Hettinger.)11971198 Некоторые новые функции в модуле включают `isgenerator()`, `isgeneratorfunction()`, и `isabstract()`.1199- Модуль [`itertools`](https://python-all.ru/3.4/library/itertools.html#module-itertools) приобрёл несколько новых функций.12001201 `izip_longest(iter1, iter2, ...[, fillvalue])` создаёт кортежи из каждого из элементов; если некоторые итерируемые объекты короче других, недостающие значения устанавливаются в *fillvalue*. Например:12021203 ```python1204 >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))1205 ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))1206 ```12071208 `product(iter1, iter2, ..., [repeat=N])` возвращает декартово произведение переданных итерируемых объектов – набор кортежей, содержащих все возможные комбинации элементов, возвращаемых каждым итерируемым объектом.12091210 ```python1211 >>> list(itertools.product([1,2,3], [4,5,6]))1212 [(1, 4), (1, 5), (1, 6),1213 (2, 4), (2, 5), (2, 6),1214 (3, 4), (3, 5), (3, 6)]1215 ```12161217 Необязательный именованный аргумент *repeat* используется для вычисления произведения итерируемого объекта или набора итерируемых объектов самих на себя, повторённого *N* раз. С одним итерируемым аргументом возвращаются кортежи из *N* элементов:12181219 ```python1220 >>> list(itertools.product([1,2], repeat=3))1221 [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),1222 (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]1223 ```12241225 С двумя итерируемыми объектами возвращаются кортежи из *2N* элементов.12261227 ```python1228 >>> list(itertools.product([1,2], [3,4], repeat=2))1229 [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),1230 (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),1231 (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),1232 (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]1233 ```12341235 `combinations(iterable, r)` возвращает подпоследовательности длины *r* из элементов *iterable*.12361237 ```python1238 >>> list(itertools.combinations('123', 2))1239 [('1', '2'), ('1', '3'), ('2', '3')]1240 >>> list(itertools.combinations('123', 3))1241 [('1', '2', '3')]1242 >>> list(itertools.combinations('1234', 3))1243 [('1', '2', '3'), ('1', '2', '4'),1244 ('1', '3', '4'), ('2', '3', '4')]1245 ```12461247 `permutations(iter[, r])` возвращает все перестановки длины *r* из элементов итерируемого объекта. Если *r* не указан, по умолчанию берётся количество элементов, производимых итерируемым объектом.12481249 ```python1250 >>> list(itertools.permutations([1,2,3,4], 2))1251 [(1, 2), (1, 3), (1, 4),1252 (2, 1), (2, 3), (2, 4),1253 (3, 1), (3, 2), (3, 4),1254 (4, 1), (4, 2), (4, 3)]1255 ```12561257 `itertools.chain(*iterables)` – существующая функция в [`itertools`](https://python-all.ru/3.4/library/itertools.html#module-itertools), которая получила новый конструктор в Python 2.6. `itertools.chain.from_iterable(iterable)` принимает один итерируемый объект, который должен возвращать другие итерируемые объекты. `chain()` затем вернёт все элементы первого итерируемого объекта, затем все элементы второго и так далее.12581259 ```python1260 >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))1261 [1, 2, 3, 4, 5, 6]1262 ```12631264 (Всё добавлено Рэймондом Хеттингером.)1265- Класс `FileHandler` модуля [`logging`](https://python-all.ru/3.4/library/logging.html#module-logging) и его подклассы `WatchedFileHandler`, `RotatingFileHandler` и `TimedRotatingFileHandler` теперь имеют необязательный параметр *delay* в своих конструкторах. Если *delay* равен true, открытие файла журнала откладывается до первого вызова `emit()`. (Автор: Vinay Sajip.)12661267 `TimedRotatingFileHandler` также имеет параметр конструктора *utc*. Если аргумент равен true, при определении момента полуночи и генерации имён файлов будет использоваться время UTC; в противном случае – местное время.1268- В модуль [`math`](https://python-all.ru/3.4/library/math.html#module-math) было добавлено несколько новых функций:12691270 - [`isinf()`](https://python-all.ru/3.4/library/math.html#math.isinf) и [`isnan()`](https://python-all.ru/3.4/library/math.html#math.isnan) определяют, является ли заданное число с плавающей точкой положительной или отрицательной бесконечностью или NaN (Not a Number – не числом) соответственно.1271 - [`copysign()`](https://python-all.ru/3.4/library/math.html#math.copysign) копирует знаковый бит числа IEEE 754, возвращая абсолютное значение *x*, объединённое со знаковым битом *y*. Например, `math.copysign(1, -0.0)` возвращает -1.0. (Автор: Christian Heimes.)1272 - [`factorial()`](https://python-all.ru/3.4/library/math.html#math.factorial) вычисляет факториал числа. (Автор: Raymond Hettinger; [issue 2138](https://python-all.ru/3.4/whatsnew/2.6.html).)1273 - [`fsum()`](https://python-all.ru/3.4/library/math.html#math.fsum) суммирует поток чисел из итерируемого объекта, стараясь избежать потери точности за счёт использования частичных сумм. (Авторы: Jean Brouwers, Raymond Hettinger и Mark Dickinson; [issue 2819](https://python-all.ru/3.4/whatsnew/2.6.html).)1274 - [`acosh()`](https://python-all.ru/3.4/library/math.html#math.acosh), [`asinh()`](https://python-all.ru/3.4/library/math.html#math.asinh) и [`atanh()`](https://python-all.ru/3.4/library/math.html#math.atanh) вычисляют обратные гиперболические функции.1275 - [`log1p()`](https://python-all.ru/3.4/library/math.html#math.log1p) возвращает натуральный логарифм от *1+x* (по основанию *e*).1276 - `trunc()` округляет число в сторону нуля, возвращая ближайшее `Integral`, находящееся между аргументом функции и нулём. Добавлено в рамках обратного портирования [иерархии типов чисел из PEP 3141](https://python-all.ru/3.4/whatsnew/2.6.html#pep-3141).1277- Модуль [`math`](https://python-all.ru/3.4/library/math.html#module-math) был улучшен для более согласованного поведения на разных платформах, особенно в части обработки исключений с плавающей точкой и специальных значений IEEE 754.12781279 По возможности модуль следует рекомендациям стандарта C99 относительно специальных значений IEEE 754. Например, `sqrt(-1.)` теперь почти на всех платформах должно вызывать [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), в то время как `sqrt(float('NaN'))` должно возвращать NaN на всех платформах IEEE 754. Там, где приложение F стандарта C99 рекомендует сигнализировать «деление на ноль» или «недопустимая операция», Python будет вызывать [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError). Там, где приложение F рекомендует сигнализировать «переполнение», Python будет вызывать [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError). (См. [issue 711019](https://python-all.ru/3.4/whatsnew/2.6.html) и [issue 1640](https://python-all.ru/3.4/whatsnew/2.6.html).)12801281 (Добавлено Кристианом Хаймсом и Марком Дикинсоном.)1282- Объекты [`mmap`](https://python-all.ru/3.4/library/mmap.html#module-mmap) теперь имеют метод `rfind()`, который ищет подстроку, начиная с конца строки и двигаясь в обратном направлении. Метод `find()` также получил параметр *end*, задающий индекс, на котором следует остановить поиск. (Автор: John Lenton.)1283- Модуль [`operator`](https://python-all.ru/3.4/library/operator.html#module-operator) получил функцию `methodcaller()`, которая принимает имя и необязательный набор аргументов и возвращает вызываемый объект, который будет вызывать именованную функцию с переданными ему аргументами. Например:12841285 ```python1286 >>> # Эквивалентно lambda s: s.replace('old', 'new')1287 >>> replacer = operator.methodcaller('replace', 'old', 'new')1288 >>> replacer('old wine in old bottles')1289 'new wine in new bottles'1290 ```12911292 (Добавлено Георгом Брандлом по предложению Грегори Петросяна.)12931294 Функция `attrgetter()` теперь принимает имена с точками и выполняет соответствующий поиск атрибутов:12951296 ```python1297 >>> inst_name = operator.attrgetter(1298 ... '__class__.__name__')1299 >>> inst_name('')1300 'str'1301 >>> inst_name(help)1302 '_Helper'1303 ```13041305 (Добавлено Георгом Брандлом по предложению Барри Уорсо.)1306- Модуль [`os`](https://python-all.ru/3.4/library/os.html#module-os) теперь включает в себя несколько новых системных вызовов. `fchmod(fd, mode)` и `fchown(fd, uid, gid)` изменяют режим и владельца открытого файла, а `lchmod(path, mode)` изменяет режим символической ссылки. (Авторы: Georg Brandl и Christian Heimes.)13071308 `chflags()` и `lchflags()` являются обёртками для соответствующих системных вызовов (где они доступны) и изменяют флаги файла. Константы значений флагов определены в модуле [`stat`](https://python-all.ru/3.4/library/stat.html#module-stat); некоторые возможные значения включают `UF_IMMUTABLE`, указывающий, что файл нельзя изменять, и `UF_APPEND`, указывающий, что данные можно только добавлять в файл. (Автор: M. Levinson.)13091310 `os.closerange(low, high)` эффективно закрывает все файловые дескрипторы от *low* до *high*, игнорируя любые ошибки и не включая сам *high*. Эта функция теперь используется модулем [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess) для ускорения запуска процессов. (Автор: Georg Brandl; [issue 1663329](https://python-all.ru/3.4/whatsnew/2.6.html).)1311- Метод `clear()` объекта `os.environ` теперь будет не только очищать ключи объекта, но и сбрасывать переменные окружения с помощью [`os.unsetenv()`](https://python-all.ru/3.4/library/os.html#os.unsetenv). (Автор: Martin Horcicka; [issue 1181](https://python-all.ru/3.4/whatsnew/2.6.html).)1312- Функция [`os.walk()`](https://python-all.ru/3.4/library/os.html#os.walk) теперь имеет параметр `followlinks`. Если он установлен в True, функция будет следовать символическим ссылкам на каталоги и обходить их содержимое. Для обратной совместимости значение по умолчанию этого параметра – false. Учтите, что функция может войти в бесконечную рекурсию, если есть символическая ссылка, указывающая на родительский каталог. ([issue 1273829](https://python-all.ru/3.4/whatsnew/2.6.html))1313- В модуле [`os.path`](https://python-all.ru/3.4/library/os.path.html#module-os.path) функция `splitext()` была изменена: теперь она не разделяет строку по начальным точкам. Это даёт лучшие результаты при работе с «точечными» файлами Unix. Например, `os.path.splitext('.ipython')` теперь возвращает `('.ipython', '')` вместо `('', '.ipython')`. ([issue 1115886](https://python-all.ru/3.4/whatsnew/2.6.html))13141315 Новая функция `os.path.relpath(path, start='.')` возвращает относительный путь от пути `start` (если он указан) или от текущего рабочего каталога к целевому пути `path`. (Автор: Richard Barran; [issue 1339796](https://python-all.ru/3.4/whatsnew/2.6.html).)13161317 В Windows [`os.path.expandvars()`](https://python-all.ru/3.4/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения, заданные в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Автор: Josiah Carlson; [issue 957650](https://python-all.ru/3.4/whatsnew/2.6.html).)1318- Отладчик Python, предоставляемый модулем [`pdb`](https://python-all.ru/3.4/library/pdb.html#module-pdb), получил новую команду: «run» перезапускает отлаживаемую программу Python и может опционально принимать новые аргументы командной строки для программы. (Автор: Rocky Bernstein; [issue 1393667](https://python-all.ru/3.4/whatsnew/2.6.html).)1319- Функция [`pdb.post_mortem()`](https://python-all.ru/3.4/library/pdb.html#pdb.post_mortem), используемая для начала отладки по трассировке, теперь будет использовать трассировку, возвращаемую [`sys.exc_info()`](https://python-all.ru/3.4/library/sys.html#sys.exc_info), если трассировка не указана. (Автор: Facundo Batista; [issue 1106316](https://python-all.ru/3.4/whatsnew/2.6.html).)1320- Модуль [`pickletools`](https://python-all.ru/3.4/library/pickletools.html#module-pickletools) теперь имеет функцию `optimize()`, которая принимает строку, содержащую pickle, и удаляет некоторые неиспользуемые коды операций, возвращая более короткий pickle, содержащий ту же структуру данных. (Автор: Raymond Hettinger.)1321- В модуль [`pkgutil`](https://python-all.ru/3.4/library/pkgutil.html#module-pkgutil) была добавлена функция `get_data()`, которая возвращает содержимое ресурсных файлов, входящих в установленный пакет Python. Например:13221323 ```python1324 >>> import pkgutil1325 >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')1326 BaseException1327 +-- SystemExit1328 +-- KeyboardInterrupt1329 +-- GeneratorExit1330 +-- Exception1331 +-- StopIteration1332 +-- StandardError1333 ...1334 ```13351336 (Автор: Paul Moore; [issue 2439](https://python-all.ru/3.4/whatsnew/2.6.html).)1337- Объекты `Parser` модуля `pyexpat` теперь позволяют устанавливать свой атрибут `buffer_size` для изменения размера буфера, используемого для хранения символьных данных. (Автор: Achim Gaedke; [issue 1137](https://python-all.ru/3.4/whatsnew/2.6.html).)1338- Модуль `Queue` теперь предоставляет варианты очередей, которые извлекают элементы в разном порядке. Класс `PriorityQueue` хранит элементы очереди в куче и извлекает их в порядке приоритета, а `LifoQueue` извлекает сначала наиболее недавно добавленные элементы, то есть ведёт себя как стек. (Автор: Raymond Hettinger.)1339- Объекты `Random` модуля [`random`](https://python-all.ru/3.4/library/random.html#module-random) теперь можно упаковывать с помощью pickle на 32-битной системе и распаковывать на 64-битной, и наоборот. К сожалению, это изменение также означает, что объекты `Random` из Python 2.6 невозможно правильно распаковать в более ранних версиях Python. (Автор: Shawn Ligocki; [задача 1727780](https://python-all.ru/3.4/whatsnew/2.6.html).)13401341 Новая функция `triangular(low, high, mode)` возвращает случайные числа, подчиняющиеся треугольному распределению. Возвращаемые значения находятся между *low* и *high* (не включая сам *high*), а *mode* – наиболее часто встречающееся значение в распределении. (Авторы: Wladmir van der Laan и Raymond Hettinger; [issue 1681432](https://python-all.ru/3.4/whatsnew/2.6.html).)1342- Длительные поиски по регулярному выражению, выполняемые модулем [`re`](https://python-all.ru/3.4/library/re.html#module-re) будут проверять доставку сигналов, поэтому продолжительные поиски теперь можно прерывать. (Предложено Джошем Хойтом и Ральфом Шмиттом; [issue 846388](https://python-all.ru/3.4/whatsnew/2.6.html).)13431344 Модуль регулярных выражений реализован путём компиляции байт-кода для крошечной виртуальной машины, специфичной для регулярных выражений. Недоверенный код может напрямую создавать вредоносные строки байт-кода и вызывать сбои, поэтому Python 2.6 включает верификатор байт-кода регулярных выражений. (Предложено Гвидо ван Россумом на основе работы для Google App Engine; [issue 3487](https://python-all.ru/3.4/whatsnew/2.6.html).)1345- Модуль [`rlcompleter`](https://python-all.ru/3.4/library/rlcompleter.html#module-rlcompleter), его метод `Completer.complete()` теперь будет игнорировать исключения, возникающие при вычислении имени. (Исправлено Лоренцем Кваком; [issue 2250](https://python-all.ru/3.4/whatsnew/2.6.html).)1346- В модуле [`sched`](https://python-all.ru/3.4/library/sched.html#module-sched) экземпляры `scheduler` теперь имеют доступный только для чтения атрибут [`queue`](https://python-all.ru/3.4/library/queue.html#module-queue), который возвращает содержимое очереди планировщика, представленное в виде списка именованных кортежей с полями `(time, priority, action, argument)`. (Предложено Раймондом Хеттингером; [issue 1861](https://python-all.ru/3.4/whatsnew/2.6.html).)1347- Модуль [`select`](https://python-all.ru/3.4/library/select.html#module-select) теперь содержит функции-обёртки для системных вызовов `epoll()` в Linux и `kqueue()` в BSD. К существующим объектам `poll` добавлен метод `modify()`; `pollobj.modify(fd, eventmask)` принимает файловый дескриптор или файловый объект и маску событий, изменяя записанную маску событий для этого файла. (Предложено Кристианом Хаймсом; [issue 1657](https://python-all.ru/3.4/whatsnew/2.6.html).)1348- Функция [`shutil.copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree) теперь имеет необязательный аргумент *ignore*, который принимает вызываемый объект. Этот вызываемый объект будет получать путь к каждому каталогу и список его содержимого и возвращать список имён, которые будут игнорироваться, а не копироваться.13491350 Модуль [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) также предоставляет функцию `ignore_patterns()` для использования с этим новым параметром. `ignore_patterns()` принимает произвольное количество шаблонов в стиле glob и возвращает вызываемый объект, который будет игнорировать все файлы и каталоги, соответствующие любому из этих шаблонов. Следующий пример копирует дерево каталогов, но пропускает как каталоги `.svn`, так и резервные файлы Emacs, имена которых заканчиваются на '~':13511352 ```python1353 shutil.copytree('Doc/library', '/tmp/library',1354 ignore=shutil.ignore_patterns('*~', '.svn'))1355 ```13561357 (Предложено Тареком Зиаде; [issue 2663](https://python-all.ru/3.4/whatsnew/2.6.html).)1358- Интеграция обработки сигналов с циклами событий графического интерфейса, такими как Tkinter или GTk+, долгое время была проблемой; большинство программ в итоге используют опрос, пробуждаясь каждую долю секунды, чтобы проверить, не произошли ли какие-либо события GUI. Теперь модуль [`signal`](https://python-all.ru/3.4/library/signal.html#module-signal) может сделать это более эффективно. Вызов `signal.set_wakeup_fd(fd)` устанавливает файловый дескриптор для использования; при получении сигнала в этот файловый дескриптор записывается один байт. Также существует функция на уровне C, [`PySignal_SetWakeupFd()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PySignal_SetWakeupFd), для установки дескриптора.13591360 Циклы событий будут использовать это, открывая канал для создания двух дескрипторов: один для чтения, один для записи. Дескриптор записи будет передан `set_wakeup_fd()`, а дескриптор чтения будет добавлен в список дескрипторов, отслеживаемых циклом событий через `select()` или `poll()`. При получении сигнала будет записан байт, и основной цикл событий проснётся, что избавит от необходимости опроса.13611362 (Предложено Адамом Олсеном; [issue 1583](https://python-all.ru/3.4/whatsnew/2.6.html).)13631364 Функция `siginterrupt()` теперь доступна из кода Python и позволяет изменять, могут ли сигналы прерывать системные вызовы. (Предложено Ральфом Шмиттом.)13651366 Функции `setitimer()` и `getitimer()` также были добавлены (там, где они доступны). `setitimer()` позволяет устанавливать интервальные таймеры, которые вызовут отправку сигнала процессу по истечении заданного времени, измеряемого в реальном времени, затраченном процессорном времени или суммарном времени процесса и системы. (Предложено Гильерме Поло; [issue 2240](https://python-all.ru/3.4/whatsnew/2.6.html).)1367- Модуль [`smtplib`](https://python-all.ru/3.4/library/smtplib.html#module-smtplib) теперь поддерживает SMTP через SSL благодаря добавлению класса `SMTP_SSL`. Этот класс поддерживает интерфейс, идентичный существующему классу `SMTP`. (Предложено Монти Тейлором.) Оба конструктора классов также имеют необязательный параметр `timeout`, задающий тайм-аут для начальной попытки подключения, измеряемый в секундах. (Предложено Факундо Батистой.)13681369 В модуль также была добавлена реализация протокола LMTP ([**RFC 2033**](https://python-all.ru/3.4/whatsnew/2.6.html)). LMTP используется вместо SMTP при передаче электронной почты между агентами, которые не управляют почтовой очередью. (LMTP реализован Лейфом Хедстрёмом; [issue 957003](https://python-all.ru/3.4/whatsnew/2.6.html).)13701371 `SMTP.starttls()` теперь соответствует [**RFC 3207**](https://python-all.ru/3.4/whatsnew/2.6.html) и забывает любые знания, полученные от сервера, не полученные в результате самого согласования TLS. (Патч предложен Биллом Феннером; [issue 829951](https://python-all.ru/3.4/whatsnew/2.6.html).)1372- Модуль [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) теперь поддерживает TIPC ([http://tipc.sourceforge.net/](https://python-all.ru/3.4/whatsnew/2.6.html)), высокопроизводительный протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса TIPC представляют собой кортежи из 4 или 5 элементов. (Предложено Альберто Бертольи; [issue 1646](https://python-all.ru/3.4/whatsnew/2.6.html).)13731374 Новая функция `create_connection()` принимает адрес и подключается к нему, используя необязательное значение тайм-аута, возвращая подключённый объект сокета. Эта функция также определяет тип адреса и подключается с использованием IPv4 или IPv6 по ситуации. Чтобы ваш код работал с IPv6, может быть достаточно использовать `create_connection()` вместо `socket(socket.AF_INET, ...)`.1375- Базовые классы модуля `SocketServer` теперь поддерживают вызов метода `handle_timeout()` после периода бездействия, заданного атрибутом сервера `timeout`. (Предложено Майклом Помранингом.) Метод `serve_forever()` теперь принимает необязательный интервал опроса, измеряемый в секундах, определяющий, как часто сервер будет проверять запрос на завершение работы. (Предложено Педро Вернеком и Джеффри Яскиным; [issue 742598](https://python-all.ru/3.4/whatsnew/2.6.html), [issue 1193577](https://python-all.ru/3.4/whatsnew/2.6.html).)1376- Модуль [`sqlite3`](https://python-all.ru/3.4/library/sqlite3.html#module-sqlite3), поддерживаемый Герхардом Херингом, обновлён с версии 2.3.2 в Python 2.5 до версии 2.4.1.1377- Модуль [`struct`](https://python-all.ru/3.4/library/struct.html#module-struct) теперь поддерживает тип C99 `_Bool`, с использованием символа формата `'?'`. (Предложено Дэвидом Ремалем.)1378- Объекты `Popen`, предоставляемые модулем [`subprocess`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess), теперь имеют методы `terminate()`, `kill()` и `send_signal()`. В Windows `send_signal()` поддерживает только сигнал `SIGTERM`, и все эти методы являются псевдонимами функции Win32 API `TerminateProcess()`. (Предложено Кристианом Хаймсом.)1379- Новая переменная в модуле [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys), `float_info`, представляет собой объект, содержащий информацию, полученную из файла `float.h` о поддержке чисел с плавающей точкой на платформе. Атрибуты этого объекта включают `mant_dig` (количество цифр в мантиссе), `epsilon` (наименьшая разница между 1.0 и следующим представимым большим значением) и несколько других. (Предложено Кристианом Хаймсом; [issue 1534](https://python-all.ru/3.4/whatsnew/2.6.html).)13801381 Another new variable, `dont_write_bytecode`, controls whether Python writes any `.pyc` or `.pyo` files on importing a module. If this variable is true, the compiled files are not written. The variable is initially set on start-up by supplying the [*-B*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-B) switch to the Python interpreter, or by setting the [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) environment variable before running the interpreter. Python code can subsequently change the value of this variable to control whether bytecode files are written or not. (Contributed by Neal Norwitz and Georg Brandl.)13821383 Информация об аргументах командной строки, переданных интерпретатору Python, доступна через чтение атрибутов именованного кортежа, доступного как `sys.flags`. Например, атрибут `verbose` истинен, если Python был запущен в подробном режиме, `debug` истинен в режиме отладки и т.д. Все эти атрибуты доступны только для чтения. (Предложено Кристианом Хаймсом.)13841385 Новая функция `getsizeof()` принимает объект Python и возвращает объём памяти, используемый объектом, измеряемый в байтах. Встроенные объекты возвращают корректные результаты; сторонние расширения могут этого не делать, но могут определить метод `__sizeof__()` для возврата размера объекта. (Предложено Робертом Шуппенисом; [issue 2898](https://python-all.ru/3.4/whatsnew/2.6.html).)13861387 Теперь можно определить текущие функции профилировщика и трассировщика, вызвав [`sys.getprofile()`](https://python-all.ru/3.4/library/sys.html#sys.getprofile) и [`sys.gettrace()`](https://python-all.ru/3.4/library/sys.html#sys.gettrace). (Предложено Георгом Брандлем; [issue 1648](https://python-all.ru/3.4/whatsnew/2.6.html).)1388- Модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) теперь поддерживает tar-файлы POSIX.1-2001 (pax) в дополнение к уже поддерживаемым форматам POSIX.1-1988 (ustar) и GNU tar. Формат по умолчанию – GNU tar; укажите параметр `format`, чтобы открыть файл в другом формате:13891390 ```python1391 tar = tarfile.open("output.tar", "w",1392 format=tarfile.PAX_FORMAT)1393 ```13941395 Новые параметры `encoding` и `errors` задают кодировку и схему обработки ошибок для преобразования символов. `'strict'`, `'ignore'` и `'replace'` – три стандартных способа обработки ошибок в Python; `'utf-8'` – специальное значение, которое заменяет плохие символы их представлением в UTF-8. (Преобразование символов происходит потому, что формат PAX поддерживает имена файлов в Юникоде, по умолчанию используется кодировка UTF-8.)13961397 Метод `TarFile.add()` теперь принимает аргумент `exclude`, который является функцией, используемой для исключения определённых имён файлов из архива. Функция должна принимать имя файла и возвращать true, если файл следует исключить, или false, если его следует архивировать. Функция применяется как к имени, изначально переданному `add()`, так и к именам файлов в рекурсивно добавляемых каталогах.13981399 (Все изменения выполнены Lars Gustäbel.)1400- Необязательный параметр `timeout` был добавлен в конструктор класса [`telnetlib.Telnet`](https://python-all.ru/3.4/library/telnetlib.html#telnetlib.Telnet), задающий тайм-аут в секундах. (Добавлено Факундо Батистой.)1401- Класс [`tempfile.NamedTemporaryFile`](https://python-all.ru/3.4/library/tempfile.html#tempfile.NamedTemporaryFile) обычно удаляет созданный временный файл при закрытии. Теперь это поведение можно изменить, передав `delete=False` конструктору. (Предложено Дэмиеном Миллером; [issue 1537850](https://python-all.ru/3.4/whatsnew/2.6.html).)14021403 Новый класс `SpooledTemporaryFile` ведёт себя как временный файл, но хранит данные в памяти до превышения максимального размера. При достижении этого предела содержимое записывается во временный файл на диске. (Автор: Dustin J. Mitchell.)14041405 Классы `NamedTemporaryFile` и `SpooledTemporaryFile` оба работают как контекстные менеджеры, поэтому можно написать `with tempfile.NamedTemporaryFile() as tmp: ...`. (Автор: Alexander Belopolsky; [issue 2021](https://python-all.ru/3.4/whatsnew/2.6.html).)1406- Модуль `test.test_support` получил несколько контекстных менеджеров, полезных для написания тестов. `EnvironmentVarGuard()` – это контекстный менеджер, который временно изменяет переменные окружения и автоматически восстанавливает их старые значения.14071408 Ещё один контекстный менеджер, `TransientResource`, может обрамлять вызовы ресурсов, которые могут быть недоступны; он перехватывает и игнорирует указанный список исключений. Например, сетевой тест может игнорировать определённые ошибки при подключении к внешнему веб-сайте:14091410 ```python1411 with test_support.TransientResource(IOError,1412 errno=errno.ETIMEDOUT):1413 f = urllib.urlopen('https://sf.net')1414 ...1415 ```14161417 Наконец, `check_warnings()` сбрасывает фильтры предупреждений модуля `warning` и возвращает объект, который будет записывать все возникающие предупреждения ([issue 3781](https://python-all.ru/3.4/whatsnew/2.6.html)):14181419 ```python1420 with test_support.check_warnings() as wrec:1421 warnings.simplefilter("always")1422 # ... код, вызывающий предупреждение ...1423 assert str(wrec.message) == "function is outdated"1424 assert len(wrec.warnings) == 1, "Multiple warnings raised"1425 ```14261427 (Автор: Бретт Кэннон.)1428- Модуль [`textwrap`](https://python-all.ru/3.4/library/textwrap.html#module-textwrap) теперь может сохранять существующие пробелы в начале и конце новых строк, если указать `drop_whitespace=False` в качестве аргумента:14291430 ```python1431 >>> S = """This sentence has a bunch of1432 ... extra whitespace."""1433 >>> print textwrap.fill(S, width=15)1434 This sentence1435 has a bunch1436 of extra1437 whitespace.1438 >>> print textwrap.fill(S, drop_whitespace=False, width=15)1439 This sentence1440 has a bunch1441 of extra1442 whitespace.1443 >>>1444 ```14451446 (Автор: Dwayne Bailey; [issue 1581073](https://python-all.ru/3.4/whatsnew/2.6.html).)1447- API модуля [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) изменяется для использования свойств, таких как `daemon`, вместо методов `setDaemon()` и `isDaemon()`, а некоторые методы переименованы с использованием подчёркиваний вместо верблюжьего регистра; например, метод `activeCount()` переименован в `active_count()`. Версии модуля 2.6 и 3.0 поддерживают одни и те же свойства и переименованные методы, но старые методы не удаляются. Дата устаревания старых API в Python 3.x не установлена; старые API не будут удалены ни в одной версии 2.x. (Реализовано несколькими людьми, в первую очередь Бенджамином Петерсоном.)14481449 Потоковые объекты `Thread` модуля [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) получили свойство `ident`, возвращающее идентификатор потока – ненулевое целое число. (Автор: Gregory P. Smith; [issue 2871](https://python-all.ru/3.4/whatsnew/2.6.html).)1450- Модуль [`timeit`](https://python-all.ru/3.4/library/timeit.html#module-timeit) теперь принимает как вызываемые объекты, так и строки для измеряемого выражения и кода настройки. Были добавлены две вспомогательные функции для создания экземпляров `Timer`: `repeat(stmt, setup, time, repeat, number)` и `timeit(stmt, setup, time, number)` создают экземпляр и вызывают соответствующий метод. (Автор: Erik Demaine; [issue 1533909](https://python-all.ru/3.4/whatsnew/2.6.html).)1451- Модуль `Tkinter` теперь принимает списки и кортежи для опций, разделяя элементы пробелами перед передачей результирующего значения в Tcl/Tk. (Автор: Guilherme Polo; [issue 2906](https://python-all.ru/3.4/whatsnew/2.6.html).)1452- Модуль [`turtle`](https://python-all.ru/3.4/library/turtle.html#module-turtle) для черепашьей графики был значительно улучшен Gregor Lingl. Новые возможности модуля включают:14531454 - Улучшенная анимация движения и поворота черепахи.1455 - Управление движением черепахи с помощью новых методов `delay()`, `tracer()` и `speed()`.1456 - Возможность задавать новые формы для черепахи и определять новую систему координат.1457 - Черепахи теперь имеют метод `undo()`, который может отменять действия.1458 - Простая поддержка реакции на события ввода, такие как активность мыши и клавиатуры, что позволяет писать простые игры.1459 - Файл `turtle.cfg` можно использовать для настройки начального вида экрана черепахи.1460 - Докстринги модуля могут быть заменены новыми докстрингами, переведёнными на другой язык.14611462 ([issue 1513695](https://python-all.ru/3.4/whatsnew/2.6.html))1463- Необязательный параметр `timeout` был добавлен в функцию `urllib.urlopen()` и конструктор класса `urllib.ftpwrapper`, а также в функцию `urllib2.urlopen()`. Параметр задаёт тайм-аут в секундах. Например:14641465 ```python1466 >>> u = urllib2.urlopen("http://slow.example.com",1467 timeout=3)1468 Traceback (most recent call last):1469 ...1470 urllib2.URLError: <urlopen error timed out>1471 >>>1472 ```14731474 (Добавлено Facundo Batista.)1475- База данных Unicode, предоставляемая модулем [`unicodedata`](https://python-all.ru/3.4/library/unicodedata.html#module-unicodedata), обновлена до версии 5.1.0. (Обновлено Martin von Löwis; [issue 3811](https://python-all.ru/3.4/whatsnew/2.6.html).)1476- Функции `formatwarning()` и `showwarning()` модуля [`warnings`](https://python-all.ru/3.4/library/warnings.html#module-warnings) получили необязательный аргумент *line*, который можно использовать для передачи строки исходного кода. (Добавлено в рамках [issue 1631171](https://python-all.ru/3.4/whatsnew/2.6.html), в котором часть модуля [`warnings`](https://python-all.ru/3.4/library/warnings.html#module-warnings) была переписана на C.)14771478 Новая функция `catch_warnings()` – это контекстный менеджер, предназначенный для тестирования, позволяющий временно изменять фильтры предупреждений, а затем восстанавливать их исходные значения ([issue 3781](https://python-all.ru/3.4/whatsnew/2.6.html)).1479- Классы XML-RPC `SimpleXMLRPCServer` и `DocXMLRPCServer` теперь можно предотвратить от немедленного открытия и привязки к своему сокету, передав True в качестве параметра конструктора `bind_and_activate`. Это можно использовать для изменения атрибута экземпляра `allow_reuse_address` перед вызовом методов `server_bind()` и `server_activate()` для открытия сокета и начала прослушивания соединений. (Автор: Peter Parente; [issue 1599845](https://python-all.ru/3.4/whatsnew/2.6.html).)14801481 `SimpleXMLRPCServer` также имеет атрибут `_send_traceback_header`; если он истинен, исключение и форматированная трассировка возвращаются в виде HTTP-заголовков «X-Exception» и «X-Traceback». Эта функция предназначена только для отладки и не должна использоваться на производственных серверах, так как трассировки могут раскрыть пароли или другую конфиденциальную информацию. (Автор: Alan McIntyre в рамках его проекта для Google Summer of Code 2007.)1482- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.4/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.4/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразования была не всегда корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и [`time`](https://python-all.ru/3.4/library/time.html#module-time) самостоятельно. ([issue 1330538](https://python-all.ru/3.4/whatsnew/2.6.html)) Код также может обрабатывать даты до 1900 года (автор: Ralf Schmitt; [issue 2014](https://python-all.ru/3.4/whatsnew/2.6.html)) и 64-битные целые числа, представленные с помощью `<i8>` в ответах XML-RPC (автор: Riku Lindblad; [issue 2985](https://python-all.ru/3.4/whatsnew/2.6.html)).1483- Класс `ZipFile` модуля [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile) теперь имеет методы `extract()` и `extractall()`, которые распаковывают один файл или все файлы архива в текущий каталог или в указанный каталог:14841485 ```python1486 z = zipfile.ZipFile('python-251.zip')14871488 # Распаковать один файл, записывая его относительно1489 # в каталог /tmp.1490 z.extract('Python/sysmodule.c', '/tmp')14911492 # Распаковать все файлы из архива.1493 z.extractall()1494 ```14951496 (Автор: Alan McIntyre; [issue 467924](https://python-all.ru/3.4/whatsnew/2.6.html).)14971498 Методы [`open()`](https://python-all.ru/3.4/library/functions.html#open), `read()` и `extract()` теперь могут принимать как имя файла, так и объект `ZipInfo`. Это полезно, если архив случайно содержит дублирующееся имя файла. (Автор: Graham Horler; [issue 1775025](https://python-all.ru/3.4/whatsnew/2.6.html).)14991500 Наконец, [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile) теперь поддерживает имена файлов в Unicode для архивов. (Автор: Alexey Borzenkov; [issue 1734346](https://python-all.ru/3.4/whatsnew/2.6.html).)15011502### Модуль [`ast`](https://python-all.ru/3.4/library/ast.html#module-ast)15031504Модуль [`ast`](https://python-all.ru/3.4/library/ast.html#module-ast) предоставляет представление Python-кода в виде абстрактного синтаксического дерева (AST), и Armin Ronacher добавил набор вспомогательных функций, выполняющих различные распространённые задачи. Они будут полезны для пакетов HTML-шаблонов, анализаторов кода и подобных инструментов, обрабатывающих код Python.15051506Функция `parse()` принимает выражение и возвращает AST. Функция `dump()` выводит представление дерева, подходящее для отладки:15071508```python1509import ast15101511t = ast.parse("""1512d = {}1513for i in 'abcdefghijklm':1514 d[i + i] = ord(i) - ord('a') + 11515print d1516""")1517print ast.dump(t)1518```15191520Это выводит глубоко вложенное дерево:15211522```python1523Module(body=[1524 Assign(targets=[1525 Name(id='d', ctx=Store())1526 ], value=Dict(keys=[], values=[]))1527 For(target=Name(id='i', ctx=Store()),1528 iter=Str(s='abcdefghijklm'), body=[1529 Assign(targets=[1530 Subscript(value=1531 Name(id='d', ctx=Load()),1532 slice=1533 Index(value=1534 BinOp(left=Name(id='i', ctx=Load()), op=Add(),1535 right=Name(id='i', ctx=Load()))), ctx=Store())1536 ], value=1537 BinOp(left=1538 BinOp(left=1539 Call(func=1540 Name(id='ord', ctx=Load()), args=[1541 Name(id='i', ctx=Load())1542 ], keywords=[], starargs=None, kwargs=None),1543 op=Sub(), right=Call(func=1544 Name(id='ord', ctx=Load()), args=[1545 Str(s='a')1546 ], keywords=[], starargs=None, kwargs=None)),1547 op=Add(), right=Num(n=1)))1548 ], orelse=[])1549 Print(dest=None, values=[1550 Name(id='d', ctx=Load())1551 ], nl=True)1552 ])1553```15541555Метод `literal_eval()` принимает строку или AST, представляющее литеральное выражение, анализирует и вычисляет его, а затем возвращает полученное значение. Литеральное выражение – это выражение Python, содержащее только строки, числа, словари и т.д., но без инструкций или вызовов функций. Если нужно вычислить выражение, но нельзя принять риск безопасности при использовании [`eval()`](https://python-all.ru/3.4/library/functions.html#eval), `literal_eval()` выполнит это безопасно:15561557```python1558>>> literal = '("a", "b", {2:4, 3:8, 1:2})'1559>>> print ast.literal_eval(literal)1560('a', 'b', {1: 2, 2: 4, 3: 8})1561>>> print ast.literal_eval('"a" + "b"')1562Traceback (most recent call last):1563 ...1564ValueError: malformed string1565```15661567The module also includes `NodeVisitor` and `NodeTransformer` classes for traversing and modifying an AST, and functions for common transformations such as changing line numbers.15681569### Модуль `future_builtins`15701571Python 3.0 вносит множество изменений в набор встроенных функций, и большинство из них нельзя перенести в серию Python 2.x, так как это нарушит совместимость. Модуль `future_builtins` предоставляет версии этих встроенных функций, которые можно импортировать при написании кода, совместимого с Python 3.0.15721573Функции в этом модуле в настоящее время включают:15741575- `ascii(obj)`: эквивалентно [`repr()`](https://python-all.ru/3.4/library/functions.html#repr). В Python 3.0 [`repr()`](https://python-all.ru/3.4/library/functions.html#repr) будет возвращать строку Unicode, а [`ascii()`](https://python-all.ru/3.4/library/functions.html#ascii) будет возвращать чистую ASCII-байтовую строку.1576- `filter(predicate, iterable)`, `map(func, iterable1, ...)`: в версии 3.0 эти функции возвращают итераторы, в отличие от встроенных функций 2.x, которые возвращали списки.1577- `hex(value)`, `oct(value)`: вместо вызова методов `__hex__()` или `__oct__()` эти версии будут вызывать метод [`__index__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__index__) и преобразовывать результат в шестнадцатеричное или восьмеричное представление. [`oct()`](https://python-all.ru/3.4/library/functions.html#oct) будет использовать новую нотацию `0o` для своего результата.15781579### Модуль [`json`](https://python-all.ru/3.4/library/json.html#module-json): JavaScript Object Notation15801581Новый модуль [`json`](https://python-all.ru/3.4/library/json.html#module-json) поддерживает кодирование и декодирование типов Python в JSON (Javascript Object Notation). JSON – это легковесный формат обмена данными, часто используемый в веб-приложениях. Дополнительную информацию о JSON можно найти по адресу [http://www.json.org](https://python-all.ru/3.4/whatsnew/2.6.html).15821583[`json`](https://python-all.ru/3.4/library/json.html#module-json) поставляется с поддержкой декодирования и кодирования большинства встроенных типов Python. Следующий пример кодирует и декодирует словарь:15841585```python1586>>> import json1587>>> data = {"spam": "foo", "parrot": 42}1588>>> in_json = json.dumps(data) # Закодировать данные1589>>> in_json1590'{"parrot": 42, "spam": "foo"}'1591>>> json.loads(in_json) # Декодировать в объект Python1592{"spam": "foo", "parrot": 42}1593```15941595Также можно написать собственные декодеры и кодеры для поддержки большего количества типов. Также поддерживается pretty-printing JSON-строк.15961597[`json`](https://python-all.ru/3.4/library/json.html#module-json) (изначально назывался simplejson) был написан Бобом Ипполито.15981599### Модуль [`plistlib`](https://python-all.ru/3.4/library/plistlib.html#module-plistlib): парсер Property-List16001601Формат `.plist` широко используется в Mac OS X для хранения базовых типов данных (чисел, строк, списков и словарей) путём их сериализации в XML-подобный формат. Он напоминает сериализацию типов данных XML-RPC.16021603Несмотря на то, что этот формат в основном используется в Mac OS X, в нём нет ничего специфичного для Mac, и реализация на Python работает на любой платформе, которую поддерживает Python, поэтому модуль [`plistlib`](https://python-all.ru/3.4/library/plistlib.html#module-plistlib) был перенесён в стандартную библиотеку.16041605Использовать модуль просто:16061607```python1608import sys1609import plistlib1610import datetime16111612# Создать структуру данных1613data_struct = dict(lastAccessed=datetime.datetime.now(),1614 version=1,1615 categories=('Personal','Shared','Private'))16161617# Создать строку, содержащую XML.1618plist_str = plistlib.writePlistToString(data_struct)1619new_struct = plistlib.readPlistFromString(plist_str)1620print data_struct1621print new_struct16221623# Записать структуру данных в файл и прочитать её обратно.1624plistlib.writePlist(data_struct, '/tmp/customizations.plist')1625new_struct = plistlib.readPlist('/tmp/customizations.plist')16261627# read/writePlist принимает как файлоподобные объекты, так и пути.1628plistlib.writePlist(data_struct, sys.stdout)1629```16301631### Улучшения ctypes16321633Томас Хеллер продолжал поддерживать и улучшать модуль [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes).16341635[`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes) теперь поддерживает тип данных `c_bool`, представляющий тип C99 `bool`. (Предложено Дэвидом Ремалем; [issue 1649190](https://python-all.ru/3.4/whatsnew/2.6.html).)16361637Типы строк, буферов и массивов [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes) получили улучшенную поддержку расширенного синтаксиса срезов, где можно указывать различные комбинации `(start, stop, step)`. (Реализовано Томасом Ваутерсом.)16381639Все типы данных [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes) теперь поддерживают методы `from_buffer()` и `from_buffer_copy()`, которые создают экземпляр ctypes на основе предоставленного буферного объекта. `from_buffer_copy()` копирует содержимое объекта, а `from_buffer()` использует ту же область памяти.16401641Новое соглашение о вызовах указывает [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes) очищать переменные `errno` или Win32 LastError при каждом обёрнутом вызове. (Реализовано Томасом Хеллером; [issue 1798](https://python-all.ru/3.4/whatsnew/2.6.html).)16421643Теперь можно получить значение переменной Unix `errno` после вызова функции. При создании обёрнутой функции можно передать `use_errno=True` в качестве именованного параметра функции `DLL()`, а затем вызывать методы модуля `set_errno()` и `get_errno()` для установки и получения значения ошибки.16441645Переменная Win32 LastError аналогичным образом поддерживается функциями `DLL()`, `OleDLL()` и `WinDLL()`. Необходимо передать `use_last_error=True` в качестве именованного параметра, а затем вызывать методы модуля `set_last_error()` и `get_last_error()`.16461647Функция `byref()`, используемая для получения указателя на экземпляр ctypes, теперь имеет необязательный параметр *offset*, который представляет собой количество байтов, добавляемое к возвращаемому указателю.16481649### Улучшенная поддержка SSL16501651Билл Янссен внёс значительные улучшения в поддержку Secure Sockets Layer в Python 2.6, добавив новый модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl), построенный на основе библиотеки [OpenSSL](https://python-all.ru/3.4/whatsnew/2.6.html). Этот новый модуль предоставляет более тонкий контроль над согласованным протоколом, используемыми сертификатами X.509 и лучше поддерживает написание SSL-серверов (в отличие от клиентов) на Python. Существующая поддержка SSL в модуле [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) не была удалена и продолжает работать, хотя она будет удалена в Python 3.0.16521653Чтобы использовать новый модуль, сначала необходимо обычным способом создать TCP-соединение, а затем передать его функции [`ssl.wrap_socket()`](https://python-all.ru/3.4/library/ssl.html#ssl.wrap_socket). Можно указать, требуется ли сертификат, и получить информацию о сертификате, вызвав метод `getpeercert()`.16541655> **См. также**1656>1657> Документация по модулю [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl).16581659## Устаревания и удаления16601661- Строковые исключения были удалены. Попытка их использования приводит к [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).1662- Продолжаются изменения интерфейса [`исключения`](https://python-all.ru/3.4/library/exceptions.html#Exception), обусловленные [**PEP 352**](https://python-all.ru/3.4/whatsnew/2.6.html). Для версии 2.6 атрибут `message` устарел в пользу атрибута `args`.1663- (Режим предупреждений о 3.0) В Python 3.0 будет реорганизована стандартная библиотека: многие устаревшие модули будут удалены, а другие переименованы. Python 2.6, запущенный в режиме предупреждений о 3.0, будет выдавать предупреждения об этих модулях при их импорте.16641665 Список устаревших модулей: `audiodev`, `bgenlocations`, `buildtools`, `bundlebuilder`, `Canvas`, `compiler`, `dircache`, `dl`, `fpformat`, `gensuitemodule`, `ihooks`, `imageop`, `imgfile`, `linuxaudiodev`, `mhlib`, `mimetools`, `multifile`, `new`, `pure`, `statvfs`, `sunaudiodev`, `test.testall`, и `toaiff`.1666- Модуль `gopherlib` был удалён.1667- Модули `MimeWriter` и `mimify` устарели; вместо них используйте пакет [`email`](https://python-all.ru/3.4/library/email.html#module-email).1668- Модуль `md5` устарел; используйте модуль [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib).1669- Модуль `posixfile` устарел; [`fcntl.lockf()`](https://python-all.ru/3.4/library/fcntl.html#fcntl.lockf) обеспечивает лучшую блокировку.1670- Модуль `popen2` устарел; используйте модуль [`подпроцесс`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess).1671- Модуль `rgbimg` был удалён.1672- Модуль `sets` объявлен устаревшим; лучше использовать встроенные типы [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.4/library/stdtypes.html#frozenset).1673- Модуль `sha` устарел; вместо него используйте модуль [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib).16741675## Изменения в сборке и C API16761677Изменения процесса сборки Python и C API включают:16781679- Python теперь нужно компилировать компиляторами C89 (спустя 19 лет!). Это означает, что в исходном коде Python удалены собственные реализации `memmove()` и `strerror()`, которые есть в стандартной библиотеке C89.1680- Python 2.6 можно собрать с помощью Microsoft Visual Studio 2008 (версия 9.0), и это новый компилятор по умолчанию. Файлы сборки находятся в каталоге `PCbuild`. (Реализовано Кристианом Хаймсом.)1681- На Mac OS X Python 2.6 можно скомпилировать как универсальную сборку с четырьмя архитектурами. Скрипт **configure** принимает ключ *--with-universal-archs=\[32-bit|64-bit|all\]*, который определяет, собирать ли двоичные файлы для 32-разрядных архитектур (x86, PowerPC), 64-разрядных (x86-64 и PPC-64) или для обеих. (Предложено Рональдом Оссуреном.)1682- Модуль BerkeleyDB теперь имеет объект C API, доступный как `bsddb.db.api`. Этот объект могут использовать другие расширения на C, которые хотят применять модуль `bsddb` для своих целей. (Предложено Дунканом Грисби.)1683- Новый интерфейс буферов, описанный ранее в разделе [PEP 3118](https://python-all.ru/3.4/whatsnew/2.6.html#pep-3118-revised-buffer-protocol), добавляет функции [`PyObject_GetBuffer()`](https://python-all.ru/3.4/c-api/buffer.html#c.PyObject_GetBuffer) и [`PyBuffer_Release()`](https://python-all.ru/3.4/c-api/buffer.html#c.PyBuffer_Release), а также несколько других.1684- Использование Python библиотеки C stdio теперь потокобезопасно, по крайней мере настолько, насколько потокобезопасна сама библиотека. Раньше существовала потенциальная ошибка: если один поток закрывал файловый объект, пока другой поток читал из него или записывал в него. В Python 2.6 файловые объекты имеют счётчик ссылок, управляемый функциями `PyFile_IncUseCount()` и `PyFile_DecUseCount()`. Файловый объект нельзя закрыть, пока счётчик ссылок не станет равен нулю. `PyFile_IncUseCount()` должна вызываться, пока GIL ещё удерживается, перед выполнением операции ввода-вывода с использованием указателя `FILE *`, а `PyFile_DecUseCount()` должна вызываться сразу после повторного захвата GIL. (Предложено Антуаном Питру и Грегори П. Смитом.)1685- Одновременный импорт модулей в двух разных потоках больше не приводит к взаимоблокировке; теперь вместо этого возникает исключение [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError). Новая функция API, [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_ImportModuleNoBlock), сначала ищет модуль в `sys.modules`, а затем пытается импортировать его после захвата блокировки импорта. Если блокировка импорта удерживается другим потоком, возбуждается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError). (Предложено Кристианом Хаймсом.)1686- Несколько функций возвращают информацию о поддержке чисел с плавающей запятой на платформе. [`PyFloat_GetMax()`](https://python-all.ru/3.4/c-api/float.html#c.PyFloat_GetMax) возвращает максимальное представимое значение с плавающей запятой, а [`PyFloat_GetMin()`](https://python-all.ru/3.4/c-api/float.html#c.PyFloat_GetMin) – минимальное положительное значение. [`PyFloat_GetInfo()`](https://python-all.ru/3.4/c-api/float.html#c.PyFloat_GetInfo) возвращает объект, содержащий больше информации из файла `float.h`, например `"mant_dig"` (количество цифр в мантиссе), `"epsilon"` (наименьшая разница между 1.0 и следующим большим представимым значением) и несколько других. (Предложено Кристианом Хаймсом; [issue 1534](https://python-all.ru/3.4/whatsnew/2.6.html).)1687- C-функции и методы, использующие [`PyComplex_AsCComplex()`](https://python-all.ru/3.4/c-api/complex.html#c.PyComplex_AsCComplex), теперь принимают аргументы, имеющие метод [`__complex__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__complex__). В частности, функции модуля [`cmath`](https://python-all.ru/3.4/library/cmath.html#module-cmath) теперь будут принимать объекты с этим методом. Это обратный порт изменения из Python 3.0. (Предложено Марком Дикинсоном; [issue 1675423](https://python-all.ru/3.4/whatsnew/2.6.html).)1688- C API Python теперь включает две функции для сравнения строк без учёта регистра: `PyOS_stricmp(char*, char*)` и `PyOS_strnicmp(char*, char*, Py_ssize_t)`. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.4/whatsnew/2.6.html).)1689- Многие расширения на C определяют собственные небольшие макросы для добавления целых чисел и строк в словарь модуля в функции `init*`. Python 2.6 наконец определяет стандартные макросы для добавления значений в модуль: [`PyModule_AddStringMacro`](https://python-all.ru/3.4/c-api/module.html#c.PyModule_AddStringMacro) и `PyModule_AddIntMacro()`. (Предложено Кристианом Хаймсом.)1690- Некоторые макросы были переименованы как в Python 3.0, так и в 2.6, чтобы яснее показать, что это макросы, а не функции. `Py_Size()` стал `Py_SIZE()`, `Py_Type()` стал `Py_TYPE()`, а `Py_Refcnt()` стал `Py_REFCNT()`. Макросы со смешанным регистром по-прежнему доступны в Python 2.6 для обратной совместимости. ([issue 1629](https://python-all.ru/3.4/whatsnew/2.6.html))1691- Distutils теперь помещает расширения на C, которые он собирает, в другой каталог при работе с отладочной версией Python. (Предложено Коллином Уинтером; [issue 1530959](https://python-all.ru/3.4/whatsnew/2.6.html).)1692- Некоторые базовые типы данных, такие как целые числа и строки, поддерживают внутренние списки свободных объектов, которые можно повторно использовать. Структуры данных для этих списков теперь следуют соглашению об именовании: переменная всегда называется `free_list`, счётчик всегда называется `numfree`, и всегда определяется макрос `Py<typename>_MAXFREELIST`.1693- Новая цель Makefile, «make patchcheck», подготавливает исходное дерево Python к созданию патча: исправляет завершающие пробелы во всех изменённых файлах `.py`, проверяет, была ли изменена документация, и сообщает, обновлены ли файлы `Misc/ACKS` и `Misc/NEWS`. (Предложено Бреттом Кэнноном.)16941695 Еще одна новая цель, «make profile-opt», компилирует двоичный файл Python с использованием профильно-ориентированной оптимизации GCC. Она компилирует Python с включенным профилированием, запускает набор тестов для получения набора результатов профилирования, а затем компилирует с использованием этих результатов для оптимизации. (Автор: Грегори П. Смит.)16961697### Изменения для конкретных платформ: Windows16981699- Поддержка Windows 95, 98, ME и NT4 прекращена. Python 2.6 требует по крайней мере Windows 2000 SP4.1700- Новый компилятор по умолчанию в Windows – Visual Studio 2008 (версия 9.0). Каталоги сборки для Visual Studio 2003 (версия 7.1) и 2005 (версия 8.0) были перемещены в каталог PC/. Новый каталог `PCbuild` поддерживает кросс-компиляцию для X64, отладочные сборки и профильную оптимизацию (PGO). Сборки с PGO примерно на 10% быстрее обычных. (Предложено Кристианом Хаймсом с помощью Амори Форжо д’Арка и Мартина фон Лёвиса.)1701- Модуль [`msvcrt`](https://python-all.ru/3.4/library/msvcrt.html#module-msvcrt) теперь поддерживает как обычные, так и широкосимвольные варианты консольного I/O API. Функция `getwch()` считывает нажатие клавиши и возвращает значение Unicode, так же как и функция `getwche()`. Функция `putwch()` принимает символ Unicode и выводит его на консоль. (Предложено Кристианом Хаймсом.)1702- [`os.path.expandvars()`](https://python-all.ru/3.4/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Предложено Джозайей Карлсоном; [issue 957650](https://python-all.ru/3.4/whatsnew/2.6.html).)1703- Сокетные объекты модуля [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) теперь имеют метод `ioctl()`, который предоставляет ограниченный интерфейс к системному интерфейсу `WSAIoctl()`.1704- Модуль `_winreg` теперь имеет функцию `ExpandEnvironmentStrings()`, которая раскрывает ссылки на переменные окружения, такие как `%NAME%`, во входной строке. Объекты-дескрипторы, предоставляемые этим модулем, теперь поддерживают протокол контекста, поэтому их можно использовать в операторах [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with). (Предложено Кристианом Хаймсом.)17051706 `_winreg` также имеет лучшую поддержку систем x64, предоставляя функции `DisableReflectionKey()`, `EnableReflectionKey()` и `QueryReflectionKey()`, которые включают и отключают отражение реестра для 32-разрядных процессов, работающих в 64-разрядных системах. ([issue 1753245](https://python-all.ru/3.4/whatsnew/2.6.html))1707- Объект `Record` модуля [`msilib`](https://python-all.ru/3.4/library/msilib.html#module-msilib) получил методы `GetInteger()` и `GetString()`, которые возвращают значения полей как целое число или строку. (Предложено Флорисом Брюнноге; [issue 2125](https://python-all.ru/3.4/whatsnew/2.6.html).)17081709### Изменения для конкретных платформ: Mac OS X17101711- При компиляции фреймворк-сборки Python теперь можно указать имя фреймворка, передав опцию *--with-framework-name=* скрипту **configure**.1712- Модуль `macfs` был удалён. Это, в свою очередь, потребовало удаления функции `macostools.touched()`, поскольку она зависела от модуля `macfs`. ([issue 1490190](https://python-all.ru/3.4/whatsnew/2.6.html))1713- Многие другие модули Mac OS объявлены устаревшими и будут удалены в Python 3.0: `_builtinSuites`, `aepack`, `aetools`, `aetypes`, `applesingle`, `appletrawmain`, `appletrunner`, `argvemulator`, `Audio_mac`, `autoGIL`, `Carbon`, `cfmfile`, `CodeWarrior`, `ColorPicker`, `EasyDialogs`, `Explorer`, `Finder`, `FrameWork`, `findertools`, `ic`, `icglue`, `icopen`, `macerrors`, `MacOS`, `macfs`, `macostools`, `macresource`, `MiniAEFrame`, `Nav`, `Netscape`, `OSATerminology`, `pimp`, `PixMapWrapper`, `StdSuites`, `SystemEvents`, `Terminal` и `terminalcommand`.17141715### Изменения для конкретных портов: IRIX17161717Ряд старых модулей, специфичных для IRIX, объявлены устаревшими и будут удалены в Python 3.0: `al` и `AL`, `cd`, `cddb`, `cdplayer`, `CL` и `cl`, `DEVICE`, `ERRNO`, `FILE`, `FL` и `fl`, `flp`, `fm`, `GET`, `GLWS`, `GL` и `gl`, `IN`, `IOCTL`, `jpeg`, `panelparser`, `readcd`, `SV` и `sv`, `torgb`, `videoreader` и `WAIT`.17181719## Перенос на Python 2.617201721В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:17221723- Классы, которые не должны быть хешируемыми, должны устанавливать `__hash__ = None` в своих определениях, чтобы указать на этот факт.1724- Строковые исключения удалены. Попытка их использовать вызывает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).1725- Метод [`__init__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__init__) класса [`collections.deque`](https://python-all.ru/3.4/library/collections.html#collections.deque) теперь очищает все существующие содержимое deque перед добавлением элементов из итерируемого объекта. Это изменение приводит поведение в соответствие с `list.__init__()`.1726- [`object.__init__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__init__) ранее принимал произвольные позиционные и именованные аргументы, игнорируя их. В Python 2.6 это больше не допускается и приводит к [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Это повлияет на методы [`__init__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__init__), которые в конечном итоге вызывают соответствующий метод у [`object`](https://python-all.ru/3.4/library/functions.html#object) (возможно, через использование [`super()`](https://python-all.ru/3.4/library/functions.html#super)). См. обсуждение в [issue 1683368](https://python-all.ru/3.4/whatsnew/2.6.html).1727- Конструктор `Decimal` теперь принимает начальные и конечные пробелы при передаче строки. Ранее он возбуждал исключение `InvalidOperation`. С другой стороны, метод `create_decimal()` объектов `Context` теперь явно запрещает лишние пробелы, возбуждая исключение `ConversionSyntax`.1728- Из-за случайности в реализации, при передаче пути к файлу встроенной функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) она фактически импортировала указанный файл. Однако это никогда не предполагалось работать, и теперь реализация явно проверяет этот случай и возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).1729- C API: функции [`PyImport_Import()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_Import) и [`PyImport_ImportModule()`](https://python-all.ru/3.4/c-api/import.html#c.PyImport_ImportModule) теперь по умолчанию используют абсолютные импорты, а не относительные. Это повлияет на расширения C, которые импортируют другие модули.1730- C API: типы данных расширений, которые не должны быть хешируемыми, должны определять свой слот `tp_hash` как [`PyObject_HashNotImplemented()`](https://python-all.ru/3.4/c-api/object.html#c.PyObject_HashNotImplemented).1731- В модуле [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) исключение [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error) теперь наследуется от [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError). Ранее оно не было подклассом `StandardError`, но теперь им стало через [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError). (Реализовано Грегори П. Смитом; [issue 1706815](https://python-all.ru/3.4/whatsnew/2.6.html).)1732- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.4/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.4/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразований не обязательно была корректной для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и [`time`](https://python-all.ru/3.4/library/time.html#module-time). ([issue 1330538](https://python-all.ru/3.4/whatsnew/2.6.html))1733- (Режим предупреждений для версии 3.0) Класс [`Исключение`](https://python-all.ru/3.4/library/exceptions.html#Exception) теперь выводит предупреждение при доступе через срез или по индексу; возможность использования [`Исключение`](https://python-all.ru/3.4/library/exceptions.html#Exception) как кортежа постепенно убирается.1734- (Режим предупреждений для версии 3.0) Сравнения на неравенство между двумя словарями или двумя объектами, не реализующими методы сравнения, теперь выводят предупреждения. `dict1 == dict2` всё ещё работает, но `dict1 < dict2` постепенно убирается.17351736 Сравнения между ячейками (cells), которые являются деталью реализации правил области видимости Python, также вызывают предупреждения, поскольку такие сравнения полностью запрещены в 3.0.17371738## Благодарности17391740Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.1741