Документация Python неофициальный перевод

2.6.md

1749 строк · 213.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.12/whatsnew/2.6.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 2.689**Автор:**1011A.M. Kuchling (amk at amk.ca)1213В этой статье описываются новые возможности Python 2.6, выпущенного 1 октября 2008 года. График выпуска описан в [**PEP 361**](https://python-all.ru/3.12/whatsnew/2.6.html).1415Основная тема Python 2.6 – подготовка пути к миграции на Python 3.0, крупное перепроектирование языка. По возможности Python 2.6 включает новые возможности и синтаксис из версии 3.0, оставаясь совместимым с существующим кодом за счёт того, что не удаляет старые возможности или синтаксис. Когда это невозможно, Python 2.6 старается сделать всё возможное, добавляя функции совместимости в модуле `future_builtins` и ключ `-3` для предупреждения об использовании, которое станет неподдерживаемым в версии 3.0.1617В стандартную библиотеку были добавлены некоторые важные новые пакеты, такие как модули [`multiprocessing`](https://python-all.ru/3.12/library/multiprocessing.html#module-multiprocessing) и [`json`](https://python-all.ru/3.12/library/json.html#module-json), но новых возможностей, не связанных так или иначе с Python 3.0, не так много.1819Python 2.6 также содержит ряд улучшений и исправлений ошибок по всему исходному коду. Поиск по журналам изменений показывает, что между Python 2.5 и 2.6 было применено 259 патчей и исправлено 612 ошибок. Обе цифры, вероятно, занижены.2021Эта статья не пытается дать полную спецификацию новых возможностей, а вместо этого предоставляет удобный обзор. За подробностями обращайтесь к документации Python 2.6. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности. По возможности «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.2223## Python 3.02425Цикл разработки версий Python 2.6 и 3.0 был синхронизирован: альфа- и бета-релизы для обеих версий выходили в одни и те же дни. Разработка версии 3.0 повлияла на многие возможности в версии 2.6.2627Python 3.0 – это масштабное перепроектирование Python, которое нарушает совместимость с серией 2.x. Это означает, что существующий код Python потребует некоторой конвертации, чтобы работать на Python 3.0. Однако не все изменения в 3.0 обязательно нарушают совместимость. В тех случаях, когда новые возможности не приводят к нарушению существующего кода, они были перенесены в 2.6 и описаны в этом документе в соответствующих разделах. Некоторые из возможностей, заимствованных из 3.0:2829- Метод `__complex__()` для преобразования объектов в комплексное число.30- Альтернативный синтаксис для перехвата исключений: `except TypeError as exc`.31- Добавление [`functools.reduce()`](https://python-all.ru/3.12/library/functools.html#functools.reduce) как синонима для встроенной функции `reduce()`.3233Python 3.0 добавляет несколько новых встроенных функций и изменяет семантику некоторых существующих. Функции, новые в 3.0, такие как [`bin()`](https://python-all.ru/3.12/library/functions.html#bin), были просто добавлены в Python 2.6, но существующие встроенные функции не были изменены; вместо этого модуль `future_builtins` содержит версии с новой семантикой 3.0. Код, написанный для совместимости с 3.0, может при необходимости делать `from future_builtins import hex, map`.3435Новый ключ командной строки `-3` включает предупреждения о возможностях, которые будут удалены в Python 3.0. Вы можете запускать код с этим ключом, чтобы увидеть, сколько работы потребуется для переноса кода на 3.0. Значение этого ключа доступно в коде Python как логическая переменная `sys.py3kwarning`, а в коде расширений C – как `Py_Py3kWarningFlag`.3637> **См. также**38>39> Серия PEP 3*xxx*, содержащая предложения для Python 3.0. [**PEP 3000**](https://python-all.ru/3.12/whatsnew/2.6.html) описывает процесс разработки Python 3.0. Начните с [**PEP 3100**](https://python-all.ru/3.12/whatsnew/2.6.html), в котором описаны общие цели для Python 3.0, а затем изучите PEP с более высокими номерами, предлагающие конкретные возможности.4041## Изменения в процессе разработки4243Во время разработки 2.6 процесс разработки Python претерпел два существенных изменения: мы перешли с системы отслеживания ошибок SourceForge на настраиваемую установку Roundup, а документация была преобразована из LaTeX в reStructuredText.4445### Новая система отслеживания ошибок: Roundup4647Долгое время разработчики Python были всё более недовольны системой отслеживания ошибок SourceForge. Решение SourceForge, предоставляемое как услуга, не допускает значительной настройки; например, невозможно было настроить жизненный цикл задач.4849Поэтому комитет по инфраструктуре Python Software Foundation объявил конкурс на системы отслеживания ошибок, попросив добровольцев настроить различные продукты и импортировать некоторые ошибки и патчи из SourceForge. Были рассмотрены четыре различные системы: [Jira](https://python-all.ru/3.12/whatsnew/2.6.html), [Launchpad](https://python-all.ru/3.12/whatsnew/2.6.html), [Roundup](https://python-all.ru/3.12/whatsnew/2.6.html) и [Trac](https://python-all.ru/3.12/whatsnew/2.6.html). В конечном итоге комитет остановился на Jira и Roundup как на двух кандидатах. Jira – коммерческий продукт, который бесплатно предоставляет размещённые экземпляры для проектов свободного программного обеспечения; Roundup – проект с открытым исходным кодом, требующий добровольцев для его администрирования и сервера для его размещения.5051После объявления призыва добровольцев была установлена новая установка Roundup по адресу [https://bugs.python.org](https://python-all.ru/3.12/whatsnew/2.6.html). Одна установка Roundup может обслуживать несколько систем отслеживания, и этот сервер теперь также размещает системы отслеживания ошибок для Jython и для веб-сайта Python. В будущем он, несомненно, найдёт и другое применение. Там, где это возможно, это издание «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.5253Хостинг системы отслеживания ошибок Python любезно предоставлен компанией [Upfront Systems](https://python-all.ru/3.12/whatsnew/2.6.html) из Стелленбоса, Южная Африка. Мартин фон Лёвис приложил много усилий для импорта существующих ошибок и патчей из SourceForge; его скрипты для этой операции импорта находятся по адресу `https://svn.python.org/view/tracker/importer/` и могут быть полезны другим проектам, желающим перейти с SourceForge на Roundup.5455> **См. также**56>57> **[https://bugs.python.org](https://python-all.ru/3.12/whatsnew/2.6.html)**58>59> Система отслеживания ошибок Python.60>61> **[https://bugs.jython.org](https://python-all.ru/3.12/whatsnew/2.6.html):**62>63> Система отслеживания ошибок Jython.64>65> **[https://roundup.sourceforge.io/](https://python-all.ru/3.12/whatsnew/2.6.html)**66>67> Загрузки и документация Roundup.68>69> **[https://svn.python.org/view/tracker/importer/](https://python-all.ru/3.12/whatsnew/2.6.html)**70>71> Сценарии преобразования Мартина фон Лёвиса.7273### Новый формат документации: reStructuredText с использованием Sphinx7475Документация Python писалась с использованием LaTeX с момента запуска проекта около 1989 года. В 1980-х и начале 1990-х большинство документации распечатывалось для последующего изучения, а не просматривалось онлайн. LaTeX широко использовался, поскольку он обеспечивал привлекательный печатный вывод, оставаясь при этом простым в написании после освоения основных правил разметки.7677Сегодня LaTeX всё ещё используется для написания публикаций, предназначенных для печати, но ландшафт инструментов программирования изменился. Мы больше не распечатываем кипы документации; вместо этого мы просматриваем её онлайн, и HTML стал самым важным форматом для поддержки. К сожалению, конвертация LaTeX в HTML довольно сложна, и Фред Л. Дрейк-младший, многолетний редактор документации Python, потратил много времени на поддержание процесса конвертации. Время от времени предлагали перевести документацию в SGML, а затем в XML, но выполнить хорошую конвертацию – большая задача, и никто не взял на себя необходимое для завершения работы время.7879В ходе цикла разработки 2.6 Георг Брандль приложил много усилий для создания нового инструментария для обработки документации. Полученный пакет называется Sphinx и доступен по адресу [https://www.sphinx-doc.org/](https://python-all.ru/3.12/whatsnew/2.6.html).8081Sphinx ориентируется на вывод HTML, создавая привлекательно оформленный и современный HTML; печатный вывод по-прежнему поддерживается через конвертацию в LaTeX. Входной формат – reStructuredText, синтаксис разметки с поддержкой пользовательских расширений и директив, широко используемый в сообществе Python.8283Sphinx – это самостоятельный пакет, который можно использовать для написания документации, и почти два десятка других проектов ([перечислены на веб-сайте Sphinx](https://python-all.ru/3.12/whatsnew/2.6.html)) приняли Sphinx в качестве своего инструмента документирования.8485> **См. также**86>87> **[Документирование Python](https://python-all.ru/3.12/whatsnew/2.6.html)**88>89> Описывает, как писать документацию для Python.90>91> **[Sphinx](https://python-all.ru/3.12/whatsnew/2.6.html)**92>93> Документация и код для инструментария Sphinx.94>95> **[Docutils](https://python-all.ru/3.12/whatsnew/2.6.html)**96>97> Базовый парсер reStructuredText и набор инструментов.9899## PEP 343: Оператор ‘with’100101Предыдущая версия, Python 2.5, добавила оператор ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’ как опциональную возможность, включаемую директивой `from __future__ import with_statement`. В версии 2.6 оператор больше не требует специального включения; это означает, что `with` теперь всегда является ключевым словом. Остальная часть этого раздела является копией соответствующего раздела из документа «What’s New in Python 2.5»; если вы знакомы с оператором ‘`with`’ из Python 2.5, можете пропустить этот раздел.102103Оператор ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’ делает код понятнее, который ранее использовал блоки `try...finally` для гарантии выполнения кода очистки. В этом разделе я расскажу об операторе в его обычном использовании. В следующем разделе я рассмотрю детали реализации и покажу, как писать объекты для использования с этим оператором.104105Оператор ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’ – это управляющая структура, базовая структура которой:106107```python108with expression [as variable]:109    with-block110```111112Выражение вычисляется, и в результате должен получиться объект, поддерживающий протокол управления контекстом (то есть имеющий методы [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__)).113114Метод [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) объекта вызывается перед выполнением *блока with* и поэтому может выполнять код настройки. Он также может возвращать значение, которое связывается с именем *переменная*, если оно указано. (Обратите внимание, что *переменная* *не* присваивается результат *выражения*.)115116После завершения выполнения *блока with* вызывается метод [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__) объекта, даже если блок вызвал исключение, и поэтому он может выполнить код очистки.117118Некоторые стандартные объекты Python теперь поддерживают протокол управления контекстом и могут использоваться с оператором ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’. Файловые объекты – один из примеров:119120```python121with open('/etc/passwd', 'r') as f:122    for line in f:123        print line124        ... more processing code ...125```126127После выполнения этого оператора файловый объект *f* будет автоматически закрыт, даже если цикл [`for`](https://python-all.ru/3.12/reference/compound_stmts.html#for) вызвал исключение в середине блока.128129> **Примечание**130>131> В этом случае *f* – это тот же объект, созданный [`open()`](https://python-all.ru/3.12/library/functions.html#open), потому что [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) возвращает *self*.132133Блокировки и переменные условия модуля [`threading`](https://python-all.ru/3.12/library/threading.html#module-threading) также поддерживают оператор ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’:134135```python136lock = threading.Lock()137with lock:138    # Критическая секция кода139    ...140```141142Блокировка захватывается перед выполнением блока и всегда освобождается после завершения блока.143144Функция `localcontext()` в модуле [`decimal`](https://python-all.ru/3.12/library/decimal.html#module-decimal) упрощает сохранение и восстановление текущего десятичного контекста, который инкапсулирует желаемые характеристики точности и округления для вычислений:145146```python147from decimal import Decimal, Context, localcontext148149# Отображается с точностью по умолчанию в 28 знаков150v = Decimal('578')151print v.sqrt()152153with localcontext(Context(prec=16)):154    # Весь код в этом блоке использует точность в 16 знаков.155    # Исходный контекст восстанавливается при выходе из блока.156    print v.sqrt()157```158159### Написание контекстных менеджеров160161Под капотом оператор ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’ довольно сложен. Большинство людей будут использовать ‘`with`’ только с существующими объектами и не нуждаются в знании этих деталей, поэтому вы можете пропустить остальную часть этого раздела, если захотите. Авторам новых объектов потребуется понять детали базовой реализации, и им стоит продолжить чтение.162163Объяснение протокола управления контекстом на высоком уровне:164165- Выражение вычисляется и должно дать объект, называемый «контекстный менеджер». Контекстный менеджер должен иметь методы [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__).166- Вызывается метод [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) контекстного менеджера. Возвращённое значение присваивается *VAR*. Если конструкция `as VAR` отсутствует, значение просто игнорируется.167- Код внутри *блока* выполняется.168- Если *блок* вызывает исключение, метод [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__) контекстного менеджера вызывается с тремя аргументами: сведениями об исключении (`type, value, traceback`, те же значения, которые возвращает [`sys.exc_info()`](https://python-all.ru/3.12/library/sys.html#sys.exc_info), а также могут быть `None`, если исключение не произошло). Возвращаемое значение метода определяет, будет ли исключение возбуждено повторно: любое ложное значение вызывает повторное возбуждение, а `True` приведёт к его подавлению. Подавлять исключение нужно редко, потому что если это сделать, автор кода, содержащего оператор '[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)', никогда не узнает, что что-то пошло не так.169- Если *блок* не вызвал исключения, метод [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__) всё равно вызывается, но *type*, *value* и *traceback* равны `None`.170171Рассмотрим пример. Мы не будем приводить подробный код, а лишь в общих чертах опишем методы, необходимые для базы данных, поддерживающей транзакции.172173(Для тех, кто не знаком с терминологией баз данных: набор изменений в базе данных группируется в транзакцию. Транзакции могут быть либо зафиксированы (committed) – это означает, что все изменения записаны в базу данных, либо откачены (rolled back) – что означает, что все изменения отменены, а база данных не изменена. За дополнительной информацией обращайтесь к любому учебнику по базам данных.)174175Предположим, что существует объект, представляющий подключение к базе данных. Наша цель – позволить пользователю написать такой код:176177```python178db_connection = DatabaseConnection()179with db_connection as cursor:180    cursor.execute('insert into ...')181    cursor.execute('delete from ...')182    # ... дополнительные операции ...183```184185Транзакция должна быть зафиксирована, если код в блоке выполняется без ошибок, или откачена, если возникает исключение. Вот базовый интерфейс для `DatabaseConnection`, который мы будем предполагать:186187```python188class DatabaseConnection:189    # Интерфейс базы данных190    def cursor(self):191        "Returns a cursor object and starts a new transaction"192    def commit(self):193        "Commits current transaction"194    def rollback(self):195        "Rolls back current transaction"196```197198Метод [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__) довольно прост: ему нужно только начать новую транзакцию. В данном приложении результирующий объект курсора будет полезным результатом, поэтому метод вернёт его. Затем пользователь может добавить `as cursor` к своему оператору '[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)', чтобы привязать курсор к имени переменной.199200```python201class DatabaseConnection:202    ...203    def __enter__(self):204        # Код для запуска новой транзакции205        cursor = self.cursor()206        return cursor207```208209Метод [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__) – самый сложный, потому что именно в нём должна выполняться большая часть работы. Метод должен проверить, произошло ли исключение. Если исключения не было, транзакция фиксируется. Если было – откатывается.210211В приведённом ниже коде выполнение просто дойдёт до конца функции, вернув значение по умолчанию `None`. Значение `None` ложно, поэтому исключение будет автоматически возбуждено повторно. При желании можно сделать это более явно и добавить оператор [`return`](https://python-all.ru/3.12/reference/simple_stmts.html#return) в отмеченном месте.212213```python214class DatabaseConnection:215    ...216    def __exit__(self, type, value, tb):217        if tb is None:218            # Исключения нет, поэтому фиксация219            self.commit()220        else:221            # Произошло исключение, поэтому откат222            self.rollback()223            # return False224```225226### Модуль contextlib227228Модуль [`contextlib`](https://python-all.ru/3.12/library/contextlib.html#module-contextlib) предоставляет несколько функций и декоратор, которые полезны при написании объектов для использования с оператором '[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)'.229230Декоратор называется `contextmanager()` и позволяет написать одну функцию-генератор вместо определения нового класса. Генератор должен генерировать ровно одно значение. Код до [`yield`](https://python-all.ru/3.12/reference/simple_stmts.html#yield) будет выполнен как метод [`__enter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__enter__), а сгенерированное значение станет возвращаемым значением метода, которое будет связано с переменной в конструкции `as` оператора ‘[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)’, если она присутствует. Код после `yield` будет выполнен в методе [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__). Любое исключение, возникшее в блоке, будет возбуждено оператором `yield`.231232Используя этот декоратор, наш пример с базой данных из предыдущего раздела можно было бы записать так:233234```python235from contextlib import contextmanager236237@contextmanager238def db_transaction(connection):239    cursor = connection.cursor()240    try:241        yield cursor242    except:243        connection.rollback()244        raise245    else:246        connection.commit()247248db = DatabaseConnection()249with db_transaction(db) as cursor:250    ...251```252253Модуль [`contextlib`](https://python-all.ru/3.12/library/contextlib.html#module-contextlib) также содержит функцию `nested(mgr1, mgr2, ...)`, которая объединяет несколько контекстных менеджеров, чтобы не приходилось писать вложенные операторы '[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)'. В этом примере один оператор '`with`' одновременно запускает транзакцию базы данных и захватывает блокировку потока:254255```python256lock = threading.Lock()257with nested (db_transaction(db), lock) as (cursor, locked):258    ...259```260261Наконец, функция `closing()` возвращает свой аргумент, чтобы его можно было привязать к переменной, и вызывает метод `.close()` переданного аргумента в конце блока.262263```python264import urllib, sys265from contextlib import closing266267with closing(urllib.urlopen('http://www.yahoo.com')) as f:268    for line in f:269        sys.stdout.write(line)270```271272> **См. также**273>274> **[**PEP 343**](https://python-all.ru/3.12/whatsnew/2.6.html) – Оператор «with»**275>276> PEP написан Гвидо ван Россумом и Ником Когланом; реализован Майком Бландом, Гвидо ван Россумом и Нилом Норвицем. В PEP показан код, генерируемый для оператора '[`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with)', что может быть полезно для понимания того, как работает этот оператор.277>278> Документация для модуля [`contextlib`](https://python-all.ru/3.12/library/contextlib.html#module-contextlib).279280## PEP 366: Явные относительные импорты из главного модуля281282Параметр командной строки [`-m`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-m) Python позволяет запускать модуль как скрипт. Когда вы запускали модуль, находящийся внутри пакета, относительные импорты работали некорректно.283284Исправление для Python 2.6 добавляет атрибут [`module.__package__`](https://python-all.ru/3.12/reference/datamodel.html#module.__package__). Когда этот атрибут присутствует, относительные импорты будут выполняться относительно его значения, а не атрибута [`__name__`](https://python-all.ru/3.12/reference/datamodel.html#module.__name__).285286Импортёры в стиле PEP 302 могут затем устанавливать [`__package__`](https://python-all.ru/3.12/reference/datamodel.html#module.__package__) по мере необходимости. Модуль [`runpy`](https://python-all.ru/3.12/library/runpy.html#module-runpy), реализующий параметр [`-m`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-m), теперь делает это, так что относительные импорты теперь будут корректно работать в скриптах, запускаемых изнутри пакета.287288## PEP 370: Персональный каталог `site-packages`289290При запуске Python путь поиска модулей `sys.path` обычно включает каталог, путь к которому заканчивается на `"site-packages"`. Этот каталог предназначен для хранения локально установленных пакетов, доступных всем пользователям данной машины или конкретной установки сайта.291292Python 2.6 вводит соглашение о каталогах site, специфичных для пользователя. Каталог зависит от платформы:293294- Unix и Mac OS X: `~/.local/`295- Windows: `%APPDATA%/Python`296297Внутри этого каталога будут подкаталоги, зависящие от версии, например `lib/python2.6/site-packages` в Unix/Mac OS и `Python26/site-packages` в Windows.298299Если стандартный каталог не устраивает, его можно переопределить с помощью переменной окружения. [`PYTHONUSERBASE`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONUSERBASE) задаёт корневой каталог, используемый всеми версиями Python, поддерживающими эту возможность. В Windows каталог для данных приложений можно изменить, установив переменную окружения `APPDATA`. Также можно изменить файл `site.py` для вашей установки Python.300301Эту возможность можно полностью отключить, запустив Python с параметром [`-s`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-s) или установив переменную окружения [`PYTHONNOUSERSITE`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONNOUSERSITE).302303> **См. также**304>305> **[**PEP 370**](https://python-all.ru/3.12/whatsnew/2.6.html) – Персональный каталог `site-packages`**306>307> PEP написан и реализован Кристианом Хеймсом.308309## PEP 371: `multiprocessing` Пакет310311Новый пакет [`multiprocessing`](https://python-all.ru/3.12/library/multiprocessing.html#module-multiprocessing) позволяет программам Python создавать новые процессы, которые будут выполнять вычисления и возвращать результат родительскому процессу. Родительский и дочерние процессы могут обмениваться данными через очереди и каналы, синхронизировать свои операции с помощью блокировок и семафоров, а также совместно использовать простые массивы данных.312313Модуль [`multiprocessing`](https://python-all.ru/3.12/library/multiprocessing.html#module-multiprocessing) изначально был точной эмуляцией модуля [`threading`](https://python-all.ru/3.12/library/threading.html#module-threading), использующей процессы вместо потоков. Эта цель была отброшена на пути к Python 2.6, но общий подход модуля остаётся похожим. Основным классом является `Process`, которому передаётся вызываемый объект и набор аргументов. Метод `start()` запускает вызываемый объект в подпроцессе, после чего можно вызвать метод `is_alive()`, чтобы проверить, работает ли подпроцесс, и метод `join()`, чтобы дождаться завершения процесса.314315Вот простой пример, где подпроцесс вычисляет факториал. Функция, выполняющая вычисление, написана так, что она работает значительно дольше, когда входной аргумент кратен 4.316317```python318import time319from multiprocessing import Process, Queue320321def factorial(queue, N):322    "Compute a factorial."323    # Если N кратно 4, эта функция будет выполняться намного дольше324    if (N % 4) == 0:325        time.sleep(.05 * N/4)326327    # Вычислить результат328    fact = 1L329    for i in range(1, N+1):330        fact = fact * i331332    # Поместить результат в очередь333    queue.put(fact)334335if __name__ == '__main__':336    queue = Queue()337338    N = 5339340    p = Process(target=factorial, args=(queue, N))341    p.start()342    p.join()343344    result = queue.get()345    print 'Factorial', N, '=', result346```347348Для передачи результата вычисления факториала используется [`Queue`](https://python-all.ru/3.12/library/queue.html#queue.Queue). Объект [`Queue`](https://python-all.ru/3.12/library/queue.html#queue.Queue) хранится в глобальной переменной. Дочерний процесс будет использовать значение переменной на момент своего создания; поскольку это [`Queue`](https://python-all.ru/3.12/library/queue.html#queue.Queue), родительский и дочерний процессы могут обмениваться данными через этот объект. (Если бы родитель изменил значение глобальной переменной, значение дочернего процесса не изменилось бы, и наоборот.)349350Два других класса, `Pool` и `Manager`, предоставляют интерфейсы более высокого уровня. `Pool` создаёт фиксированное количество рабочих процессов, и запросы затем можно распределять между рабочими процессами с помощью вызова `apply()` или `apply_async()` для добавления одного запроса и [`map()`](https://python-all.ru/3.12/library/functions.html#map) или `map_async()` для добавления нескольких запросов. В следующем коде используется `Pool` для распределения запросов по 5 рабочим процессам и получения списка результатов:351352```python353from multiprocessing import Pool354355def factorial(N, dictionary):356    "Compute a factorial."357    ...358p = Pool(5)359result = p.map(factorial, range(1, 1000, 10))360for v in result:361    print v362```363364Это даёт следующий вывод:365366```python36713683991680036951090942171709440000370822283865417792281772556288000000037133452526613163807108170062053440751665152000000000372...373```374375Другой интерфейс высокого уровня, класс `Manager`, создаёт отдельный серверный процесс, который может хранить главные копии структур данных Python. Другие процессы затем могут получать доступ и изменять эти структуры данных с помощью прокси-объектов. В следующем примере создаётся общий словарь вызовом метода [`dict()`](https://python-all.ru/3.12/library/stdtypes.html#dict); рабочие процессы затем вставляют значения в словарь. (Блокировка не выполняется автоматически, что в данном примере не имеет значения. Методы `Manager` также включают `Lock()`, `RLock()`, и `Semaphore()` для создания общих блокировок.)376377```python378import time379from multiprocessing import Pool, Manager380381def factorial(N, dictionary):382    "Compute a factorial."383    # Вычислить результат384    fact = 1L385    for i in range(1, N+1):386        fact = fact * i387388    # Сохранить результат в словаре389    dictionary[N] = fact390391if __name__ == '__main__':392    p = Pool(5)393    mgr = Manager()394    d = mgr.dict()         # Создать общий словарь395396    # Запустить задачи с помощью пула397    for N in range(1, 1000, 10):398        p.apply_async(factorial, (N, d))399400    # Отметить пул как закрытый – больше задач добавить нельзя401    p.close()402403    # Ожидать завершения задач404    p.join()405406    # Вывести результаты407    for k, v in sorted(d.items()):408        print k, v409```410411Это выведет следующий результат:412413```python4141 141511 3991680041621 5109094217170944000041731 822283865417792281772556288000000041841 3345252661316380710817006205344075166515200000000041951 15511187532873822802242430164693032110632597200169861120000...420```421422> **См. также**423>424> Документация модуля [`multiprocessing`](https://python-all.ru/3.12/library/multiprocessing.html#module-multiprocessing).425>426> **[**PEP 371**](https://python-all.ru/3.12/whatsnew/2.6.html) – Добавление пакета multiprocessing**427>428> PEP написан Джесси Ноллером и Ричардом Удкерком; реализован Ричардом Удкерком и Джесси Ноллером.429430## PEP 3101: Расширенное форматирование строк431432В Python 3.0 оператор `%` дополнен более мощным методом форматирования строк [`format()`](https://python-all.ru/3.12/library/functions.html#format). Поддержка метода [`str.format()`](https://python-all.ru/3.12/library/stdtypes.html#str.format) была перенесена в Python 2.6.433434В Python 2.6 как 8-битные, так и Unicode-строки имеют метод `.format()`, который рассматривает строку как шаблон и принимает аргументы для форматирования. Шаблон форматирования использует фигурные скобки (`{`, `}`) в качестве специальных символов:435436```python437>>> # Подставить позиционный аргумент 0 в строку438>>> "User ID: {0}".format("root")439'User ID: root'440>>> # Использовать именованные аргументы-ключевые слова441>>> "User ID: {uid}   Last seen: {last_login}".format(442...    uid="root",443...    last_login = "5 Mar 2008 07:20")444'User ID: root   Last seen: 5 Mar 2008 07:20'445```446447Фигурные скобки можно экранировать, удваивая их:448449```python450>>> "Empty dict: {{}}".format()451"Empty dict: {}"452```453454Имена полей могут быть целыми числами, указывающими на позиционные аргументы, например `{0}`, `{1}` и т.д., или именами именованных аргументов. Также можно указывать составные имена полей, которые читают атрибуты или получают доступ к ключам словаря:455456```python457>>> import sys458>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)459Platform: darwin460Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)461[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'462463>>> import mimetypes464>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)465'Content-type: video/mp4'466```467468Обратите внимание, что при использовании нотации в стиле словаря, такой как `[.mp4]`, не нужно заключать строку в кавычки; будет выполнено обращение к значению по ключу `.mp4`. Строки, начинающиеся с цифры, будут преобразованы в целое число. В строке формата нельзя писать более сложные выражения.469470До сих пор мы показывали, как указать, какое поле подставить в результирующую строку. Точное форматирование также можно контролировать, добавляя двоеточие и спецификатор формата. Например:471472```python473>>> # Поле 0: выравнивание влево, заполнить до 15 символов474>>> # Поле 1: выравнивание вправо, заполнить до 6 символов475>>> fmt = '{0:15} ${1:>6}'476>>> fmt.format('Registration', 35)477'Registration    $    35'478>>> fmt.format('Tutorial', 50)479'Tutorial        $    50'480>>> fmt.format('Banquet', 125)481'Banquet         $   125'482```483484Спецификаторы формата могут ссылаться на другие поля через вложение:485486```python487>>> fmt = '{0:{1}}'488>>> width = 15489>>> fmt.format('Invoice #1234', width)490'Invoice #1234  '491>>> width = 35492>>> fmt.format('Invoice #1234', width)493'Invoice #1234                      '494```495496Выравнивание поля в заданной ширине можно указать:497498| Символ | Эффект |499| --- | --- |500| \< (по умолчанию) | Выравнивание влево |501| \> | Выравнивание вправо |502| ^ | По центру |503| = | (Только для числовых типов) Заполнение после знака. |504505Спецификаторы формата также могут включать тип представления, который управляет форматированием значения. Например, числа с плавающей запятой могут быть отформатированы как обычное число или в экспоненциальной нотации:506507```python508>>> '{0:g}'.format(3.75)509'3.75'510>>> '{0:e}'.format(3.75)511'3.750000e+00'512```513514Доступны различные типы представления. Обратитесь к документации Python 2.6 за [полным списком](https://python-all.ru/3.12/library/string.html#formatstrings); вот пример:515516| `b` | Двоичный. Выводит число по основанию 2. |517| --- | --- |518| `c` | Символьный. Преобразует целое число в соответствующий символ Unicode перед выводом. |519| `d` | Десятичное целое. Выводит число в системе с основанием 10. |520| `o` | Восьмеричный формат. Выводит число в системе с основанием 8. |521| `x` | Шестнадцатеричный. Выводит число по основанию 16, используя строчные буквы для цифр старше 9. |522| `e` | Экспоненциальная запись. Выводит число в научной нотации с использованием буквы 'e' для обозначения экспоненты. |523| `g` | Общий формат. Выводит число в формате с фиксированной точкой, если только число не слишком велико, в этом случае переключается на экспоненциальную нотацию 'e'. |524| `n` | Число. Аналогично 'g' (для чисел с плавающей запятой) или 'd' (для целых чисел), но с использованием текущей локали для вставки соответствующих разделителей разрядов. |525| `%` | Проценты. Умножает число на 100 и выводит в фиксированном формате ('f'), с последующим знаком процента. |526527Классы и типы могут определять метод `__format__()` для управления тем, как они форматируются. Он принимает единственный аргумент – спецификатор формата:528529```python530def __format__(self, format_spec):531    if isinstance(format_spec, unicode):532        return unicode(str(self))533    else:534        return str(self)535```536537Также существует встроенная функция [`format()`](https://python-all.ru/3.12/library/functions.html#format), которая форматирует одно значение. Она вызывает метод `__format__()` типа с переданным спецификатором:538539```python540>>> format(75.6564, '.2f')541'75.66'542```543544> **См. также**545>546> **[Синтаксис строк форматирования](https://python-all.ru/3.12/library/string.html#formatstrings)**547>548> Справочная документация по полям формата.549>550> **[**PEP 3101**](https://python-all.ru/3.12/whatsnew/2.6.html) - Расширенное форматирование строк**551>552> PEP написан Талином. Реализован Эриком Смитом.553554## PEP 3105: `print` как функция555556Оператор `print` в Python 3.0 становится функцией [`print()`](https://python-all.ru/3.12/library/functions.html#print). Превращение [`print()`](https://python-all.ru/3.12/library/functions.html#print) в функцию позволяет заменить эту функцию, написав `def print(...)` или импортировав новую функцию откуда-то ещё.557558В Python 2.6 есть импорт `__future__`, который удаляет `print` как синтаксис языка, позволяя вместо этого использовать функциональную форму. Например:559560```python561>>> from __future__ import print_function562>>> print('# of entries', len(dictionary), file=sys.stderr)563```564565Сигнатура новой функции:566567```python568def print(*args, sep=' ', end='\n', file=None)569```570571Параметры:572573- *args*: позиционные аргументы, значения которых будут выведены.574- *sep*: разделитель, который будет выводиться между аргументами.575- *end*: завершающий текст, который будет выведен после того, как все аргументы будут выведены.576- *file*: файловый объект, в который будет отправлен вывод.577578> **См. также**579>580> **[**PEP 3105**](https://python-all.ru/3.12/whatsnew/2.6.html) - Сделать print функцией**581>582> PEP написан Георгом Брандлом.583584## PEP 3110: Изменения в обработке исключений585586Одна ошибка, которую иногда допускают программисты Python, – написание следующего кода:587588```python589try:590    ...591except TypeError, ValueError:  # Неверно!592    ...593```594595Автор, вероятно, пытается перехватить оба исключения [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) и [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), но этот код на самом деле делает кое-что другое: он перехватит [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) и свяжет полученный объект исключения с локальным именем `"ValueError"`. Исключение [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) не будет перехвачено вообще. Правильный код задает кортеж исключений:596597```python598try:599    ...600except (TypeError, ValueError):601    ...602```603604Эта ошибка возникает из-за неоднозначности использования запятой: обозначает ли она два разных узла в дереве разбора или один узел, являющийся кортежем?605606Python 3.0 устраняет эту неоднозначность, заменяя запятую словом «as». Чтобы перехватить исключение и сохранить объект исключения в переменную `exc`, необходимо написать:607608```python609try:610    ...611except TypeError as exc:612    ...613```614615Python 3.0 будет поддерживать только использование «as» и, следовательно, интерпретирует первый пример как перехват двух разных исключений. Python 2.6 поддерживает как запятую, так и «as», поэтому существующий код продолжит работать. Поэтому рекомендуется использовать «as» при написании нового кода Python, который будет выполняться только в 2.6.616617> **См. также**618>619> **[**PEP 3110**](https://python-all.ru/3.12/whatsnew/2.6.html) - Перехват исключений в Python 3000**620>621> PEP написан и реализован Коллином Уинтером.622623## PEP 3112: Байтовые литералы624625Python 3.0 принимает Unicode в качестве основного строкового типа языка и обозначает 8-битные литералы иначе: либо как `b'string'`, либо с помощью конструктора [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes). Для обратной совместимости Python 2.6 добавляет [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) как синоним типа [`str`](https://python-all.ru/3.12/library/stdtypes.html#str), а также поддерживает нотацию `b''`.626627Тип [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) в 2.6 отличается от типа [`bytes`](https://python-all.ru/3.12/library/stdtypes.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.12/library/stdtypes.html#str) списка.628629Основное применение [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) в 2.6 будет заключаться в написании тестов типа объекта, таких как `isinstance(x, bytes)`. Это поможет конвертеру 2to3, который не может определить, предназначены ли строки в коде 2.x для содержания символов или 8-битных байтов; теперь можно использовать [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) или [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) для точного выражения намерения, и результирующий код также будет корректным в Python 3.0.630631Также существует импорт `__future__`, который приводит к тому, что все строковые литералы становятся строками Unicode. Это означает, что escape-последовательности `\u` можно использовать для включения символов Unicode:632633```python634from __future__ import unicode_literals635636s = ('\u751f\u3080\u304e\u3000\u751f\u3054'637     '\u3081\u3000\u751f\u305f\u307e\u3054')638639print len(s)               # 12 символов Unicode640```641642На уровне C Python 3.0 переименует существующий 8-битный строковый тип, называемый `PyStringObject` в Python 2.x, в [`PyBytesObject`](https://python-all.ru/3.12/c-api/bytes.html#c.PyBytesObject). Python 2.6 использует `#define` для поддержки использования имён [`PyBytesObject()`](https://python-all.ru/3.12/c-api/bytes.html#c.PyBytesObject), [`PyBytes_Check()`](https://python-all.ru/3.12/c-api/bytes.html#c.PyBytes_Check), [`PyBytes_FromStringAndSize()`](https://python-all.ru/3.12/c-api/bytes.html#c.PyBytes_FromStringAndSize) и всех остальных функций и макросов, используемых со строками.643644Экземпляры типа [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) неизменяемы, как и строки. Новый тип [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) хранит изменяемую последовательность байтов:645646```python647>>> bytearray([65, 66, 67])648bytearray(b'ABC')649>>> b = bytearray(u'\u21ef\u3244', 'utf-8')650>>> b651bytearray(b'\xe2\x87\xaf\xe3\x89\x84')652>>> b[0] = '\xe3'653>>> b654bytearray(b'\xe3\x87\xaf\xe3\x89\x84')655>>> unicode(str(b), 'utf-8')656u'\u31ef \u3244'657```658659Байтовые массивы поддерживают большинство методов строковых типов, таких как `startswith()`/`endswith()`, `find()`/`rfind()`, и некоторые методы списков, такие как `append()`, `pop()` и `reverse()`.660661```python662>>> b = bytearray('ABC')663>>> b.append('d')664>>> b.append(ord('e'))665>>> b666bytearray(b'ABCde')667```668669Существует также соответствующий C API с функциями [`PyByteArray_FromObject()`](https://python-all.ru/3.12/c-api/bytearray.html#c.PyByteArray_FromObject), [`PyByteArray_FromStringAndSize()`](https://python-all.ru/3.12/c-api/bytearray.html#c.PyByteArray_FromStringAndSize) и различными другими.670671> **См. также**672>673> **[**PEP 3112**](https://python-all.ru/3.12/whatsnew/2.6.html) - Байтовые литералы в Python 3000**674>675> PEP написан Джейсоном Орендорфом; портирован в 2.6 Кристианом Хаймсом.676677## PEP 3116: Новая библиотека ввода-вывода678679Встроенные файловые объекты Python поддерживают ряд методов, но файлоподобные объекты не обязательно поддерживают их все. Объекты, имитирующие файлы, обычно поддерживают `read()` и `write()`, но они могут не поддерживать [`readline()`](https://python-all.ru/3.12/library/readline.html#module-readline), например. Python 3.0 вводит многоуровневую библиотеку ввода-вывода в модуле [`io`](https://python-all.ru/3.12/library/io.html#module-io), которая отделяет буферизацию и обработку текста от основных операций чтения и записи.680681Модуль [`io`](https://python-all.ru/3.12/library/io.html#module-io) предоставляет три уровня абстрактных базовых классов:682683- `RawIOBase` определяет сырые операции ввода-вывода: `read()`, `readinto()`, `write()`, `seek()`, `tell()`, `truncate()` и `close()`. Большинство методов этого класса часто соответствуют одному системному вызову. Также есть методы `readable()`, `writable()` и `seekable()` для определения того, какие операции разрешены для данного объекта.684685  Python 3.0 имеет конкретные реализации этого класса для файлов и сокетов, но Python 2.6 не перестраивал свои файловые объекты и сокеты таким образом.686- `BufferedIOBase` – это абстрактный базовый класс, который буферизует данные в памяти, чтобы уменьшить количество используемых системных вызовов, делая обработку ввода-вывода более эффективной. Он поддерживает все методы `RawIOBase` и добавляет атрибут `raw`, содержащий базовый сырой объект.687688  Существует пять конкретных классов, реализующих этот ABC. `BufferedWriter` и `BufferedReader` предназначены для объектов, поддерживающих только запись или только чтение и имеющих метод `seek()` для произвольного доступа. Объекты `BufferedRandom` поддерживают чтение и запись в одном и том же базовом потоке, а `BufferedRWPair` – для таких объектов, как TTY, у которых операции чтения и записи действуют на несвязанные потоки данных. Класс `BytesIO` поддерживает чтение, запись и позиционирование в буфере в памяти.689- `TextIOBase`: Предоставляет функции для чтения и записи строк (помните, что в Python 3.0 строки будут в Unicode) и поддерживает [универсальные символы новой строки](https://python-all.ru/3.12/glossary.html#term-universal-newlines). `TextIOBase` определяет метод [`readline()`](https://python-all.ru/3.12/library/readline.html#module-readline) и поддерживает итерацию по объектам.690691  Существует две конкретные реализации. `TextIOWrapper` оборачивает буферизованный объект ввода-вывода, поддерживая все методы для текстового ввода-вывода и добавляя атрибут `buffer` для доступа к нижележащему объекту. `StringIO` просто буферизует все в памяти, никогда ничего не записывая на диск.692693  (В Python 2.6 [`io.StringIO`](https://python-all.ru/3.12/library/io.html#io.StringIO) реализован на чистом Python, поэтому он довольно медленный. Поэтому пока лучше придерживаться существующего модуля `StringIO` или `cStringIO`. В какой-то момент модуль [`io`](https://python-all.ru/3.12/library/io.html#module-io) Python 3.0 будет переписан на C для ускорения, и, возможно, реализация на C будет портирована на версии 2.x.)694695В Python 2.6 базовые реализации не были перестроены поверх классов модуля [`io`](https://python-all.ru/3.12/library/io.html#module-io). Модуль предоставляется для упрощения написания кода, совместимого с будущими версиями (3.0), и для избавления разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.696697> **См. также**698>699> **[**PEP 3116**](https://python-all.ru/3.12/whatsnew/2.6.html) - Новый ввод-вывод**700>701> PEP написан Дэниелом Штуцбахом, Майком Вердоне и Гвидо ван Россумом. Код – Гвидо ван Россум, Георг Брандль, Вальтер Дёрвальд, Джереми Хилтон, Мартин фон Лёвис, Тони Лаундс и другие.702703## PEP 3118: Пересмотренный буферный протокол704705Буферный протокол – это C-уровневый API, который позволяет типам Python обмениваться указателями на свои внутренние представления. Например, файл, отображенный в память, можно рассматривать как буфер символов, и это позволяет другому модулю, например [`re`](https://python-all.ru/3.12/library/re.html#module-re), обрабатывать такие файлы как строку символов для поиска.706707Основными пользователями буферного протокола являются пакеты для численных расчетов, такие как NumPy, которые предоставляют доступ к внутреннему представлению массивов, чтобы вызывающие могли записывать данные напрямую в массив, а не через более медленный API. Данный PEP обновляет буферный протокол с учетом опыта разработки NumPy, добавляя ряд новых возможностей, таких как указание формы массива или блокировка области памяти.708709Важнейшая новая функция C API – `PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)`, которая принимает объект и набор флагов и заполняет структуру `Py_buffer` информацией о представлении памяти объекта. Объекты могут использовать эту операцию для блокировки памяти на месте, пока внешний вызывающий может изменять содержимое, поэтому существует соответствующая `PyBuffer_Release(Py_buffer *view)`, чтобы указать, что внешний вызывающий завершил работу.710711Аргумент *flags* для [`PyObject_GetBuffer()`](https://python-all.ru/3.12/c-api/buffer.html#c.PyObject_GetBuffer) задает ограничения на возвращаемую память. Вот несколько примеров:712713- [`PyBUF_WRITABLE`](https://python-all.ru/3.12/c-api/buffer.html#c.PyBUF_WRITABLE) указывает, что память должна быть доступна для записи.714- `PyBUF_LOCK` запрашивает блокировку только для чтения или исключительную блокировку памяти.715- [`PyBUF_C_CONTIGUOUS`](https://python-all.ru/3.12/c-api/buffer.html#c.PyBUF_C_CONTIGUOUS) и [`PyBUF_F_CONTIGUOUS`](https://python-all.ru/3.12/c-api/buffer.html#c.PyBUF_F_CONTIGUOUS) запрашивают C-непрерывный (последнее измерение изменяется быстрее всего) или Fortran-непрерывный (первое измерение изменяется быстрее всего) макет массива.716717Два новых кода аргументов для [`PyArg_ParseTuple()`](https://python-all.ru/3.12/c-api/arg.html#c.PyArg_ParseTuple), `s*` и `z*`, возвращают заблокированные буферные объекты для параметра.718719> **См. также**720>721> **[**PEP 3118**](https://python-all.ru/3.12/whatsnew/2.6.html) - Пересмотр буферного протокола**722>723> PEP написан Трэвисом Олифантом и Карлом Бэнксом; реализован Трэвисом Олифантом.724725## PEP 3119: Абстрактные базовые классы726727Некоторые объектно-ориентированные языки, такие как Java, поддерживают интерфейсы, объявляя, что класс имеет определенный набор методов или поддерживает определенный протокол доступа. Абстрактные базовые классы (ABC) – это аналогичная возможность для Python. Поддержка ABC состоит из модуля [`abc`](https://python-all.ru/3.12/library/abc.html#module-abc), содержащего метакласс `ABCMeta`, специальной обработки этого метакласса встроенными функциями [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.12/library/functions.html#issubclass), а также набора базовых ABC, которые, по мнению разработчиков Python, будут широко полезны. Будущие версии Python, вероятно, добавят больше ABC.728729Допустим, у вас есть некий класс, и вы хотите узнать, поддерживает ли он доступ в стиле словаря. Однако фраза «в стиле словаря» расплывчата. Вероятно, это означает, что доступ к элементам через `obj[1]` работает. Подразумевает ли это, что установка элементов через `obj[2] = value` работает? Или что объект будет иметь методы `keys()`, `values()` и `items()`? А как насчёт итеративных вариантов, таких как `iterkeys()`? [`copy()`](https://python-all.ru/3.12/library/copy.html#module-copy) и `update()`? Итерация по объекту с помощью [`iter()`](https://python-all.ru/3.12/library/functions.html#iter)?730731Модуль [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections) в Python 2.6 включает несколько различных ABC, которые представляют эти различия. `Iterable` указывает, что класс определяет `__iter__()`, а `Container` означает, что класс определяет метод `__contains__()` и, следовательно, поддерживает выражения `x in y`. Базовый интерфейс словаря (получение элементов, установка элементов, и `keys()`, `values()` и `items()`) определяется `MutableMapping` ABC.732733Можно наследовать свои классы от конкретной ABC, чтобы указать, что они поддерживают интерфейс этой ABC:734735```python736import collections737738class Storage(collections.MutableMapping):739    ...740```741742Альтернативно, можно написать класс без наследования от нужной ABC и вместо этого зарегистрировать класс, вызвав метод `register()` этой ABC:743744```python745import collections746747class Storage:748    ...749750collections.MutableMapping.register(Storage)751```752753Для классов, которые вы пишете, наследование от ABC, вероятно, понятнее. Метод `register()` полезен, когда вы написали новую ABC, которая может описывать существующий тип или класс, или если хотите объявить, что некоторый сторонний класс реализует ABC. Например, если определена ABC `PrintableType`, допустимо сделать:754755```python756# Зарегистрировать типы Python757PrintableType.register(int)758PrintableType.register(float)759PrintableType.register(str)760```761762Классы должны следовать семантике, заданной ABC, но Python не может это проверить; автор класса должен сам понять требования ABC и реализовать код соответствующим образом.763764Чтобы проверить, поддерживает ли объект определённый интерфейс, можно теперь написать:765766```python767def func(d):768    if not isinstance(d, collections.MutableMapping):769        raise ValueError("Mapping object expected, not %r" % d)770```771772Не думайте, что теперь нужно начинать писать множество проверок, как в примере выше. У Python сложилась сильная традиция утиной типизации, где явная проверка типов никогда не выполняется, а код просто вызывает методы объекта, полагаясь, что эти методы существуют, и возбуждает исключение, если их нет. Будьте осмотрительны при проверке ABC и делайте это только в случае крайней необходимости.773774Можно создавать собственные ABC, используя `abc.ABCMeta` в качестве метакласса в определении класса:775776```python777from abc import ABCMeta, abstractmethod778779class Drawable():780    __metaclass__ = ABCMeta781782    @abstractmethod783    def draw(self, x, y, scale=1.0):784        pass785786    def draw_doubled(self, x, y):787        self.draw(x, y, scale=2.0)788789class Square(Drawable):790    def draw(self, x, y, scale):791        ...792```793794В приведённой выше ABC `Drawable` метод `draw_doubled()` отображает объект в двойном размере и может быть реализован на основе других методов, описанных в `Drawable`. Поэтому классы, реализующие эту ABC, не обязаны предоставлять собственную реализацию `draw_doubled()`, хотя могут это сделать. Однако реализация `draw()` обязательна; ABC не может предоставить полезную общую реализацию.795796Можно применить декоратор `@abstractmethod` к методам, таким как `draw()`, которые должны быть реализованы; тогда Python будет возбуждать исключение для классов, не определяющих этот метод. Обратите внимание: исключение возбуждается только при попытке создать экземпляр подкласса, в котором отсутствует метод:797798```python799>>> class Circle(Drawable):800...     pass801...802>>> c = Circle()803Traceback (most recent call last):804  File "<stdin>", line 1, in <module>805TypeError: Can't instantiate abstract class Circle with abstract methods draw806>>>807```808809Абстрактные атрибуты данных можно объявить с помощью декоратора `@abstractproperty`:810811```python812from abc import abstractproperty813...814815@abstractproperty816def readonly(self):817   return self._x818```819820Подклассы тогда должны определить свойство `readonly()`.821822> **См. также**823>824> **[**PEP 3119**](https://python-all.ru/3.12/whatsnew/2.6.html) – Введение абстрактных базовых классов**825>826> PEP написан Гвидо ван Россумом и Талином. Реализован Гвидо ван Россумом. Портирован в 2.6 Бенджамином Арангуреном при участии Алекса Мартелли.827828## PEP 3127: Поддержка и синтаксис целочисленных литералов829830Python 3.0 изменяет синтаксис восьмеричных (основание 8) целочисленных литералов, добавляя префикс «0o» или «0O» вместо ведущего нуля, а также добавляет поддержку двоичных (основание 2) целочисленных литералов с префиксом «0b» или «0B».831832Python 2.6 не отказывается от поддержки ведущего нуля для восьмеричных чисел, но добавляет поддержку «0o» и «0b»:833834```python835>>> 0o21, 2*8 + 1836(17, 17)837>>> 0b10111183847839```840841Встроенная функция [`oct()`](https://python-all.ru/3.12/library/functions.html#oct) по-прежнему возвращает числа с ведущим нулём, а новая встроенная функция [`bin()`](https://python-all.ru/3.12/library/functions.html#bin) возвращает двоичное представление числа:842843```python844>>> oct(42)845'052'846>>> future_builtins.oct(42)847'0o52'848>>> bin(173)849'0b10101101'850```851852Встроенные функции [`int()`](https://python-all.ru/3.12/library/functions.html#int) и `long()` теперь принимают префиксы «0o» и «0b» при запросе основания 8 или 2, а также когда аргумент *base* равен нулю (что указывает на то, что используемое основание должно быть определено из строки):853854```python855>>> int ('0o52', 0)85642857>>> int('1101', 2)85813859>>> int('0b1101', 2)86013861>>> int('0b1101', 0)86213863```864865> **См. также**866>867> **[**PEP 3127**](https://python-all.ru/3.12/whatsnew/2.6.html) – Поддержка и синтаксис целочисленных литералов**868>869> PEP написан Патриком Мопином; портирован в 2.6 Эриком Смитом.870871## PEP 3129: Декораторы классов872873Декораторы были расширены с функций на классы. Теперь допустимо написать:874875```python876@foo877@bar878class A:879  pass880```881882Это эквивалентно:883884```python885class A:886  pass887888A = foo(bar(A))889```890891> **См. также**892>893> **[**PEP 3129**](https://python-all.ru/3.12/whatsnew/2.6.html) - Декораторы классов**894>895> PEP написан Коллином Уинтером.896897## PEP 3141: Иерархия типов для чисел898899Python 3.0 добавляет несколько абстрактных базовых классов для числовых типов, вдохновлённых числовой башней Scheme. Эти классы были портированы в 2.6 как модуль [`numbers`](https://python-all.ru/3.12/library/numbers.html#module-numbers).900901Самая общая ABC – это `Number`. Она не определяет никаких операций и существует только для того, чтобы можно было проверить, является ли объект числом, с помощью `isinstance(obj, Number)`.902903`Complex` является подклассом `Number`. Комплексные числа могут подвергаться основным операциям: сложению, вычитанию, умножению, делению и возведению в степень; также можно получить действительную и мнимую части и взять сопряжённое число. Встроенный тип complex в Python – это реализация `Complex`.904905`Real` далее наследует от `Complex` и добавляет операции, которые работают только с действительными числами: `floor()`, `trunc()`, округление, взятие остатка по модулю N, целочисленное деление, и сравнения.906907Числа `Rational` наследуют от `Real`, имеют свойства `numerator` и `denominator` и могут быть преобразованы в числа с плавающей запятой. Python 2.6 добавляет простой класс рациональных чисел `Fraction` в модуле [`fractions`](https://python-all.ru/3.12/library/fractions.html#module-fractions). (Он называется `Fraction` вместо `Rational`, чтобы избежать конфликта имён с [`numbers.Rational`](https://python-all.ru/3.12/library/numbers.html#numbers.Rational).)908909Числа `Integral` наследуют от `Rational` и могут сдвигаться влево и вправо с помощью `<<` и `>>`, комбинироваться с использованием побитовых операций, таких как `&` и `|`, и могут использоваться в качестве индексов массивов и границ срезов.910911В Python 3.0 PEP слегка переопределяет существующие встроенные функции [`round()`](https://python-all.ru/3.12/library/functions.html#round), [`math.floor()`](https://python-all.ru/3.12/library/math.html#math.floor), [`math.ceil()`](https://python-all.ru/3.12/library/math.html#math.ceil) и добавляет новую – [`math.trunc()`](https://python-all.ru/3.12/library/math.html#math.trunc), которая была портирована в Python 2.6. [`math.trunc()`](https://python-all.ru/3.12/library/math.html#math.trunc) округляет к нулю, возвращая ближайшее `Integral`, которое находится между аргументом функции и нулём.912913> **См. также**914>915> **[**PEP 3141**](https://python-all.ru/3.12/whatsnew/2.6.html) – Иерархия типов для чисел**916>917> PEP написан Джеффри Яскиным.918>919> [Числовая башня Scheme](https://python-all.ru/3.12/whatsnew/2.6.html) из руководства по Guile.920>921> [Типы чисел Scheme](https://python-all.ru/3.12/whatsnew/2.6.html) из спецификации R5RS Scheme.922923### Модуль [`fractions`](https://python-all.ru/3.12/library/fractions.html#module-fractions)924925Чтобы дополнить иерархию числовых типов, модуль [`fractions`](https://python-all.ru/3.12/library/fractions.html#module-fractions) предоставляет класс рациональных чисел. Рациональные числа хранят свои значения в виде числителя и знаменателя, образующих дробь, и могут точно представлять такие числа, как `2/3`, которые числа с плавающей запятой могут лишь аппроксимировать.926927Конструктор `Fraction` принимает два значения `Integral`, которые будут числителем и знаменателем результирующей дроби.928929```python930>>> from fractions import Fraction931>>> a = Fraction(2, 3)932>>> b = Fraction(2, 5)933>>> float(a), float(b)934(0.66666666666666663, 0.40000000000000002)935>>> a+b936Fraction(16, 15)937>>> a/b938Fraction(5, 3)939```940941Для преобразования чисел с плавающей запятой в рациональные тип float теперь имеет метод `as_integer_ratio()`, который возвращает числитель и знаменатель дроби, равной тому же значению с плавающей запятой:942943```python944>>> (2.5) .as_integer_ratio()945(5, 2)946>>> (3.1415) .as_integer_ratio()947(7074029114692207L, 2251799813685248L)948>>> (1./3) .as_integer_ratio()949(6004799503160661L, 18014398509481984L)950```951952Обратите внимание: значения, которые могут быть лишь аппроксимированы числами с плавающей запятой, например 1./3, не упрощаются до аппроксимируемого числа; дробь пытается соответствовать значению с плавающей запятой **в точности**.953954Модуль [`fractions`](https://python-all.ru/3.12/library/fractions.html#module-fractions) основан на реализации Сьорда Мюллендера, которая долгое время находилась в каталоге Python `Demo/classes/`. Джеффри Яскин существенно обновил эту реализацию.955956## Прочие изменения языка957958Некоторые небольшие изменения, внесённые в ядро языка Python:959960- Каталоги и zip-архивы, содержащие файл `__main__.py`, теперь можно выполнять напрямую, передавая их имя интерпретатору. Каталог или zip-архив автоматически вставляется как первая запись в sys.path. (Предложение и начальный патч от Энди Чу, впоследствии доработан Филиппом Дж. Иби и Ником Когланом; [bpo-1739468](https://python-all.ru/3.12/whatsnew/2.6.html).)961- Функция [`hasattr()`](https://python-all.ru/3.12/library/functions.html#hasattr) перехватывала и игнорировала все ошибки, полагая, что они означают, что метод `__getattr__()` потерпел неудачу, и поэтому возвращаемое значение [`hasattr()`](https://python-all.ru/3.12/library/functions.html#hasattr) будет `False`. Однако эту логику не следует применять к [`KeyboardInterrupt`](https://python-all.ru/3.12/library/exceptions.html#KeyboardInterrupt) и [`SystemExit`](https://python-all.ru/3.12/library/exceptions.html#SystemExit); Python 2.6 больше не будет отбрасывать такие исключения, когда [`hasattr()`](https://python-all.ru/3.12/library/functions.html#hasattr) с ними сталкивается. (Исправлено Бенджамином Петерсоном; [bpo-2196](https://python-all.ru/3.12/whatsnew/2.6.html).)962- При вызове функции с использованием синтаксиса `**` для передачи именованных аргументов больше не требуется использовать словарь Python; теперь подойдёт любое отображение:963964  ```python965  >>> def f(**kw):966  ...    print sorted(kw)967  ...968  >>> ud=UserDict.UserDict()969  >>> ud['a'] = 1970  >>> ud['b'] = 'string'971  >>> f(**ud)972  ['a', 'b']973  ```974975  (Автор: Александр Белопольский; [bpo-1686487](https://python-all.ru/3.12/whatsnew/2.6.html).)976977  Также стало допустимо передавать именованные аргументы после аргумента `*args` при вызове функции.978979  ```python980  >>> def f(*args, **kw):981  ...     print args, kw982  ...983  >>> f(1,2,3, *(4,5,6), keyword=13)984  (1, 2, 3, 4, 5, 6) {'keyword': 13}985  ```986987  Ранее это вызывало бы синтаксическую ошибку. (Автор: Амори Форжео д’Арк; [bpo-3473](https://python-all.ru/3.12/whatsnew/2.6.html).)988- Новая встроенная функция `next(iterator, [default])` возвращает следующий элемент из указанного итератора. Если передан аргумент *default*, он будет возвращён, если *iterator* исчерпан; в противном случае будет возбуждено исключение [`StopIteration`](https://python-all.ru/3.12/library/exceptions.html#StopIteration). (Портировано в [bpo-2719](https://python-all.ru/3.12/whatsnew/2.6.html).)989- Кортежи теперь имеют методы `index()` и `count()`, соответствующие методам списков `index()` и `count()`:990991  ```python992  >>> t = (0,1,2,3,4,0,1,2)993  >>> t.index(3)994  3995  >>> t.count(0)996  2997  ```998999  (Автор: Рэймонд Хеттингер)1000- Встроенные типы теперь имеют улучшенную поддержку расширенного синтаксиса срезов, принимая различные комбинации `(start, stop, step)`. Ранее поддержка была частичной, и некоторые крайние случаи не работали. (Реализовано Томасом Воутерсом.)1001- Свойства теперь имеют три атрибута: `getter`, `setter` и `deleter`, которые являются декораторами, предоставляющими удобные сокращения для добавления функции получения, установки или удаления к существующему свойству. Используются они так:10021003  ```python1004  class C(object):1005      @property1006      def x(self):1007          return self._x10081009      @x.setter1010      def x(self, value):1011          self._x = value10121013      @x.deleter1014      def x(self):1015          del self._x10161017  class D(C):1018      @C.x.getter1019      def x(self):1020          return self._x * 210211022      @x.setter1023      def x(self, value):1024          self._x = value / 21025  ```1026- Несколько методов встроенных типов множеств теперь принимают несколько итерируемых объектов: `intersection()`, `intersection_update()`, `union()`, `update()`, `difference()` и `difference_update()`.10271028  ```python1029  >>> s=set('1234567890')1030  >>> s.intersection('abc123', 'cdf246')  # Пересечение всех входных данных1031  set(['2'])1032  >>> s.difference('246', '789')1033  set(['1', '0', '3', '5'])1034  ```10351036  (Автор: Raymond Hettinger.)1037- Было добавлено много функций для чисел с плавающей запятой. Функция [`float()`](https://python-all.ru/3.12/library/functions.html#float) теперь преобразует строку `nan` в значение NaN (не число) по стандарту IEEE 754, а `+inf` и `-inf` – в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Автор: Кристиан Хаймс; [bpo-1635](https://python-all.ru/3.12/whatsnew/2.6.html).)10381039  Другие функции модуля [`math`](https://python-all.ru/3.12/library/math.html#module-math), `isinf()` и `isnan()`, возвращают true, если их аргумент с плавающей запятой является бесконечностью или NaN. ([bpo-1640](https://python-all.ru/3.12/whatsnew/2.6.html))10401041  Были добавлены функции преобразования чисел с плавающей запятой в шестнадцатеричные строки ([bpo-3008](https://python-all.ru/3.12/whatsnew/2.6.html)). Эти функции преобразуют числа с плавающей запятой в строковое представление и обратно, не внося ошибок округления, возникающих при преобразовании между десятичной и двоичной системами. Числа с плавающей запятой имеют метод [`hex()`](https://python-all.ru/3.12/library/functions.html#hex), возвращающий строковое представление, а метод `float.fromhex()` преобразует строку обратно в число:10421043  ```python1044  >>> a = 3.751045  >>> a.hex()1046  '0x1.e000000000000p+1'1047  >>> float.fromhex('0x1.e000000000000p+1')1048  3.751049  >>> b=1./31050  >>> b.hex()1051  '0x1.5555555555555p-2'1052  ```1053- Числовая тонкость: при создании комплексного числа из двух чисел с плавающей запятой в системах, поддерживающих знаковые нули (-0 и +0), конструктор [`complex()`](https://python-all.ru/3.12/library/functions.html#complex) теперь сохраняет знак нуля. (Исправлено Марком Т. Дикинсоном; [bpo-1507](https://python-all.ru/3.12/whatsnew/2.6.html).)1054- Классы, наследующие метод `__hash__()` от родительского класса, могут установить `__hash__ = None`, чтобы указать, что класс не является хешируемым. Это заставит `hash(obj)` возбуждать [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError), и класс не будет помечен как реализующий абстрактный базовый класс `Hashable`.10551056  Это следует делать, когда вы определили метод `__cmp__()` или `__eq__()`, который сравнивает объекты по значению, а не по идентичности. Все объекты имеют метод хеширования по умолчанию, использующий `id(obj)` в качестве хеш-значения. Нет аккуратного способа удалить метод `__hash__()`, унаследованный от родительского класса, поэтому присваивание `None` было реализовано как переопределение. На уровне C расширения могут установить `tp_hash` в [`PyObject_HashNotImplemented()`](https://python-all.ru/3.12/c-api/object.html#c.PyObject_HashNotImplemented). (Исправлено Ником Когланом и Амори Форжео д’Арк; [bpo-2235](https://python-all.ru/3.12/whatsnew/2.6.html).)1057- Исключение [`GeneratorExit`](https://python-all.ru/3.12/library/exceptions.html#GeneratorExit) теперь является подклассом [`BaseException`](https://python-all.ru/3.12/library/exceptions.html#BaseException) вместо [`Exception`](https://python-all.ru/3.12/library/exceptions.html#Exception). Это означает, что обработчик исключений, выполняющий `except Exception:`, не будет случайно перехватывать [`GeneratorExit`](https://python-all.ru/3.12/library/exceptions.html#GeneratorExit). (Автор: Чад Остин; [bpo-1537](https://python-all.ru/3.12/whatsnew/2.6.html).)1058- Объекты-генераторы теперь имеют атрибут `gi_code`, который ссылается на исходный объект кода, лежащий в основе генератора. (Автор: Коллин Уинтер; [bpo-1473257](https://python-all.ru/3.12/whatsnew/2.6.html).)1059- Встроенная функция [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) теперь принимает как именованные, так и позиционные аргументы. (Автор: Thomas Wouters; [bpo-1444529](https://python-all.ru/3.12/whatsnew/2.6.html).)1060- Конструктор [`complex()`](https://python-all.ru/3.12/library/functions.html#complex) теперь принимает строки, содержащие комплексные числа в скобках, то есть `complex(repr(cplx))` теперь будет сохранять значения при преобразовании. Например, `complex('(3+4j)')` теперь возвращает значение (3+4j). ([bpo-1491866](https://python-all.ru/3.12/whatsnew/2.6.html))1061- Строковый метод `translate()` теперь принимает `None` в качестве параметра таблицы перевода, который рассматривается как тождественное преобразование. Это упрощает выполнение операций, которые только удаляют символы. (Автор: Bengt Richter, реализация: Raymond Hettinger; [bpo-1193128](https://python-all.ru/3.12/whatsnew/2.6.html).)1062- Встроенная функция [`dir()`](https://python-all.ru/3.12/library/functions.html#dir) теперь проверяет наличие метода `__dir__()` у получаемых объектов. Этот метод должен возвращать список строк с именами допустимых атрибутов объекта и позволяет объекту управлять значением, которое возвращает [`dir()`](https://python-all.ru/3.12/library/functions.html#dir). Объекты, у которых есть методы `__getattr__()` или `__getattribute__()`, могут использовать это для объявления псевдоатрибутов, которые они будут поддерживать. ([bpo-1591665](https://python-all.ru/3.12/whatsnew/2.6.html))1063- У объектов методов экземпляра появились новые атрибуты для объекта и функции, составляющих метод; новый синоним для `im_self` – [`__self__`](https://python-all.ru/3.12/reference/datamodel.html#method.__self__), а `im_func` также доступен как [`__func__`](https://python-all.ru/3.12/reference/datamodel.html#method.__func__). Старые имена по-прежнему поддерживаются в Python 2.6, но удалены в 3.0.1064- Малоизвестное изменение: при использовании функции [`locals()`](https://python-all.ru/3.12/library/functions.html#locals) внутри инструкции [`class`](https://python-all.ru/3.12/reference/compound_stmts.html#class) результирующий словарь больше не возвращает свободные переменные. (В данном случае свободные переменные – это переменные, на которые ссылается инструкция `class`, но которые не являются атрибутами класса.)10651066### Оптимизации10671068- Модуль [`warnings`](https://python-all.ru/3.12/library/warnings.html#module-warnings) переписан на C. Это позволяет вызывать предупреждения из парсера, а также может ускорить запуск интерпретатора. (Авторы: Neal Norwitz и Brett Cannon; [bpo-1631171](https://python-all.ru/3.12/whatsnew/2.6.html).)1069- Объекты типов теперь имеют кеш методов, который сокращает работу по поиску правильной реализации метода для конкретного класса; после кеширования интерпретатору не нужно обходить базовые классы, чтобы определить, какой метод вызвать. Кеш очищается при изменении базового класса или самого класса, поэтому он должен оставаться корректным даже в условиях динамической природы Python. (Оригинальная оптимизация реализована Armin Rigo, обновлена для Python 2.6 Kevin Jacobs; [bpo-1700288](https://python-all.ru/3.12/whatsnew/2.6.html).)10701071  По умолчанию это изменение применяется только к типам, входящим в ядро Python. Модули расширения могут быть несовместимы с этим кешем, поэтому они должны явно добавить `Py_TPFLAGS_HAVE_VERSION_TAG` в поле `tp_flags` модуля, чтобы включить кеш методов. (Для совместимости с кешем методов код модуля расширения не должен напрямую обращаться и изменять член `tp_dict` ни одного из реализуемых им типов. Большинство модулей так не делают, но интерпретатор Python не может это определить. См. [bpo-1878](https://python-all.ru/3.12/whatsnew/2.6.html) для обсуждения.)1072- Вызовы функций с именованными аргументами стали значительно быстрее за счет быстрого сравнения указателей, что обычно экономит время полного сравнения строк. (Автор: Raymond Hettinger, на основе первоначальной реализации Antoine Pitrou; [bpo-1819](https://python-all.ru/3.12/whatsnew/2.6.html).)1073- Все функции модуля [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct) переписаны на C благодаря работе на спринте Need For Speed. (Автор: Raymond Hettinger.)1074- Некоторые стандартные встроенные типы теперь устанавливают бит в своих объектах типа. Это ускоряет проверку, является ли объект подклассом одного из этих типов. (Автор: Neal Norwitz.)1075- Строки Unicode теперь используют более быстрый код для обнаружения пробелов и разрывов строк; это ускоряет метод `split()` примерно на 25%, а `splitlines()` на 35%. (Автор: Antoine Pitrou.) Использование памяти уменьшено за счет применения pymalloc для данных строки Unicode.1076- Инструкция `with` теперь сохраняет метод [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__) в стеке, что дает небольшое ускорение. (Реализовано Jeffrey Yasskin.)1077- Для уменьшения использования памяти сборщик мусора теперь очищает внутренние списки свободных блоков при сборке мусора самого старшего поколения объектов. Это может вернуть память операционной системе быстрее.10781079### Изменения в интерпретаторе10801081Два параметра командной строки зарезервированы для других реализаций Python. Ключ [`-J`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-J) зарезервирован для Jython для специфических опций Jython, таких как ключи, передаваемые базовой JVM. [`-X`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-X) зарезервирован для опций, специфичных для конкретной реализации Python, такой как CPython, Jython или IronPython. Если любой из этих параметров используется с Python 2.6, интерпретатор сообщит, что параметр в настоящее время не используется.10821083Теперь можно запретить Python записывать файлы `.pyc` или `.pyo`, указав ключ [`-B`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-B) интерпретатору Python или установив переменную окружения [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Эта настройка доступна программам Python как переменная `sys.dont_write_bytecode`, и код Python может изменить значение, чтобы изменить поведение интерпретатора. (Авторы: Neal Norwitz и Georg Brandl.)10841085Кодировку, используемую для стандартного ввода, вывода и ошибок, можно задать, установив переменную окружения [`PYTHONIOENCODING`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONIOENCODING) перед запуском интерпретатора. Значение должно быть строкой вида `<encoding>` или `<encoding>:<errorhandler>`. Часть *encoding* задает имя кодировки, например `utf-8` или `latin-1`; необязательная часть *errorhandler* указывает, что делать с символами, которые не может обработать кодировка, и должна быть одним из значений: “error”, “ignore” или “replace”. (Автор: Martin von Löwis.)10861087## Новые и улучшенные модули10881089Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее заметных изменений, отсортированный по имени модуля в алфавитном порядке. Обратитесь к файлу `Misc/NEWS` в дереве исходного кода для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.10901091- Модули `asyncore` и `asynchat` снова активно поддерживаются, и был применен ряд патчей и исправлений ошибок. (Поддерживаются Josiah Carlson; см. [bpo-1736190](https://python-all.ru/3.12/whatsnew/2.6.html) для одного из патчей.)1092- У модуля `bsddb` также новый сопровождающий – Jesús Cea Avión, и пакет теперь доступен как отдельный пакет. Веб-страница пакета: [www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/3.12/whatsnew/2.6.html). Планируется удалить пакет из стандартной библиотеки в Python 3.0, поскольку частота его релизов намного выше, чем у Python.10931094  Модуль `bsddb.dbshelve` теперь использует самый высокий доступный протокол сериализации вместо ограничения протоколом 1. (Автор: W. Barnes.)1095- Модуль [`cgi`](https://python-all.ru/3.12/library/cgi.html#module-cgi) теперь будет читать переменные из строки запроса HTTP POST. Это позволяет использовать действия форм с URL, содержащими строки запроса, например “/cgi-bin/add.py?category=1”. (Авторы: Alexandre Fiori и Nubis; [bpo-1817](https://python-all.ru/3.12/whatsnew/2.6.html).)10961097  Функции `parse_qs()` и `parse_qsl()` перемещены из модуля [`cgi`](https://python-all.ru/3.12/library/cgi.html#module-cgi) в модуль [`urlparse`](https://python-all.ru/3.12/library/urllib.parse.html#module-urllib.parse). Версии, все еще доступные в модуле `cgi`, будут вызывать сообщения [`PendingDeprecationWarning`](https://python-all.ru/3.12/library/exceptions.html#PendingDeprecationWarning) в версии 2.6 ([bpo-600362](https://python-all.ru/3.12/whatsnew/2.6.html)).1098- Модуль [`cmath`](https://python-all.ru/3.12/library/cmath.html#module-cmath) подвергся значительной доработке, авторы – Mark Dickinson и Christian Heimes. Было добавлено пять новых функций:10991100  - `polar()` преобразует комплексное число в полярную форму, возвращая модуль и аргумент комплексного числа.1101  - `rect()` делает обратное, преобразуя пару (модуль, аргумент) обратно в соответствующее комплексное число.1102  - `phase()` возвращает аргумент (также называемый углом) комплексного числа.1103  - `isnan()` возвращает True, если либо действительная, либо мнимая часть его аргумента является NaN.1104  - `isinf()` возвращает True, если вещественная или мнимая часть его аргумента бесконечна.11051106  Правки также повысили численную надёжность модуля [`cmath`](https://python-all.ru/3.12/library/cmath.html#module-cmath). Для всех функций вещественная и мнимая части результатов, где только возможно, точны в пределах нескольких единиц наименьшей точности (ulps). Подробности – на [bpo-1381](https://python-all.ru/3.12/whatsnew/2.6.html). Также исправлены разрезы ветвей для `asinh()`, `atanh()` и `atan()`.11071108  Тесты для модуля были существенно расширены; почти 2000 новых тестов проверяют алгебраические функции.11091110  На платформах IEEE 754 модуль [`cmath`](https://python-all.ru/3.12/library/cmath.html#module-cmath) теперь обрабатывает специальные значения IEEE 754 и исключения с плавающей запятой в соответствии с приложением G стандарта C99.1111- Новый тип данных в модуле [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections): `namedtuple(typename, fieldnames)` – это фабричная функция, создающая подклассы стандартного кортежа, поля которого доступны как по имени, так и по индексу. Например:11121113  ```python1114  >>> var_type = collections.namedtuple('variable',1115  ...             'id name type size')1116  >>> # Имена разделяются пробелами или запятыми1117  >>> # 'id, name, type, size' также будет работать1118  >>> var_type._fields1119  ('id', 'name', 'type', 'size')11201121  >>> var = var_type(1, 'frequency', 'int', 4)1122  >>> print var[0], var.id    # Эквивалентно1123  1 11124  >>> print var[2], var.type  # Эквивалентно1125  int int1126  >>> var._asdict()1127  {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}1128  >>> v2 = var._replace(name='amplitude')1129  >>> v21130  variable(id=1, name='amplitude', type='int', size=4)1131  ```11321133  Несколько мест в стандартной библиотеке, которые возвращали кортежи, были изменены, чтобы возвращать экземпляры `namedtuple()`. Например, метод `Decimal.as_tuple()` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11341135  (Автор: Raymond Hettinger.)1136- Ещё одно изменение в модуле [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections): тип `deque` теперь поддерживает необязательный параметр *maxlen*; если он указан, размер дека будет ограничен не более чем *maxlen* элементами. Добавление новых элементов в заполненный дек приводит к отбрасыванию старых.11371138  ```python1139  >>> from collections import deque1140  >>> dq=deque(maxlen=3)1141  >>> dq1142  deque([], maxlen=3)1143  >>> dq.append(1); dq.append(2); dq.append(3)1144  >>> dq1145  deque([1, 2, 3], maxlen=3)1146  >>> dq.append(4)1147  >>> dq1148  deque([2, 3, 4], maxlen=3)1149  ```11501151  (Автор: Raymond Hettinger.)1152- Объекты [`Morsel`](https://python-all.ru/3.12/library/http.cookies.html#http.cookies.Morsel) модуля [`Cookie`](https://python-all.ru/3.12/library/http.cookies.html#module-http.cookies) теперь поддерживают атрибут [`httponly`](https://python-all.ru/3.12/library/http.cookies.html#http.cookies.Morsel.httponly). В некоторых браузерах куки с установленным этим атрибутом не могут быть прочитаны или изменены через JavaScript. (Автор: Arvin Schnell; [bpo-1638033](https://python-all.ru/3.12/whatsnew/2.6.html).)1153- Новый метод окна в модуле [`curses`](https://python-all.ru/3.12/library/curses.html#module-curses), `chgat()`, изменяет атрибуты отображения для заданного количества символов на одной строке. (Автор: Fabian Kreutz.)11541155  ```python1156  # Текст жирным шрифтом, начинающийся с y=0, x=211157  # и влияющий на остальную часть строки1158  stdscr.chgat(0, 21, curses.A_BOLD)1159  ```11601161  Класс `Textbox` в модуле [`curses.textpad`](https://python-all.ru/3.12/library/curses.html#module-curses.textpad) теперь поддерживает редактирование как в режиме вставки, так и в режиме замены. Режим вставки включается передачей истинного значения параметру *insert\_mode* при создании экземпляра `Textbox`.1162- Методы `strftime()` модуля [`datetime`](https://python-all.ru/3.12/library/datetime.html#module-datetime) теперь поддерживают код формата `%f`, который раскрывается в количество микросекунд в объекте, дополненное нулями слева до шести знаков. (Автор: Skip Montanaro; [bpo-1158](https://python-all.ru/3.12/whatsnew/2.6.html).)1163- Модуль [`decimal`](https://python-all.ru/3.12/library/decimal.html#module-decimal) был обновлён до версии 1.66 [Общей спецификации десятичных чисел](https://python-all.ru/3.12/whatsnew/2.6.html). Новые возможности включают некоторые методы для базовых математических функций, таких как `exp()` и `log10()`:11641165  ```python1166  >>> Decimal(1).exp()1167  Decimal("2.718281828459045235360287471")1168  >>> Decimal("2.7182818").ln()1169  Decimal("0.9999999895305022877376682436")1170  >>> Decimal(1000).log10()1171  Decimal("3")1172  ```11731174  Метод `as_tuple()` объектов `Decimal` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.11751176  (Реализовано Facundo Batista и Mark Dickinson. Поддержка именованных кортежей добавлена Raymond Hettinger.)1177- Класс `SequenceMatcher` модуля [`difflib`](https://python-all.ru/3.12/library/difflib.html#module-difflib) теперь возвращает именованные кортежи, представляющие совпадения, с атрибутами `a`, `b` и `size`. (Автор: Raymond Hettinger.)1178- В конструктор класса [`ftplib.FTP`](https://python-all.ru/3.12/library/ftplib.html#ftplib.FTP), а также в метод `connect()` был добавлен необязательный параметр `timeout`, задающий тайм-аут в секундах. (Добавлено Facundo Batista.) Кроме того, методы `storbinary()` и `storlines()` класса `FTP` теперь принимают необязательный параметр *колбэк*, который будет вызываться с каждым блоком данных после его отправки. (Автор: Phil Schwartz; [bpo-1221598](https://python-all.ru/3.12/whatsnew/2.6.html).)1179- Встроенная функция `reduce()` также доступна в модуле [`functools`](https://python-all.ru/3.12/library/functools.html#module-functools). В Python 3.0 встроенная функция была удалена, и `reduce()` доступна только из [`functools`](https://python-all.ru/3.12/library/functools.html#module-functools); в настоящее время планов по удалению встроенной функции в серии 2.x нет. (Патч от Christian Heimes; [bpo-1739906](https://python-all.ru/3.12/whatsnew/2.6.html).)1180- Там, где возможно, модуль [`getpass`](https://python-all.ru/3.12/library/getpass.html#module-getpass) теперь использует `/dev/tty` для вывода приглашения и чтения пароля, возвращаясь к стандартному потоку ошибок и стандартному вводу. Если пароль может быть выведен на терминал, перед отображением приглашения выводится предупреждение. (Автор: Gregory P. Smith.)1181- Функция [`glob.glob()`](https://python-all.ru/3.12/library/glob.html#glob.glob) теперь может возвращать имена файлов в Юникоде, если был указан путь в Юникоде и в каталоге есть файлы с такими именами. ([bpo-1001604](https://python-all.ru/3.12/whatsnew/2.6.html))1182- Новая функция в модуле [`heapq`](https://python-all.ru/3.12/library/heapq.html#module-heapq), `merge(iter1, iter2, ...)`, принимает произвольное количество итерируемых объектов, возвращающих данные в отсортированном порядке, и возвращает новый генератор, который выдает содержимое всех итераторов, также в отсортированном порядке. Например:11831184  ```python1185  >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))1186  [1, 2, 3, 5, 8, 9, 16]1187  ```11881189  Ещё одна новая функция, `heappushpop(heap, item)`, помещает элемент *item* в кучу *heap*, а затем извлекает и возвращает наименьший элемент. Это эффективнее, чем последовательный вызов `heappush()` и `heappop()`.11901191  [`heapq`](https://python-all.ru/3.12/library/heapq.html#module-heapq) теперь реализовано с использованием только сравнения «меньше», а не «меньше или равно», как было раньше. Это приводит использование [`heapq`](https://python-all.ru/3.12/library/heapq.html#module-heapq) типа в соответствие с методом [`list.sort()`](https://python-all.ru/3.12/library/stdtypes.html#list.sort). (Автор: Raymond Hettinger.)1192- В конструкторы классов [`httplib.HTTPConnection`](https://python-all.ru/3.12/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.12/library/http.client.html#http.client.HTTPSConnection) был добавлен необязательный параметр `timeout`, задающий тайм-аут в секундах. (Добавлено Facundo Batista.)1193- Большинство функций модуля [`inspect`](https://python-all.ru/3.12/library/inspect.html#module-inspect), таких как `getmoduleinfo()` и `getargs()`, теперь возвращают именованные кортежи. В дополнение к поведению кортежа элементы возвращаемого значения также могут быть доступны как атрибуты. (Автор: Raymond Hettinger.)11941195  Некоторые новые функции в модуле включают `isgenerator()`, `isgeneratorfunction()` и `isabstract()`.1196- Модуль [`itertools`](https://python-all.ru/3.12/library/itertools.html#module-itertools) получил несколько новых функций.11971198  `izip_longest(iter1, iter2, ...[, fillvalue])` создает кортежи из каждого из элементов; если некоторые итерируемые объекты короче других, недостающие значения устанавливаются в *fillvalue*. Например:11991200  ```python1201  >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))1202  ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))1203  ```12041205  `product(iter1, iter2, ..., [repeat=N])` возвращает декартово произведение переданных итерируемых объектов – набор кортежей, содержащих все возможные комбинации элементов, возвращённых из каждого итерируемого объекта.12061207  ```python1208  >>> list(itertools.product([1,2,3], [4,5,6]))1209  [(1, 4), (1, 5), (1, 6),1210   (2, 4), (2, 5), (2, 6),1211   (3, 4), (3, 5), (3, 6)]1212  ```12131214  Необязательный именованный аргумент *repeat* используется для вычисления произведения итерируемого объекта или набора итерируемых объектов самих на себя, повторённого *N* раз. С одним итерируемым аргументом возвращаются кортежи из *N* элементов:12151216  ```python1217  >>> list(itertools.product([1,2], repeat=3))1218  [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),1219   (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]1220  ```12211222  С двумя итерируемыми объектами возвращаются кортежи из *2N* элементов.12231224  ```python1225  >>> list(itertools.product([1,2], [3,4], repeat=2))1226  [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),1227   (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),1228   (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),1229   (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]1230  ```12311232  `combinations(iterable, r)` возвращает подпоследовательности длины *r* из элементов *итерируемого объекта*.12331234  ```python1235  >>> list(itertools.combinations('123', 2))1236  [('1', '2'), ('1', '3'), ('2', '3')]1237  >>> list(itertools.combinations('123', 3))1238  [('1', '2', '3')]1239  >>> list(itertools.combinations('1234', 3))1240  [('1', '2', '3'), ('1', '2', '4'),1241   ('1', '3', '4'), ('2', '3', '4')]1242  ```12431244  `permutations(iter[, r])` возвращает все перестановки длины *r* из элементов итерируемого объекта. Если *r* не указан, по умолчанию берётся количество элементов, возвращаемых итерируемым объектом.12451246  ```python1247  >>> list(itertools.permutations([1,2,3,4], 2))1248  [(1, 2), (1, 3), (1, 4),1249   (2, 1), (2, 3), (2, 4),1250   (3, 1), (3, 2), (3, 4),1251   (4, 1), (4, 2), (4, 3)]1252  ```12531254  `itertools.chain(*iterables)` – существующая функция в [`itertools`](https://python-all.ru/3.12/library/itertools.html#module-itertools), получившая новый конструктор в Python 2.6. `itertools.chain.from_iterable(iterable)` принимает единственный итерируемый объект, который должен возвращать другие итерируемые объекты. Затем `chain()` возвращает все элементы первого итерируемого объекта, затем все элементы второго и так далее.12551256  ```python1257  >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))1258  [1, 2, 3, 4, 5, 6]1259  ```12601261  (Всё добавлено Рэймондом Хеттингером.)1262- Класс `FileHandler` модуля [`logging`](https://python-all.ru/3.12/library/logging.html#module-logging) и его подклассы `WatchedFileHandler`, `RotatingFileHandler`, и `TimedRotatingFileHandler` теперь имеют необязательный параметр *delay* в своих конструкторах. Если *delay* истинно, открытие файла журнала откладывается до первого вызова `emit()`. (Добавлено Винаем Саджипом.)12631264  `TimedRotatingFileHandler` также имеет параметр конструктора *utc*. Если аргумент истинен, время UTC будет использоваться для определения момента полуночи и генерации имён файлов; в противном случае будет использоваться местное время.1265- В модуль [`math`](https://python-all.ru/3.12/library/math.html#module-math) было добавлено несколько новых функций:12661267  - [`isinf()`](https://python-all.ru/3.12/library/math.html#math.isinf) и [`isnan()`](https://python-all.ru/3.12/library/math.html#math.isnan) определяют, является ли заданное число с плавающей запятой бесконечностью (положительной или отрицательной) или NaN (Not a Number), соответственно.1268  - [`copysign()`](https://python-all.ru/3.12/library/math.html#math.copysign) копирует знаковый бит числа IEEE 754, возвращая абсолютное значение *x*, объединённое со знаковым битом *y*. Например, `math.copysign(1, -0.0)` возвращает -1.0. (Добавлено Кристианом Хаймсом.)1269  - [`factorial()`](https://python-all.ru/3.12/library/math.html#math.factorial) вычисляет факториал числа. (Добавлено Рэймондом Хеттингером; [bpo-2138](https://python-all.ru/3.12/whatsnew/2.6.html).)1270  - [`fsum()`](https://python-all.ru/3.12/library/math.html#math.fsum) суммирует поток чисел из итерируемого объекта, стараясь избежать потери точности за счёт использования частичных сумм. (Добавлено Жаном Брауэрсом, Рэймондом Хеттингером и Марком Дикинсоном; [bpo-2819](https://python-all.ru/3.12/whatsnew/2.6.html).)1271  - [`acosh()`](https://python-all.ru/3.12/library/math.html#math.acosh), [`asinh()`](https://python-all.ru/3.12/library/math.html#math.asinh) и [`atanh()`](https://python-all.ru/3.12/library/math.html#math.atanh) вычисляют обратные гиперболические функции.1272  - [`log1p()`](https://python-all.ru/3.12/library/math.html#math.log1p) возвращает натуральный логарифм от *1+x* (по основанию *e*).1273  - `trunc()` округляет число в сторону нуля, возвращая ближайшее `Integral`, которое находится между аргументом функции и нулём. Добавлено в рамках обратного портирования [иерархии типов чисел из PEP 3141](https://python-all.ru/3.12/whatsnew/2.6.html#pep-3141).1274- Модуль [`math`](https://python-all.ru/3.12/library/math.html#module-math) был улучшен для более согласованного поведения на разных платформах, особенно в отношении обработки исключений с плавающей запятой и специальных значений IEEE 754.12751276  По возможности модуль следует рекомендациям стандарта C99 относительно специальных значений 754. Например, `sqrt(-1.)` теперь должно давать [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) почти на всех платформах, в то время как `sqrt(float('NaN'))` должно возвращать NaN на всех платформах, поддерживающих IEEE 754. Там, где приложение F стандарта C99 рекомендует сигнализировать «деление на ноль» или «недопустимая операция», Python возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError). Там, где приложение F рекомендует сигнализировать «переполнение», Python возбуждает [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError). (См. [bpo-711019](https://python-all.ru/3.12/whatsnew/2.6.html) и [bpo-1640](https://python-all.ru/3.12/whatsnew/2.6.html).)12771278  (Добавлено Кристианом Хаймсом и Марком Дикинсоном.)1279- Объекты [`mmap`](https://python-all.ru/3.12/library/mmap.html#mmap.mmap) теперь имеют метод `rfind()`, который ищет подстроку, начиная с конца строки и двигаясь назад. Метод `find()` также получил параметр *end*, задающий индекс, на котором следует остановить поиск. (Добавлено Джоном Лентоном.)1280- Модуль [`operator`](https://python-all.ru/3.12/library/operator.html#module-operator) получил функцию `methodcaller()`, которая принимает имя и необязательный набор аргументов, возвращая вызываемый объект, который будет вызывать именованную функцию с любыми переданными аргументами. Например:12811282  ```python1283  >>> # Эквивалентно lambda s: s.replace('old', 'new')1284  >>> replacer = operator.methodcaller('replace', 'old', 'new')1285  >>> replacer('old wine in old bottles')1286  'new wine in new bottles'1287  ```12881289  (Добавлено Георгом Брандлом по предложению Грегори Петросяна.)12901291  Функция `attrgetter()` теперь принимает имена с точками и выполняет соответствующий поиск атрибутов:12921293  ```python1294  >>> inst_name = operator.attrgetter(1295  ...        '__class__.__name__')1296  >>> inst_name('')1297  'str'1298  >>> inst_name(help)1299  '_Helper'1300  ```13011302  (Добавлено Георгом Брандлом по предложению Барри Уорсо.)1303- Модуль [`os`](https://python-all.ru/3.12/library/os.html#module-os) теперь обёртывает несколько новых системных вызовов. `fchmod(fd, mode)` и `fchown(fd, uid, gid)` изменяют режим и владельца открытого файла, а `lchmod(path, mode)` изменяет режим символической ссылки. (Добавлено Георгом Брандлом и Кристианом Хаймсом.)13041305  `chflags()` и `lchflags()` являются обёртками для соответствующих системных вызовов (где они доступны), изменяющими флаги, установленные для файла. Константы значений флагов определены в модуле [`stat`](https://python-all.ru/3.12/library/stat.html#module-stat); некоторые возможные значения включают `UF_IMMUTABLE` (файл нельзя изменять) и `UF_APPEND` (данные можно только добавлять в файл). (Добавлено М. Левинсоном.)13061307  `os.closerange(low, high)` эффективно закрывает все файловые дескрипторы от *low* до *high*, игнорируя любые ошибки и не включая сам *high*. Эта функция теперь используется модулем [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess) для ускорения запуска процессов. (Добавлено Георгом Брандлом; [bpo-1663329](https://python-all.ru/3.12/whatsnew/2.6.html).)1308- Метод `clear()` объекта `os.environ` теперь будет сбрасывать переменные окружения с помощью [`os.unsetenv()`](https://python-all.ru/3.12/library/os.html#os.unsetenv) в дополнение к очистке ключей объекта. (Добавлено Мартином Хорчичкой; [bpo-1181](https://python-all.ru/3.12/whatsnew/2.6.html).)1309- Функция [`os.walk()`](https://python-all.ru/3.12/library/os.html#os.walk) теперь имеет параметр `followlinks`. Если ему присвоено True, она будет переходить по символьным ссылкам, указывающим на каталоги, и обходить содержимое каталога. Для обратной совместимости значение параметра по умолчанию – false. Обратите внимание, что функция может попасть в бесконечную рекурсию, если есть символьная ссылка, указывающая на родительский каталог. ([bpo-1273829](https://python-all.ru/3.12/whatsnew/2.6.html))1310- В модуле [`os.path`](https://python-all.ru/3.12/library/os.path.html#module-os.path) функция `splitext()` была изменена: теперь она не разбивает строку по начальным точкам. Это даёт лучшие результаты при работе с «точечными» файлами Unix (dot-files). Например, `os.path.splitext('.ipython')` теперь возвращает `('.ipython', '')` вместо `('', '.ipython')`. ([bpo-1115886](https://python-all.ru/3.12/whatsnew/2.6.html))13111312  Новая функция `os.path.relpath(path, start='.')` возвращает относительный путь от пути `start`, если он указан, или от текущей рабочей директории до целевого пути `path`. (Добавлено Ричардом Барраном; [bpo-1339796](https://python-all.ru/3.12/whatsnew/2.6.html).)13131314  В Windows [`os.path.expandvars()`](https://python-all.ru/3.12/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения, заданные в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Добавлено Джозайей Карлсоном; [bpo-957650](https://python-all.ru/3.12/whatsnew/2.6.html).)1315- Отладчик Python, предоставляемый модулем [`pdb`](https://python-all.ru/3.12/library/pdb.html#module-pdb), получил новую команду: «run» перезапускает отлаживаемую программу Python и может опционально принимать новые аргументы командной строки для программы. (Добавлено Рокки Бернстайном; [bpo-1393667](https://python-all.ru/3.12/whatsnew/2.6.html).)1316- Функция [`pdb.post_mortem()`](https://python-all.ru/3.12/library/pdb.html#pdb.post_mortem), используемая для начала отладки по traceback, теперь будет использовать traceback, возвращаемый [`sys.exc_info()`](https://python-all.ru/3.12/library/sys.html#sys.exc_info), если traceback не передан. (Добавлено Факундо Батистой; [bpo-1106316](https://python-all.ru/3.12/whatsnew/2.6.html).)1317- Модуль [`pickletools`](https://python-all.ru/3.12/library/pickletools.html#module-pickletools) теперь имеет функцию `optimize()`, которая принимает строку, содержащую pickle, и удаляет некоторые неиспользуемые опкоды, возвращая более короткий pickle, содержащий ту же структуру данных. (Автор: Raymond Hettinger.)1318- В модуль [`pkgutil`](https://python-all.ru/3.12/library/pkgutil.html#module-pkgutil) была добавлена функция `get_data()`, которая возвращает содержимое файлов ресурсов, включённых в установленный пакет Python. Например:13191320  ```python1321  >>> import pkgutil1322  >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')1323  BaseException1324   +-- SystemExit1325   +-- KeyboardInterrupt1326   +-- GeneratorExit1327   +-- Exception1328        +-- StopIteration1329        +-- StandardError1330   ...1331  ```13321333  (Автор: Paul Moore; [bpo-2439](https://python-all.ru/3.12/whatsnew/2.6.html).)1334- Объекты `Parser` модуля `pyexpat` теперь позволяют устанавливать свой атрибут `buffer_size` для изменения размера буфера, используемого для хранения символьных данных. (Автор: Achim Gaedke; [bpo-1137](https://python-all.ru/3.12/whatsnew/2.6.html).)1335- Модуль `Queue` теперь предоставляет разновидности очередей, которые извлекают записи в разных порядках. Класс `PriorityQueue` хранит элементы очереди в куче и извлекает их в порядке приоритета, а `LifoQueue` извлекает первыми самые недавно добавленные записи, то есть ведёт себя как стек. (Автор: Raymond Hettinger.)1336- Объекты `Random` модуля [`random`](https://python-all.ru/3.12/library/random.html#module-random) теперь можно сериализовать в 32-битной системе и десериализовать в 64-битной системе, и наоборот. К сожалению, это изменение также означает, что объекты `Random` Python 2.6 нельзя корректно десериализовать в более ранних версиях Python. (Автор: Shawn Ligocki; [bpo-1727780](https://python-all.ru/3.12/whatsnew/2.6.html).)13371338  Новая функция `triangular(low, high, mode)` возвращает случайные числа, подчиняющиеся треугольному распределению. Возвращаемые значения находятся между *low* и *high*, не включая *high*, и с *mode* в качестве наиболее часто встречающегося значения в распределении. (Авторы: Wladmir van der Laan и Raymond Hettinger; [bpo-1681432](https://python-all.ru/3.12/whatsnew/2.6.html).)1339- Длительные поиски по регулярным выражениям, выполняемые модулем [`re`](https://python-all.ru/3.12/library/re.html#module-re), будут проверять доставку сигналов, поэтому длительные поиски теперь можно прерывать. (Авторы: Josh Hoyt и Ralf Schmitt; [bpo-846388](https://python-all.ru/3.12/whatsnew/2.6.html).)13401341  Модуль регулярных выражений реализован путём компиляции байткода для крошечной виртуальной машины, специфичной для regex. Недоверенный код может напрямую создавать вредоносные строки байткода и вызывать сбои, поэтому Python 2.6 включает верификатор для байткода regex. (Автор: Guido van Rossum на основе работы для Google App Engine; [bpo-3487](https://python-all.ru/3.12/whatsnew/2.6.html).)1342- Метод `Completer.complete()` модуля [`rlcompleter`](https://python-all.ru/3.12/library/rlcompleter.html#module-rlcompleter) теперь будет игнорировать исключения, возникающие при вычислении имени. (Исправлено Lorenz Quack; [bpo-2250](https://python-all.ru/3.12/whatsnew/2.6.html).)1343- Экземпляры `scheduler` модуля [`sched`](https://python-all.ru/3.12/library/sched.html#module-sched) теперь имеют атрибут [`queue`](https://python-all.ru/3.12/library/queue.html#module-queue) только для чтения, который возвращает содержимое очереди планировщика, представленное в виде списка именованных кортежей с полями `(time, priority, action, argument)`. (Автор: Raymond Hettinger; [bpo-1861](https://python-all.ru/3.12/whatsnew/2.6.html).)1344- Модуль [`select`](https://python-all.ru/3.12/library/select.html#module-select) теперь имеет функции-обёртки для системных вызовов Linux `epoll()` и BSD `kqueue()`. Метод `modify()` был добавлен к существующим объектам `poll`; `pollobj.modify(fd, eventmask)` принимает файловый дескриптор или файловый объект и маску событий, изменяя записанную маску событий для этого файла. (Автор: Christian Heimes; [bpo-1657](https://python-all.ru/3.12/whatsnew/2.6.html).)1345- Функция [`shutil.copytree()`](https://python-all.ru/3.12/library/shutil.html#shutil.copytree) теперь имеет необязательный аргумент *ignore*, который принимает вызываемый объект. Этот вызываемый объект будет получать каждый путь к каталогу и список содержимого каталога, и возвращать список имён, которые будут проигнорированы, а не скопированы.13461347  Модуль [`shutil`](https://python-all.ru/3.12/library/shutil.html#module-shutil) также предоставляет функцию `ignore_patterns()` для использования с этим новым параметром. `ignore_patterns()` принимает произвольное количество шаблонов в стиле glob и возвращает вызываемый объект, который будет игнорировать любые файлы и каталоги, соответствующие любому из этих шаблонов. В следующем примере копируется дерево каталогов, но пропускаются как каталоги `.svn`, так и резервные файлы Emacs, у которых имена заканчиваются на '~':13481349  ```python1350  shutil.copytree('Doc/library', '/tmp/library',1351                  ignore=shutil.ignore_patterns('*~', '.svn'))1352  ```13531354  (Автор: Tarek Ziadé; [bpo-2663](https://python-all.ru/3.12/whatsnew/2.6.html).)1355- Интеграция обработки сигналов с циклами событий GUI, такими как используемые в Tkinter или GTk+, долгое время была проблемой; большинство программ прибегают к опросу (polling), просыпаясь каждую долю секунды, чтобы проверить, не произошли ли какие-либо события GUI. Теперь модуль [`signal`](https://python-all.ru/3.12/library/signal.html#module-signal) может сделать это более эффективно. Вызов `signal.set_wakeup_fd(fd)` устанавливает файловый дескриптор для использования; при получении сигнала в этот файловый дескриптор записывается байт. Также существует функция на уровне C, [`PySignal_SetWakeupFd()`](https://python-all.ru/3.12/c-api/exceptions.html#c.PySignal_SetWakeupFd), для установки дескриптора.13561357  Циклы событий будут использовать это, открывая канал для создания двух дескрипторов: один для чтения и один для записи. Дескриптор для записи будет передан в `set_wakeup_fd()`, а дескриптор для чтения будет добавлен в список дескрипторов, отслеживаемых циклом событий, через `select()` или `poll()`. При получении сигнала будет записан байт, и основной цикл событий проснётся, избегая необходимости опроса.13581359  (Автор: Adam Olsen; [bpo-1583](https://python-all.ru/3.12/whatsnew/2.6.html).)13601361  Функция `siginterrupt()` теперь доступна из кода Python и позволяет изменять, могут ли сигналы прерывать системные вызовы или нет. (Автор: Ralf Schmitt.)13621363  Функции `setitimer()` и `getitimer()` также были добавлены (там, где они доступны). `setitimer()` позволяет устанавливать интервальные таймеры, которые будут отправлять сигнал процессу по истечении заданного времени, измеряемого в реальном времени, процессорном времени процесса или совокупном времени процесса+системы. (Автор: Guilherme Polo; [bpo-2240](https://python-all.ru/3.12/whatsnew/2.6.html).)1364- Модуль [`smtplib`](https://python-all.ru/3.12/library/smtplib.html#module-smtplib) теперь поддерживает SMTP через SSL благодаря добавлению класса `SMTP_SSL`. Этот класс поддерживает интерфейс, идентичный существующему классу `SMTP`. (Автор: Monty Taylor.) Оба конструктора классов также имеют необязательный параметр `timeout`, задающий тайм-аут для начальной попытки соединения, измеряемый в секундах. (Автор: Facundo Batista.)13651366  В модуль также была добавлена реализация протокола LMTP ([**RFC 2033**](https://python-all.ru/3.12/whatsnew/2.6.html)). LMTP используется вместо SMTP при передаче электронной почты между агентами, которые не управляют почтовой очередью. (LMTP реализован Leif Hedstrom; [bpo-957003](https://python-all.ru/3.12/whatsnew/2.6.html).)13671368  `SMTP.starttls()` теперь соответствует [**RFC 3207**](https://python-all.ru/3.12/whatsnew/2.6.html) и забывает любые знания, полученные от сервера, не полученные в результате самого согласования TLS. (Патч предоставлен Bill Fenner; [bpo-829951](https://python-all.ru/3.12/whatsnew/2.6.html).)1369- Модуль [`socket`](https://python-all.ru/3.12/library/socket.html#module-socket) теперь поддерживает TIPC ([https://tipc.sourceforge.net/](https://python-all.ru/3.12/whatsnew/2.6.html)), высокопроизводительный протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса TIPC представляют собой кортежи из 4 или 5 элементов. (Автор: Alberto Bertogli; [bpo-1646](https://python-all.ru/3.12/whatsnew/2.6.html).)13701371  Новая функция `create_connection()` принимает адрес и подключается к нему, используя необязательное значение тайм-аута, возвращая подключённый объект сокета. Эта функция также определяет тип адреса и подключается к нему, используя IPv4 или IPv6 по ситуации. Изменение вашего кода для использования `create_connection()` вместо `socket(socket.AF_INET, ...)` может быть всем, что нужно, чтобы ваш код работал с IPv6.1372- Базовые классы в модуле [`SocketServer`](https://python-all.ru/3.12/library/socketserver.html#module-socketserver) теперь поддерживают вызов метода [`handle_timeout()`](https://python-all.ru/3.12/library/socketserver.html#socketserver.BaseServer.handle_timeout) после периода бездействия, заданного атрибутом [`timeout`](https://python-all.ru/3.12/library/socketserver.html#socketserver.BaseServer.timeout) сервера. (Автор: Michael Pomraning.) Метод [`serve_forever()`](https://python-all.ru/3.12/library/socketserver.html#socketserver.BaseServer.serve_forever) теперь принимает необязательный интервал опроса, измеряемый в секундах, контролирующий, как часто сервер будет проверять запрос на завершение. (Авторы: Pedro Werneck и Jeffrey Yasskin; [bpo-742598](https://python-all.ru/3.12/whatsnew/2.6.html), [bpo-1193577](https://python-all.ru/3.12/whatsnew/2.6.html).)1373- Модуль [`sqlite3`](https://python-all.ru/3.12/library/sqlite3.html#module-sqlite3), поддерживаемый Gerhard Häring, был обновлён с версии 2.3.2 в Python 2.5 до версии 2.4.1.1374- Модуль [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct) теперь поддерживает тип C99 \_Bool, используя символ форматирования `'?'`. (Автор: David Remahl.)1375- Объекты [`Popen`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen), предоставляемые модулем [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess), теперь имеют методы [`terminate()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.terminate), [`kill()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.kill) и [`send_signal()`](https://python-all.ru/3.12/library/subprocess.html#subprocess.Popen.send_signal). В Windows `send_signal()` поддерживает только сигнал [`SIGTERM`](https://python-all.ru/3.12/library/signal.html#signal.SIGTERM), и все эти методы являются псевдонимами для функции Win32 API `TerminateProcess()`. (Автор: Christian Heimes.)1376- Новая переменная в модуле [`sys`](https://python-all.ru/3.12/library/sys.html#module-sys), `float_info`, представляет собой объект, содержащий информацию, полученную из файла `float.h` о поддержке чисел с плавающей запятой на платформе. Атрибуты этого объекта включают `mant_dig` (количество цифр в мантиссе), `epsilon` (наименьшая разница между 1.0 и следующим наибольшим представимым значением) и несколько других. (Автор: Christian Heimes; [bpo-1534](https://python-all.ru/3.12/whatsnew/2.6.html).)13771378  Ещё одна новая переменная, `dont_write_bytecode`, управляет тем, записывает ли Python какие-либо файлы `.pyc` или `.pyo` при импорте модуля. Если эта переменная истинна, скомпилированные файлы не записываются. Переменная изначально устанавливается при запуске путём передачи переключателя [`-B`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-B) интерпретатору Python или установкой переменной окружения [`PYTHONDONTWRITEBYTECODE`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Код Python впоследствии может изменить значение этой переменной, чтобы управлять записью файлов байткода. (Авторы: Neal Norwitz и Georg Brandl.)13791380  Информация об аргументах командной строки, переданных интерпретатору Python, доступна через чтение атрибутов именованного кортежа `sys.flags`. Например, атрибут `verbose` истинен, если Python был запущен в подробном режиме, `debug` истинен в режиме отладки и т.д. Все эти атрибуты доступны только для чтения. (Автор: Christian Heimes.)13811382  Новая функция `getsizeof()` принимает объект Python и возвращает объём памяти, используемый объектом, измеряемый в байтах. Встроенные объекты возвращают корректные результаты; сторонние расширения могут этого не делать, но могут определить метод `__sizeof__()` для возврата размера объекта. (Автор: Robert Schuppenies; [bpo-2898](https://python-all.ru/3.12/whatsnew/2.6.html).)13831384  Теперь можно определить текущие функции профилировщика и трассировщика, вызвав [`sys.getprofile()`](https://python-all.ru/3.12/library/sys.html#sys.getprofile) и [`sys.gettrace()`](https://python-all.ru/3.12/library/sys.html#sys.gettrace). (Автор: Georg Brandl; [bpo-1648](https://python-all.ru/3.12/whatsnew/2.6.html).)1385- Модуль [`tarfile`](https://python-all.ru/3.12/library/tarfile.html#module-tarfile) теперь поддерживает tar-файлы POSIX.1-2001 (pax) в дополнение к уже поддерживаемым форматам POSIX.1-1988 (ustar) и GNU tar. Формат по умолчанию – GNU tar; укажите параметр `format`, чтобы открыть файл в другом формате:13861387  ```python1388  tar = tarfile.open("output.tar", "w",1389                     format=tarfile.PAX_FORMAT)1390  ```13911392  Новые параметры `encoding` и `errors` задают кодировку и схему обработки ошибок для преобразования символов. `'strict'`, `'ignore'` и `'replace'` – три стандартных способа обработки ошибок в Python; `'utf-8'` – специальное значение, заменяющее некорректные символы их UTF-8 представлением. (Преобразование символов необходимо, потому что формат PAX поддерживает имена файлов в Unicode, по умолчанию используется UTF-8.)13931394  Метод `TarFile.add()` теперь принимает аргумент `exclude`, который является функцией, используемой для исключения определённых имён файлов из архива. Функция должна принимать имя файла и возвращать true, если файл следует исключить, или false, если его нужно архивировать. Функция применяется как к имени, переданному изначально в `add()`, так и к именам файлов в рекурсивно добавляемых каталогах.13951396  (Все изменения выполнены Lars Gustäbel.)1397- В конструктор класса [`telnetlib.Telnet`](https://python-all.ru/3.12/library/telnetlib.html#telnetlib.Telnet) добавлен необязательный параметр `timeout`, задающий тайм-аут в секундах. (Добавлено Facundo Batista.)1398- Класс [`tempfile.NamedTemporaryFile`](https://python-all.ru/3.12/library/tempfile.html#tempfile.NamedTemporaryFile) обычно удаляет созданный временный файл при его закрытии. Теперь это поведение можно изменить, передав `delete=False` конструктору. (Автор: Damien Miller; [bpo-1537850](https://python-all.ru/3.12/whatsnew/2.6.html).)13991400  Новый класс `SpooledTemporaryFile` ведёт себя как временный файл, но хранит данные в памяти до превышения максимального размера. По достижении этого предела содержимое будет записано во временный файл на диске. (Автор: Dustin J. Mitchell.)14011402  Классы `NamedTemporaryFile` и `SpooledTemporaryFile` оба работают как менеджеры контекста, поэтому можно написать `with tempfile.NamedTemporaryFile() as tmp: ...`. (Автор: Alexander Belopolsky; [bpo-2021](https://python-all.ru/3.12/whatsnew/2.6.html).)1403- Модуль [`test.test_support`](https://python-all.ru/3.12/library/test.html#module-test.support) получил ряд менеджеров контекста, полезных для написания тестов. [`EnvironmentVarGuard()`](https://python-all.ru/3.12/library/test.html#test.support.os_helper.EnvironmentVarGuard) – это менеджер контекста, который временно изменяет переменные окружения и автоматически восстанавливает их старые значения.14041405  Ещё один менеджер контекста, `TransientResource`, может обрамлять вызовы ресурсов, которые могут быть недоступны; он перехватывает и игнорирует заданный список исключений. Например, сетевой тест может игнорировать определённые сбои при подключении к внешнему веб-сайту:14061407  ```python1408  with test_support.TransientResource(IOError,1409                                  errno=errno.ETIMEDOUT):1410      f = urllib.urlopen('https://sf.net')1411      ...1412  ```14131414  Наконец, `check_warnings()` сбрасывает фильтры предупреждений модуля `warning` и возвращает объект, который будет записывать все вызванные предупреждения ([bpo-3781](https://python-all.ru/3.12/whatsnew/2.6.html)):14151416  ```python1417  with test_support.check_warnings() as wrec:1418      warnings.simplefilter("always")1419      # ... код, вызывающий предупреждение ...1420      assert str(wrec.message) == "function is outdated"1421      assert len(wrec.warnings) == 1, "Multiple warnings raised"1422  ```14231424  (Автор: Бретт Кэннон.)1425- Модуль [`textwrap`](https://python-all.ru/3.12/library/textwrap.html#module-textwrap) теперь может сохранять существующие пробельные символы в начале и конце вновь создаваемых строк, если указать `drop_whitespace=False` в качестве аргумента:14261427  ```python1428  >>> S = """This  sentence  has a bunch   of1429  ...   extra   whitespace."""1430  >>> print textwrap.fill(S, width=15)1431  This  sentence1432  has a bunch1433  of    extra1434  whitespace.1435  >>> print textwrap.fill(S, drop_whitespace=False, width=15)1436  This  sentence1437    has a bunch1438     of    extra1439     whitespace.1440  >>>1441  ```14421443  (Автор: Dwayne Bailey; [bpo-1581073](https://python-all.ru/3.12/whatsnew/2.6.html).)1444- API модуля [`threading`](https://python-all.ru/3.12/library/threading.html#module-threading) изменяется, чтобы использовать свойства, такие как `daemon`, вместо методов `setDaemon()` и `isDaemon()`, а некоторые методы были переименованы для использования подчёркиваний вместо верблюжьего регистра; например, метод `activeCount()` переименован в `active_count()`. Версии модуля 2.6 и 3.0 поддерживают одинаковые свойства и переименованные методы, но не удаляйте старые методы. Дата устаревания старых API в Python 3.x не установлена; старые API не будут удалены ни в одной версии 2.x. (Выполнено несколькими людьми, в первую очередь Бенджамином Петерсоном.)14451446  Объекты `Thread` модуля [`threading`](https://python-all.ru/3.12/library/threading.html#module-threading) получили свойство `ident`, которое возвращает идентификатор потока – ненулевое целое число. (Автор: Gregory P. Smith; [bpo-2871](https://python-all.ru/3.12/whatsnew/2.6.html).)1447- Модуль [`timeit`](https://python-all.ru/3.12/library/timeit.html#module-timeit) теперь принимает как строки, так и вызываемые объекты для измеряемого оператора и для кода настройки. Были добавлены две вспомогательные функции для создания экземпляров `Timer`: `repeat(stmt, setup, time, repeat, number)` и `timeit(stmt, setup, time, number)` создают экземпляр и вызывают соответствующий метод. (Автор: Erik Demaine; [bpo-1533909](https://python-all.ru/3.12/whatsnew/2.6.html).)1448- Модуль `Tkinter` теперь принимает списки и кортежи для параметров, разделяя элементы пробелами перед передачей результирующего значения в Tcl/Tk. (Автор: Guilherme Polo; [bpo-2906](https://python-all.ru/3.12/whatsnew/2.6.html).)1449- Модуль [`turtle`](https://python-all.ru/3.12/library/turtle.html#module-turtle) для черепашьей графики был значительно улучшен Gregor Lingl. Новые возможности модуля включают:14501451  - Улучшенная анимация движения и поворота черепахи.1452  - Управление движением черепахи с помощью новых методов `delay()`, `tracer()` и `speed()`.1453  - Возможность задавать новые формы для черепахи и определять новую систему координат.1454  - У черепах теперь есть метод `undo()`, который может откатывать действия.1455  - Простая поддержка реакции на события ввода, такие как активность мыши и клавиатуры, что позволяет писать простые игры.1456  - Файл `turtle.cfg` можно использовать для настройки начального вида экрана черепахи.1457  - Докстринги модуля могут быть заменены новыми докстрингами, переведёнными на другой язык.14581459  ([bpo-1513695](https://python-all.ru/3.12/whatsnew/2.6.html))1460- Необязательный параметр `timeout` был добавлен в функцию [`urllib.urlopen`](https://python-all.ru/3.12/library/urllib.request.html#urllib.request.urlopen), конструктор класса `urllib.ftpwrapper`, а также в функцию [`urllib2.urlopen`](https://python-all.ru/3.12/library/urllib.request.html#urllib.request.urlopen). Параметр задаёт тайм-аут в секундах. Например:14611462  ```python1463  >>> u = urllib2.urlopen("http://slow.example.com",1464                          timeout=3)1465  Traceback (most recent call last):1466    ...1467  urllib2.URLError: <urlopen error timed out>1468  >>>1469  ```14701471  (Добавлено Facundo Batista.)1472- База данных Unicode, предоставляемая модулем [`unicodedata`](https://python-all.ru/3.12/library/unicodedata.html#module-unicodedata), обновлена до версии 5.1.0. (Обновлено Martin von Löwis; [bpo-3811](https://python-all.ru/3.12/whatsnew/2.6.html).)1473- Методы `formatwarning()` и `showwarning()` модуля [`warnings`](https://python-all.ru/3.12/library/warnings.html#module-warnings) получили необязательный аргумент *line*, который можно использовать для указания строки исходного кода. (Добавлено в рамках [bpo-1631171](https://python-all.ru/3.12/whatsnew/2.6.html), который переписал часть модуля [`warnings`](https://python-all.ru/3.12/library/warnings.html#module-warnings) на C.)14741475  Новая функция `catch_warnings()` – это контекстный менеджер, предназначенный для тестирования, который позволяет временно изменять фильтры предупреждений, а затем восстанавливать их исходные значения ([bpo-3781](https://python-all.ru/3.12/whatsnew/2.6.html)).1476- Классы [`SimpleXMLRPCServer`](https://python-all.ru/3.12/library/xmlrpc.server.html#module-xmlrpc.server) и [`DocXMLRPCServer`](https://python-all.ru/3.12/library/xmlrpc.server.html#module-xmlrpc.server) XML-RPC теперь можно настроить так, чтобы они не открывали и не привязывали свой сокет немедленно, передав `False` в качестве параметра *bind\_and\_activate* конструктора. Это можно использовать для изменения атрибута `allow_reuse_address` экземпляра перед вызовом методов `server_bind()` и `server_activate()`, чтобы открыть сокет и начать прослушивание соединений. (Предложено Питером Паренте; [bpo-1599845](https://python-all.ru/3.12/whatsnew/2.6.html).)14771478  `SimpleXMLRPCServer` также имеет атрибут `_send_traceback_header`; если он равен true, исключение и форматированная трассировка возвращаются в виде HTTP-заголовков «X-Exception» и «X-Traceback». Эта функция предназначена только для отладки и не должна использоваться на производственных серверах, поскольку трассировки могут раскрыть пароли или другую конфиденциальную информацию. (Предложено Аланом Макинтайром в рамках его проекта для Google Summer of Code 2007.)1479- Модуль [`xmlrpclib`](https://python-all.ru/3.12/library/xmlrpc.client.html#module-xmlrpc.client) больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.12/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.12/library/datetime.html#datetime.time) в тип [`xmlrpclib.DateTime`](https://python-all.ru/3.12/library/xmlrpc.client.html#xmlrpc.client.DateTime); семантика преобразования не обязательно была корректной для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и [`time`](https://python-all.ru/3.12/library/datetime.html#datetime.time). ([bpo-1330538](https://python-all.ru/3.12/whatsnew/2.6.html)) Код также может обрабатывать даты до 1900 года (предложено Ральфом Шмиттом; [bpo-2014](https://python-all.ru/3.12/whatsnew/2.6.html)) и 64-битные целые числа, представленные с помощью `<i8>` в ответах XML-RPC (предложено Рику Линдбладом; [bpo-2985](https://python-all.ru/3.12/whatsnew/2.6.html)).1480- Класс `ZipFile` модуля [`zipfile`](https://python-all.ru/3.12/library/zipfile.html#module-zipfile) теперь имеет методы `extract()` и `extractall()`, которые распаковывают один файл или все файлы из архива в текущий каталог или в указанный каталог:14811482  ```python1483  z = zipfile.ZipFile('python-251.zip')14841485  # Распаковать один файл, записывая его относительно1486  # в каталог /tmp.1487  z.extract('Python/sysmodule.c', '/tmp')14881489  # Распаковать все файлы из архива.1490  z.extractall()1491  ```14921493  (Предложено Аланом Макинтайром; [bpo-467924](https://python-all.ru/3.12/whatsnew/2.6.html).)14941495  Методы [`open()`](https://python-all.ru/3.12/library/functions.html#open), `read()` и `extract()` теперь могут принимать либо имя файла, либо объект `ZipInfo`. Это полезно, когда архив случайно содержит дублированное имя файла. (Предложено Грэмом Хорлером; [bpo-1775025](https://python-all.ru/3.12/whatsnew/2.6.html).)14961497  Наконец, [`zipfile`](https://python-all.ru/3.12/library/zipfile.html#module-zipfile) теперь поддерживает использование имён файлов в Unicode для архивных файлов. (Предложено Алексеем Борзенковым; [bpo-1734346](https://python-all.ru/3.12/whatsnew/2.6.html).)14981499### Модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast)15001501Модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) предоставляет представление Python-кода в виде абстрактного синтаксического дерева, а Армин Ронахер предложил набор вспомогательных функций, выполняющих различные распространённые задачи. Они будут полезны для пакетов HTML-шаблонов, анализаторов кода и подобных инструментов, обрабатывающих Python-код.15021503Функция `parse()` принимает выражение и возвращает AST. Функция `dump()` выводит представление дерева, подходящее для отладки:15041505```python1506import ast15071508t = ast.parse("""1509d = {}1510for i in 'abcdefghijklm':1511    d[i + i] = ord(i) - ord('a') + 11512print d1513""")1514print ast.dump(t)1515```15161517Это выводит глубоко вложенное дерево:15181519```python1520Module(body=[1521  Assign(targets=[1522    Name(id='d', ctx=Store())1523   ], value=Dict(keys=[], values=[]))1524  For(target=Name(id='i', ctx=Store()),1525      iter=Str(s='abcdefghijklm'), body=[1526    Assign(targets=[1527      Subscript(value=1528        Name(id='d', ctx=Load()),1529          slice=1530          Index(value=1531            BinOp(left=Name(id='i', ctx=Load()), op=Add(),1532             right=Name(id='i', ctx=Load()))), ctx=Store())1533     ], value=1534     BinOp(left=1535      BinOp(left=1536       Call(func=1537        Name(id='ord', ctx=Load()), args=[1538          Name(id='i', ctx=Load())1539         ], keywords=[], starargs=None, kwargs=None),1540       op=Sub(), right=Call(func=1541        Name(id='ord', ctx=Load()), args=[1542          Str(s='a')1543         ], keywords=[], starargs=None, kwargs=None)),1544       op=Add(), right=Num(n=1)))1545    ], orelse=[])1546   Print(dest=None, values=[1547     Name(id='d', ctx=Load())1548   ], nl=True)1549 ])1550```15511552Метод `literal_eval()` принимает строку или AST, представляющий литеральное выражение, анализирует и вычисляет его, а затем возвращает полученное значение. Литеральное выражение – это выражение Python, содержащее только строки, числа, словари и т.д., но не содержащее инструкций или вызовов функций. Если необходимо вычислить выражение, но нельзя принять риск безопасности при использовании вызова [`eval()`](https://python-all.ru/3.12/library/functions.html#eval), `literal_eval()` справится с этим безопасно:15531554```python1555>>> literal = '("a", "b", {2:4, 3:8, 1:2})'1556>>> print ast.literal_eval(literal)1557('a', 'b', {1: 2, 2: 4, 3: 8})1558>>> print ast.literal_eval('"a" + "b"')1559Traceback (most recent call last):1560  ...1561ValueError: malformed string1562```15631564Модуль также включает классы `NodeVisitor` и `NodeTransformer` для обхода и изменения AST, а также функции для распространённых преобразований, таких как изменение номеров строк.15651566### Модуль `future_builtins`15671568Python 3.0 вносит много изменений в набор встроенных функций, и большинство из них нельзя ввести в серии Python 2.x, поскольку это нарушило бы совместимость. Модуль `future_builtins` предоставляет версии этих встроенных функций, которые можно импортировать при написании кода, совместимого с Python 3.0.15691570Функции в этом модуле в настоящее время включают:15711572- `ascii(obj)`: эквивалентно [`repr()`](https://python-all.ru/3.12/library/functions.html#repr). В Python 3.0 [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) будет возвращать строку Unicode, а [`ascii()`](https://python-all.ru/3.12/library/functions.html#ascii) – чистую ASCII-байтовую строку.1573- `filter(predicate, iterable)`, `map(func, iterable1, ...)`: версии 3.0 возвращают итераторы, в отличие от встроенных функций 2.x, которые возвращают списки.1574- `hex(value)`, `oct(value)`: вместо вызова методов `__hex__()` или `__oct__()` эти версии будут вызывать метод `__index__()` и преобразовывать результат в шестнадцатеричный или восьмеричный формат. [`oct()`](https://python-all.ru/3.12/library/functions.html#oct) будет использовать новое обозначение `0o` для своего результата.15751576### Модуль [`json`](https://python-all.ru/3.12/library/json.html#module-json): JavaScript Object Notation15771578Новый модуль [`json`](https://python-all.ru/3.12/library/json.html#module-json) поддерживает кодирование и декодирование типов Python в JSON (JavaScript Object Notation). JSON – это лёгкий формат обмена данными, часто используемый в веб-приложениях. Для получения дополнительной информации о JSON см. [http://www.json.org](https://python-all.ru/3.12/whatsnew/2.6.html).15791580[`json`](https://python-all.ru/3.12/library/json.html#module-json) поставляется с поддержкой декодирования и кодирования большинства встроенных типов Python. Следующий пример кодирует и декодирует словарь:15811582```python1583>>> import json1584>>> data = {"spam": "foo", "parrot": 42}1585>>> in_json = json.dumps(data) # Закодировать данные1586>>> in_json1587'{"parrot": 42, "spam": "foo"}'1588>>> json.loads(in_json) # Декодировать в объект Python1589{"spam": "foo", "parrot": 42}1590```15911592Также можно написать собственные декодеры и кодеры для поддержки большего количества типов. Также поддерживается pretty-printing JSON-строк.15931594[`json`](https://python-all.ru/3.12/library/json.html#module-json) (изначально назывался simplejson) был написан Бобом Ипполито.15951596### Модуль [`plistlib`](https://python-all.ru/3.12/library/plistlib.html#module-plistlib): анализатор списков свойств15971598Формат `.plist` обычно используется в Mac OS X для хранения основных типов данных (чисел, строк, списков и словарей) путём их сериализации в формат на основе XML. Он напоминает сериализацию типов данных XML-RPC.15991600Несмотря на то, что формат в основном используется в Mac OS X, в нём нет ничего специфичного для Mac, и реализация на Python работает на любой платформе, поддерживаемой Python, поэтому модуль [`plistlib`](https://python-all.ru/3.12/library/plistlib.html#module-plistlib) был включён в стандартную библиотеку.16011602Использовать модуль просто:16031604```python1605import sys1606import plistlib1607import datetime16081609# Создать структуру данных1610data_struct = dict(lastAccessed=datetime.datetime.now(),1611                   version=1,1612                   categories=('Personal','Shared','Private'))16131614# Создать строку, содержащую XML.1615plist_str = plistlib.writePlistToString(data_struct)1616new_struct = plistlib.readPlistFromString(plist_str)1617print data_struct1618print new_struct16191620# Записать структуру данных в файл и прочитать её обратно.1621plistlib.writePlist(data_struct, '/tmp/customizations.plist')1622new_struct = plistlib.readPlist('/tmp/customizations.plist')16231624# read/writePlist принимает как файлоподобные объекты, так и пути.1625plistlib.writePlist(data_struct, sys.stdout)1626```16271628### Улучшения ctypes16291630Томас Хеллер продолжил поддерживать и улучшать модуль [`ctypes`](https://python-all.ru/3.12/library/ctypes.html#module-ctypes).16311632[`ctypes`](https://python-all.ru/3.12/library/ctypes.html#module-ctypes) теперь поддерживает тип данных `c_bool`, представляющий тип C99 `bool`. (Предложено Дэвидом Ремалем; [bpo-1649190](https://python-all.ru/3.12/whatsnew/2.6.html).)16331634Типы [`ctypes`](https://python-all.ru/3.12/library/ctypes.html#module-ctypes) string, buffer и array получили улучшенную поддержку расширенного синтаксиса срезов, где используются различные комбинации `(start, stop, step)`. (Реализовано Томасом Воутерсом.)16351636Все типы данных [`ctypes`](https://python-all.ru/3.12/library/ctypes.html#module-ctypes) теперь поддерживают методы `from_buffer()` и `from_buffer_copy()`, которые создают экземпляр ctypes на основе переданного объекта буфера. `from_buffer_copy()` копирует содержимое объекта, а `from_buffer()` разделяет ту же область памяти.16371638Новое соглашение о вызовах предписывает [`ctypes`](https://python-all.ru/3.12/library/ctypes.html#module-ctypes) очищать переменные `errno` или Win32 LastError в начале каждого обёрнутого вызова. (Реализовано Томасом Хеллером; [bpo-1798](https://python-all.ru/3.12/whatsnew/2.6.html).)16391640Теперь можно получить значение переменной Unix `errno` после вызова функции. При создании обёрнутой функции можно передать `use_errno=True` как именованный параметр в функцию `DLL()`, а затем вызвать методы модуля `set_errno()` и `get_errno()` для установки и получения кода ошибки.16411642Переменная Win32 LastError аналогично поддерживается функциями `DLL()`, `OleDLL()` и `WinDLL()`. Вы передаёте `use_last_error=True` как именованный параметр, а затем вызываете методы модуля `set_last_error()` и `get_last_error()`.16431644Функция `byref()`, используемая для получения указателя на экземпляр ctypes, теперь имеет необязательный параметр *offset* (смещение в байтах), которое будет добавлено к возвращаемому указателю.16451646### Улучшенная поддержка SSL16471648Билл Янссен значительно улучшил поддержку SSL в Python 2.6, добавив новый модуль [`ssl`](https://python-all.ru/3.12/library/ssl.html#module-ssl), построенный на библиотеке [OpenSSL](https://python-all.ru/3.12/whatsnew/2.6.html). Этот новый модуль даёт больше контроля над согласованным протоколом, используемыми сертификатами X.509 и лучше поддерживает написание SSL-серверов (в отличие от клиентов) на Python. Существующая поддержка SSL в модуле [`socket`](https://python-all.ru/3.12/library/socket.html#module-socket) не удалена и продолжает работать, хотя будет удалена в Python 3.0.16491650Чтобы использовать новый модуль, сначала нужно обычным образом создать TCP-соединение, а затем передать его функции `ssl.wrap_socket()`. Можно указать, требуется ли сертификат, и получить информацию о сертификате, вызвав метод `getpeercert()`.16511652> **См. также**1653>1654> Документация модуля [`ssl`](https://python-all.ru/3.12/library/ssl.html#module-ssl).16551656## Устаревания и удаления16571658- Строковые исключения были удалены. Попытка их использования возбуждает [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError).1659- Изменения интерфейса [`Exception`](https://python-all.ru/3.12/library/exceptions.html#Exception), продиктованные [**PEP 352**](https://python-all.ru/3.12/whatsnew/2.6.html), продолжают вноситься. В версии 2.6 атрибут `message` объявлен устаревшим в пользу атрибута [`args`](https://python-all.ru/3.12/library/exceptions.html#BaseException.args).1660- (Режим предупреждений о 3.0) В Python 3.0 будет реорганизована стандартная библиотека: многие устаревшие модули будут удалены, а другие переименованы. Python 2.6, запущенный в режиме предупреждений о 3.0, будет выдавать предупреждения об этих модулях при их импорте.16611662  Список устаревших модулей: `audiodev`, `bgenlocations`, `buildtools`, `bundlebuilder`, `Canvas`, `compiler`, `dircache`, `dl`, `fpformat`, `gensuitemodule`, `ihooks`, `imageop`, `imgfile`, `linuxaudiodev`, `mhlib`, `mimetools`, `multifile`, `new`, `pure`, `statvfs`, `sunaudiodev`, `test.testall` и `toaiff`.1663- Модуль `gopherlib` удалён.1664- Модули `MimeWriter` и `mimify` объявлены устаревшими; вместо них используйте пакет [`email`](https://python-all.ru/3.12/library/email.html#module-email).1665- Модуль `md5` объявлен устаревшим; используйте вместо него модуль [`hashlib`](https://python-all.ru/3.12/library/hashlib.html#module-hashlib).1666- Модуль `posixfile` объявлен устаревшим; [`fcntl.lockf()`](https://python-all.ru/3.12/library/fcntl.html#fcntl.lockf) предоставляет более надёжные блокировки.1667- Модуль `popen2` объявлен устаревшим; используйте модуль [`subprocess`](https://python-all.ru/3.12/library/subprocess.html#module-subprocess).1668- Модуль `rgbimg` удалён.1669- Модуль `sets` объявлен устаревшим; лучше использовать встроенные типы [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset).1670- Модуль `sha` объявлен устаревшим; используйте вместо него модуль [`hashlib`](https://python-all.ru/3.12/library/hashlib.html#module-hashlib).16711672## Изменения в сборке и C API16731674Изменения процесса сборки Python и C API включают:16751676- Теперь Python должен компилироваться компиляторами C89 (спустя 19 лет!). Это означает, что в исходном коде Python удалены собственные реализации `memmove()` и `strerror()`, которые входят в стандартную библиотеку C89.1677- Python 2.6 можно собрать с помощью Microsoft Visual Studio 2008 (версия 9.0), и это новый компилятор по умолчанию. Смотрите каталог `PCbuild` для файлов сборки. (Реализовано Кристианом Хаймсом.)1678- На Mac OS X Python 2.6 может быть скомпилирован как универсальная сборка для четырёх архитектур. Скрипт **configure** может принимать ключ `--with-universal-archs=[32-bit|64-bit|all]`, определяющий, будут ли двоичные файлы собраны для 32-битных архитектур (x86, PowerPC), 64-битных (x86-64 и PPC-64) или для обеих. (Предложено Рональдом Уссореном.)1679- Новая функция, добавленная в Python 2.6.6, `PySys_SetArgvEx()`, устанавливает значение `sys.argv` и может опционально обновлять `sys.path`, чтобы включить каталог, содержащий скрипт, указанный `sys.argv[0]`, в зависимости от значения параметра *updatepath*.16801681  Эта функция была добавлена для закрытия уязвимости безопасности в приложениях, встраивающих Python. Старая функция `PySys_SetArgv()` всегда обновляла `sys.path`, и иногда добавляла текущий каталог. Это означало, что если вы запускали приложение, встраивающее Python, в каталоге, контролируемом кем-то другим, злоумышленники могли поместить в этот каталог троянский модуль (например, файл с именем `os.py`), который ваше приложение затем импортировало и запускало.16821683  Если вы поддерживаете C/C++ приложение, встраивающее Python, проверьте, вызываете ли вы `PySys_SetArgv()`, и тщательно обдумайте, не следует ли приложению использовать `PySys_SetArgvEx()` с *updatepath*, установленным в false. Обратите внимание, что использование этой функции нарушит совместимость с Python версий 2.6.5 и более ранних; если вам приходится продолжать работать с более ранними версиями, вы можете оставить вызов `PySys_SetArgv()` без изменений и вызвать `PyRun_SimpleString("sys.path.pop(0)\n")` после него, чтобы отбросить первый компонент `sys.path`.16841685  Проблема безопасности зарегистрирована как [**CVE 2008-5983**](https://python-all.ru/3.12/whatsnew/2.6.html); обсуждалась в [gh-50003](https://python-all.ru/3.12/whatsnew/2.6.html), исправлена Антуаном Питру.1686- Модуль BerkeleyDB теперь имеет объект C API, доступный как `bsddb.db.api`. Этот объект может использоваться другими расширениями C, которые хотят использовать модуль `bsddb` для своих целей. (Предложено Данканом Грисби.)1687- Новый интерфейс буфера, ранее описанный в [разделе PEP 3118](https://python-all.ru/3.12/whatsnew/2.6.html#pep-3118-revised-buffer-protocol), добавляет функции [`PyObject_GetBuffer()`](https://python-all.ru/3.12/c-api/buffer.html#c.PyObject_GetBuffer) и [`PyBuffer_Release()`](https://python-all.ru/3.12/c-api/buffer.html#c.PyBuffer_Release), а также несколько других.1688- Использование Python библиотеки C stdio теперь потокобезопасно, или, по крайней мере, настолько потокобезопасно, насколько им является сама нижележащая библиотека. Долгое время существовала потенциальная ошибка, когда один поток закрывал файловый объект, в то время как другой поток читал из него или писал в него. В Python 2.6 файловые объекты имеют счетчик ссылок, управляемый функциями `PyFile_IncUseCount()` и `PyFile_DecUseCount()`. Файловый объект нельзя закрыть, пока счетчик ссылок не равен нулю. `PyFile_IncUseCount()` должна вызываться, пока GIL еще удерживается, перед выполнением операции ввода-вывода с использованием указателя `FILE *`, а `PyFile_DecUseCount()` должна вызываться сразу после повторного захвата GIL. (Авторы: Антуан Питу и Грегори П. Смит.)1689- Одновременный импорт модулей в двух разных потоках больше не приводит к взаимоблокировке; теперь вместо этого возбуждается [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError). Новая функция API, [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/3.12/c-api/import.html#c.PyImport_ImportModuleNoBlock), сначала ищет модуль в `sys.modules`, а затем пытается импортировать его после захвата блокировки импорта. Если блокировка импорта удерживается другим потоком, возбуждается [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError). (Автор: Кристиан Хаймс.)1690- Несколько функций возвращают информацию о поддержке платформой чисел с плавающей запятой. [`PyFloat_GetMax()`](https://python-all.ru/3.12/c-api/float.html#c.PyFloat_GetMax) возвращает максимальное представимое значение с плавающей запятой, а [`PyFloat_GetMin()`](https://python-all.ru/3.12/c-api/float.html#c.PyFloat_GetMin) – минимальное положительное значение. [`PyFloat_GetInfo()`](https://python-all.ru/3.12/c-api/float.html#c.PyFloat_GetInfo) возвращает объект, содержащий дополнительную информацию из файла `float.h`, такую как `"mant_dig"` (количество цифр в мантиссе), `"epsilon"` (наименьшая разница между 1.0 и следующим большим представимым значением) и другие. (Автор: Кристиан Хаймс; [bpo-1534](https://python-all.ru/3.12/whatsnew/2.6.html).)1691- C-функции и методы, использующие [`PyComplex_AsCComplex()`](https://python-all.ru/3.12/c-api/complex.html#c.PyComplex_AsCComplex), теперь принимают аргументы, у которых есть метод `__complex__()`. В частности, функции в модуле [`cmath`](https://python-all.ru/3.12/library/cmath.html#module-cmath) теперь принимают объекты с этим методом. Это обратный порт изменения из Python 3.0. (Автор: Марк Дикинсон; [bpo-1675423](https://python-all.ru/3.12/whatsnew/2.6.html).)1692- C API Python теперь включает две функции для сравнения строк без учета регистра: `PyOS_stricmp(char*, char*)` и `PyOS_strnicmp(char*, char*, Py_ssize_t)`. (Автор: Кристиан Хаймс; [bpo-1635](https://python-all.ru/3.12/whatsnew/2.6.html).)1693- Многие C-расширения определяют собственные макросы для добавления целых чисел и строк в словарь модуля в функции `init*`. Python 2.6 наконец-то определяет стандартные макросы для добавления значений в модуль: [`PyModule_AddStringMacro`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_AddStringMacro) и [`PyModule_AddIntMacro()`](https://python-all.ru/3.12/c-api/module.html#c.PyModule_AddIntMacro). (Автор: Кристиан Хаймс.)1694- Некоторые макросы были переименованы как в 3.0, так и в 2.6, чтобы было понятнее, что это макросы, а не функции. `Py_Size()` стал [`Py_SIZE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_SIZE), `Py_Type()` стал [`Py_TYPE()`](https://python-all.ru/3.12/c-api/structures.html#c.Py_TYPE), а `Py_Refcnt()` стал [`Py_REFCNT()`](https://python-all.ru/3.12/c-api/refcounting.html#c.Py_REFCNT). Макросы со смешанным регистром по-прежнему доступны в Python 2.6 для обратной совместимости. ([bpo-1629](https://python-all.ru/3.12/whatsnew/2.6.html))1695- Distutils теперь размещает создаваемые C-расширения в другом каталоге при работе с отладочной версией Python. (Автор: Коллин Уинтер; [bpo-1530959](https://python-all.ru/3.12/whatsnew/2.6.html).)1696- Некоторые базовые типы данных, такие как целые числа и строки, ведут внутренние списки свободных объектов, которые можно повторно использовать. Структуры данных для этих списков теперь следуют соглашению об именовании: переменная всегда называется `free_list`, счетчик всегда называется `numfree`, и всегда определяется макрос `Py<typename>_MAXFREELIST`.1697- Новая цель Makefile, «make patchcheck», подготавливает дерево исходных текстов Python для создания патча: она исправляет завершающие пробелы во всех измененных файлах `.py`, проверяет, была ли изменена документация, и сообщает, были ли обновлены файлы `Misc/ACKS` и `Misc/NEWS`. (Автор: Бретт Кэннон.)16981699  Еще одна новая цель, «make profile-opt», компилирует двоичный файл Python с использованием профильно-ориентированной оптимизации GCC. Она компилирует Python с включенным профилированием, запускает набор тестов для получения набора результатов профилирования, а затем компилирует с использованием этих результатов для оптимизации. (Автор: Грегори П. Смит.)17001701### Изменения для конкретных платформ: Windows17021703- Поддержка Windows 95, 98, ME и NT4 прекращена. Python 2.6 требует по крайней мере Windows 2000 SP4.1704- Новый компилятор по умолчанию в Windows – Visual Studio 2008 (версия 9.0). Каталоги сборки для Visual Studio 2003 (версия 7.1) и 2005 (версия 8.0) были перемещены в каталог PC/. Новый каталог `PCbuild` поддерживает кросскомпиляцию для X64, отладочные сборки и профильно-ориентированную оптимизацию (PGO). Сборки PGO примерно на 10% быстрее обычных. (Автор: Кристиан Хаймс при помощи Амори Форжо д’Арк и Мартина фон Лёвиса.)1705- Модуль [`msvcrt`](https://python-all.ru/3.12/library/msvcrt.html#module-msvcrt) теперь поддерживает как обычную, так и широкосимвольную версии консольного API ввода-вывода. Функция [`getwch()`](https://python-all.ru/3.12/library/msvcrt.html#msvcrt.getwch) считывает нажатие клавиши и возвращает значение Unicode, как и функция [`getwche()`](https://python-all.ru/3.12/library/msvcrt.html#msvcrt.getwche). Функция [`putwch()`](https://python-all.ru/3.12/library/msvcrt.html#msvcrt.putwch) принимает символ Unicode и записывает его на консоль. (Автор: Кристиан Хаймс.)1706- [`os.path.expandvars()`](https://python-all.ru/3.12/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Автор: Джозия Карлсон; [bpo-957650](https://python-all.ru/3.12/whatsnew/2.6.html).)1707- Объекты сокетов модуля [`socket`](https://python-all.ru/3.12/library/socket.html#module-socket) теперь имеют метод [`ioctl()`](https://python-all.ru/3.12/library/socket.html#socket.socket.ioctl), который предоставляет ограниченный интерфейс к системному интерфейсу `WSAIoctl()`.1708- В модуле [`_winreg`](https://python-all.ru/3.12/library/winreg.html#module-winreg) теперь есть функция [`ExpandEnvironmentStrings()`](https://python-all.ru/3.12/library/winreg.html#winreg.ExpandEnvironmentStrings), которая раскрывает ссылки на переменные окружения, такие как `%NAME%`, во входной строке. Объекты handle, предоставляемые этим модулем, теперь поддерживают протокол контекстного менеджера, поэтому их можно использовать в операторах [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with). (Автор: Кристиан Хаймс.)17091710  [`_winreg`](https://python-all.ru/3.12/library/winreg.html#module-winreg) также имеет лучшую поддержку систем x64, предоставляя функции [`DisableReflectionKey()`](https://python-all.ru/3.12/library/winreg.html#winreg.DisableReflectionKey), [`EnableReflectionKey()`](https://python-all.ru/3.12/library/winreg.html#winreg.EnableReflectionKey) и [`QueryReflectionKey()`](https://python-all.ru/3.12/library/winreg.html#winreg.QueryReflectionKey), которые включают и отключают отражение реестра для 32-битных процессов, работающих на 64-битных системах. ([bpo-1753245](https://python-all.ru/3.12/whatsnew/2.6.html))1711- Объект `Record` модуля [`msilib`](https://python-all.ru/3.12/library/msilib.html#module-msilib) получил методы [`GetInteger()`](https://python-all.ru/3.12/library/msilib.html#msilib.Record.GetInteger) и [`GetString()`](https://python-all.ru/3.12/library/msilib.html#msilib.Record.GetString), которые возвращают значения полей в виде целого числа или строки. (Автор: Флорис Брайнуге; [bpo-2125](https://python-all.ru/3.12/whatsnew/2.6.html).)17121713### Изменения для конкретных платформ: Mac OS X17141715- При компиляции сборки Python в виде фреймворка теперь можно указать имя фреймворка, передав опцию `--with-framework-name=` скрипту **configure**.1716- Модуль `macfs` был удален. Это, в свою очередь, потребовало удаления функции `macostools.touched()`, поскольку она зависела от модуля `macfs`. ([bpo-1490190](https://python-all.ru/3.12/whatsnew/2.6.html))1717- Многие другие модули 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`.17181719### Изменения для конкретных портов: IRIX17201721Ряд старых модулей, специфичных для 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`.17221723## Перенос на Python 2.617241725В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:17261727- Классы, которые не должны быть хешируемыми, должны установить `__hash__ = None` в своих определениях, чтобы указать на это.1728- Строковые исключения были удалены. Попытка их использования возбуждает [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError).1729- Метод `__init__()` объекта [`collections.deque`](https://python-all.ru/3.12/library/collections.html#collections.deque) теперь очищает существующее содержимое deque перед добавлением элементов из итерируемого объекта. Это изменение приводит поведение в соответствие с `list.__init__()`.1730- [`object.__init__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__init__) ранее принимал произвольные позиционные и именованные аргументы, игнорируя их. В Python 2.6 это больше не допускается и приведет к [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError). Это затронет методы `__init__()`, которые в итоге вызывают соответствующий метод на [`object`](https://python-all.ru/3.12/library/functions.html#object) (возможно, через использование [`super()`](https://python-all.ru/3.12/library/functions.html#super)). См. обсуждение в [bpo-1683368](https://python-all.ru/3.12/whatsnew/2.6.html).1731- Конструктор `Decimal` теперь допускает начальные и конечные пробелы при передаче строки. Ранее он вызывал исключение `InvalidOperation`. С другой стороны, метод `create_decimal()` объектов `Context` теперь явно запрещает лишние пробелы, вызывая исключение `ConversionSyntax`.1732- Из-за случайности реализации, если передать путь к файлу встроенной функции [`__import__()`](https://python-all.ru/3.12/library/functions.html#import__), она фактически импортировала указанный файл. Однако это никогда не должно было работать, и теперь реализация явно проверяет этот случай и вызывает [`ImportError`](https://python-all.ru/3.12/library/exceptions.html#ImportError).1733- C API: функции [`PyImport_Import()`](https://python-all.ru/3.12/c-api/import.html#c.PyImport_Import) и [`PyImport_ImportModule()`](https://python-all.ru/3.12/c-api/import.html#c.PyImport_ImportModule) теперь по умолчанию используют абсолютный импорт, а не относительный. Это повлияет на расширения на C, которые импортируют другие модули.1734- C API: типы данных расширений, которые не должны быть хэшируемыми, должны определить свой слот `tp_hash` как [`PyObject_HashNotImplemented()`](https://python-all.ru/3.12/c-api/object.html#c.PyObject_HashNotImplemented).1735- Исключение [`socket.error`](https://python-all.ru/3.12/library/socket.html#socket.error) модуля [`socket`](https://python-all.ru/3.12/library/socket.html#module-socket) теперь наследуется от [`IOError`](https://python-all.ru/3.12/library/exceptions.html#IOError). Ранее оно не было подклассом `StandardError`, но теперь стало, через [`IOError`](https://python-all.ru/3.12/library/exceptions.html#IOError). (Реализовано Грегори П. Смитом; [bpo-1706815](https://python-all.ru/3.12/whatsnew/2.6.html).)1736- Модуль [`xmlrpclib`](https://python-all.ru/3.12/library/xmlrpc.client.html#module-xmlrpc.client) больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.12/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.12/library/datetime.html#datetime.time) в тип [`xmlrpclib.DateTime`](https://python-all.ru/3.12/library/xmlrpc.client.html#xmlrpc.client.DateTime); семантика преобразования не обязательно была корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и [`time`](https://python-all.ru/3.12/library/datetime.html#datetime.time). ([bpo-1330538](https://python-all.ru/3.12/whatsnew/2.6.html))1737- (режим предупреждения 3.0) Класс [`Exception`](https://python-all.ru/3.12/library/exceptions.html#Exception) теперь выдаёт предупреждение при доступе через срез или по индексу; возможность [`Exception`](https://python-all.ru/3.12/library/exceptions.html#Exception) вести себя как кортеж постепенно упраздняется.1738- (режим предупреждения 3.0) Сравнения на неравенство между двумя словарями или двумя объектами, которые не реализуют методы сравнения, сообщаются как предупреждения. `dict1 == dict2` всё ещё работает, но `dict1 < dict2` постепенно упраздняется.17391740  Сравнения между ячейками (cells), которые являются деталью реализации правил области видимости Python, также вызывают предупреждения, поскольку такие сравнения полностью запрещены в 3.0.17411742Для приложений, которые встраивают Python:17431744- Функция `PySys_SetArgvEx()` была добавлена в Python 2.6.6, позволяя приложениям закрыть брешь в безопасности при использовании существующей функции `PySys_SetArgv()`. Проверьте, вызываете ли вы `PySys_SetArgv()`, и тщательно обдумайте, должно ли приложение использовать `PySys_SetArgvEx()` с *updatepath*, установленным в false.17451746## Благодарности17471748Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.1749