> **Источник:** https://python-all.ru/3.0/whatsnew/2.6.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Что нового в Python 2.6

| Автор: | А. М. Кухлинг (amk at amk.ca) |
| --- | --- |
| Версия: | 3.0.1 |
| Дата: | 14 февраля 2009 |

В этой статье описываются новые возможности Python 2.6, выпущенного 1 октября 2008 года. График выпуска описан в [**PEP 361**](https://python-all.ru/3.0/whatsnew/2.6.html).

Главная тема Python 2.6 – подготовка путей миграции на Python 3.0, где язык был существенно переработан. Там, где это возможно, Python 2.6 включает новые возможности и синтаксис из 3.0, оставаясь при этом совместимым с существующим кодом – старые возможности и синтаксис не удаляются. Когда сделать это невозможно, Python 2.6 старается помочь: он добавляет функции совместимости в модуле `future_builtins` и ключ *-3*, который предупреждает об использовании конструкций, ставших недопустимыми в 3.0.

В стандартную библиотеку добавлено несколько значимых новых пакетов, например модули [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) и [`json`](https://python-all.ru/3.0/library/json.html#module-json), однако новых возможностей, не связанных с Python 3.0, не так много.

Python 2.6 также содержит ряд улучшений и исправлений ошибок по всему исходному коду. Поиск по журналам изменений показывает, что между Python 2.5 и 2.6 было применено 259 патчей и исправлено 612 ошибок. Обе цифры, вероятно, занижены.

Эта статья не пытается дать полную спецификацию новых возможностей, а вместо этого предоставляет удобный обзор. За подробностями обращайтесь к документации Python 2.6. Если вы хотите понять обоснование дизайна и реализации, обратитесь к PEP для конкретной новой возможности. По возможности «Что нового в Python» ссылается на элемент ошибки/патча для каждого изменения.

## Python 3.0

Цикл разработки версий Python 2.6 и 3.0 был синхронизирован: альфа- и бета-релизы для обеих версий выходили в одни и те же дни. Разработка версии 3.0 повлияла на многие возможности в версии 2.6.

Python 3.0 – это масштабное перепроектирование Python, которое нарушает совместимость с серией 2.x. Это означает, что существующий код Python потребует некоторой конвертации, чтобы работать на Python 3.0. Однако не все изменения в 3.0 обязательно нарушают совместимость. В тех случаях, когда новые возможности не приводят к нарушению существующего кода, они были перенесены в 2.6 и описаны в этом документе в соответствующих разделах. Некоторые из возможностей, заимствованных из 3.0:

- Метод [`__complex__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__complex__) для преобразования объектов в комплексное число.
- Альтернативный синтаксис перехвата исключений: `except TypeError as exc`.
- Добавление [`functools.reduce()`](https://python-all.ru/3.0/library/functools.html#functools.reduce) как синонима встроенной функции `reduce()`.

Python 3.0 добавляет несколько новых встроенных функций и изменяет семантику некоторых существующих. Функции, новые в 3.0, такие как [`bin()`](https://python-all.ru/3.0/library/functions.html#bin), были просто добавлены в Python 2.6, но существующие встроенные функции не менялись; вместо этого модуль `future_builtins` содержит версии с новой семантикой 3.0. Код, написанный для совместимости с 3.0, может использовать `from future_builtins import hex, map` по мере необходимости.

Новый ключ командной строки *-3* включает предупреждения об особенностях, которые будут удалены в Python 3.0. Запустив код с этим ключом, можно оценить, сколько работы потребуется для переноса кода на 3.0. Значение этого ключа доступно в коде Python как логическая переменная `sys.py3kwarning`, а в C-расширениях – как `Py_Py3kWarningFlag`.

> **См. также**
>
> Серия PEP 3xxx, содержащая предложения для Python 3.0. [**PEP 3000**](https://python-all.ru/3.0/whatsnew/2.6.html) описывает процесс разработки Python 3.0. Начните с [**PEP 3100**](https://python-all.ru/3.0/whatsnew/2.6.html), который описывает общие цели Python 3.0, а затем изучите PEP с более высокими номерами, предлагающие конкретные функции.

## Изменения в процессе разработки

Во время разработки 2.6 процесс разработки Python претерпел два существенных изменения: мы перешли с системы отслеживания ошибок SourceForge на настраиваемую установку Roundup, а документация была преобразована из LaTeX в reStructuredText.

### Новая система отслеживания ошибок: Roundup

Долгое время разработчики Python были всё более недовольны системой отслеживания ошибок SourceForge. Решение SourceForge, предоставляемое как услуга, не допускает значительной настройки; например, невозможно было настроить жизненный цикл задач.

Поэтому комитет по инфраструктуре Python Software Foundation объявил конкурс на системы отслеживания ошибок, попросив добровольцев настроить различные продукты и импортировать некоторые ошибки и патчи из SourceForge. Были рассмотрены четыре различные системы: [Jira](https://python-all.ru/3.0/whatsnew/2.6.html), [Launchpad](https://python-all.ru/3.0/whatsnew/2.6.html), [Roundup](https://python-all.ru/3.0/whatsnew/2.6.html) и [Trac](https://python-all.ru/3.0/whatsnew/2.6.html). В конечном итоге комитет остановился на Jira и Roundup как на двух кандидатах. Jira – коммерческий продукт, который бесплатно предоставляет размещённые экземпляры для проектов свободного программного обеспечения; Roundup – проект с открытым исходным кодом, требующий добровольцев для его администрирования и сервера для его размещения.

После публикации призыва добровольцев новая установка Roundup была развернута на [http://bugs.python.org](https://python-all.ru/3.0/whatsnew/2.6.html). Одна установка Roundup может обслуживать несколько трекеров, и этот сервер теперь также размещает трекеры задач для Jython и веб-сайта Python. В будущем он, безусловно, найдет и другие применения. Там, где это возможно, в этом выпуске «Что нового в Python» приводятся ссылки на соответствующие элементы ошибок/патчей для каждого изменения.

Хостинг для баг-трекера Python любезно предоставлен компанией [Upfront Systems](https://python-all.ru/3.0/whatsnew/2.6.html) из Стелленбоша, ЮАР. Мартин фон Лёвис проделал большую работу по импорту существующих ошибок и патчей из SourceForge; его скрипты для этой операции находятся по адресу [http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.0/whatsnew/2.6.html) и могут быть полезны другим проектам, желающим перейти с SourceForge на Roundup.

> **См. также**
>
> **[http://bugs.python.org](https://python-all.ru/3.0/whatsnew/2.6.html)**
>
> Система отслеживания ошибок Python.
>
> **[http://bugs.jython.org](https://python-all.ru/3.0/whatsnew/2.6.html):**
>
> Система отслеживания ошибок Jython.
>
> **[http://roundup.sourceforge.net/](https://python-all.ru/3.0/whatsnew/2.6.html)**
>
> Загрузки и документация Roundup.
>
> **[http://svn.python.org/view/tracker/importer/](https://python-all.ru/3.0/whatsnew/2.6.html)**
>
> Скрипты конвертации Мартина фон Лёвиса.

### Новый формат документации: reStructuredText с использованием Sphinx

Документация Python писалась с использованием LaTeX с момента запуска проекта около 1989 года. В 1980-х и начале 1990-х большинство документации распечатывалось для последующего изучения, а не просматривалось онлайн. LaTeX широко использовался, поскольку он обеспечивал привлекательный печатный вывод, оставаясь при этом простым в написании после освоения основных правил разметки.

Сегодня LaTeX всё ещё используется для написания публикаций, предназначенных для печати, но ландшафт инструментов программирования изменился. Мы больше не распечатываем кипы документации; вместо этого мы просматриваем её онлайн, и HTML стал самым важным форматом для поддержки. К сожалению, конвертация LaTeX в HTML довольно сложна, и Фред Л. Дрейк-младший, многолетний редактор документации Python, потратил много времени на поддержание процесса конвертации. Время от времени предлагали перевести документацию в SGML, а затем в XML, но выполнить хорошую конвертацию – большая задача, и никто не взял на себя необходимое для завершения работы время.

В ходе цикла разработки 2.6 Георг Брандль вложил много усилий в создание нового инструментария для обработки документации. Получившийся пакет называется Sphinx и доступен по адресу [http://sphinx.pocoo.org/](https://python-all.ru/3.0/whatsnew/2.6.html).

Sphinx ориентируется на вывод HTML, создавая привлекательно оформленный и современный HTML; печатный вывод по-прежнему поддерживается через конвертацию в LaTeX. Входной формат – reStructuredText, синтаксис разметки с поддержкой пользовательских расширений и директив, широко используемый в сообществе Python.

Sphinx – это самостоятельный пакет, который можно использовать для написания документации, и почти два десятка других проектов ([перечислены на веб-сайте Sphinx](https://python-all.ru/3.0/whatsnew/2.6.html)) приняли Sphinx в качестве своего инструмента документирования.

> **См. также**
>
> **[*Документирование Python*](https://python-all.ru/3.0/documenting/index.html#documenting-index)**
>
> Описывает, как писать документацию для Python.
>
> **[Sphinx](https://python-all.ru/3.0/whatsnew/2.6.html)**
>
> Документация и код для инструментария Sphinx.
>
> **[Docutils](https://python-all.ru/3.0/whatsnew/2.6.html)**
>
> Базовый парсер reStructuredText и набор инструментов.

## PEP 343: Оператор ‘with’

В предыдущей версии, Python 2.5, оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ был добавлен как опциональная возможность, включаемая директивой `from __future__ import with_statement`. В версии 2.6 этот оператор больше не требует специального включения, то есть [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) теперь всегда является ключевым словом. Остальная часть раздела представляет собой копию соответствующего раздела из документа «Что нового в Python 2.5»; если вы знакомы с оператором ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ из Python 2.5, этот раздел можно пропустить.

Инструкция ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ делает код понятнее: ранее для гарантии выполнения кода очистки приходилось использовать блоки `try...finally`. В этом разделе я расскажу о том, как обычно используется эта инструкция. В следующем разделе я рассмотрю детали реализации и покажу, как создавать объекты для работы с этой инструкцией.

Оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ – это управляющая конструкция, имеющая следующую базовую структуру:

```python
with expression [as variable]:
    with-block
```

Выражение вычисляется и должно дать объект, поддерживающий протокол управления контекстом (то есть имеющий методы [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__)).

Метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) объекта вызывается до выполнения *блока with* и, следовательно, может выполнить код настройки. Он также может возвращать значение, которое при наличии *переменной* привязывается к этому имени. (Обратите внимание: *variable* – это *не* результат вычисления *expression*.)

После завершения выполнения *блока with* вызывается метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) объекта, даже если блок возбудил исключение, и поэтому может выполнить код очистки.

Некоторые стандартные объекты Python теперь поддерживают протокол управления контекстом и могут использоваться с инструкцией ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘. Файловые объекты – один из примеров:

```python
with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
```

После выполнения этой инструкции файловый объект *f* будет автоматически закрыт, даже если цикл [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) возбудил исключение где-то посередине блока.

> **Примечание**
>
> В этом случае *f* – это тот же объект, созданный [`open()`](https://python-all.ru/3.0/library/functions.html#open), поскольку `file.__enter__()` возвращает *self*.

Блокировки и переменные условия модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) также поддерживают инструкцию ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘:

```python
lock = threading.Lock()
with lock:
    # Критическая секция кода
    ...
```

Блокировка захватывается перед выполнением блока и всегда освобождается после завершения блока.

Функция `localcontext()` в модуле [`decimal`](https://python-all.ru/3.0/library/decimal.html#module-decimal) упрощает сохранение и восстановление текущего десятичного контекста, который задаёт желаемую точность и правила округления для вычислений:

```python
from decimal import Decimal, Context, localcontext

# Отображается с точностью по умолчанию в 28 знаков
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # Весь код в этом блоке использует точность в 16 знаков.
    # Исходный контекст восстанавливается при выходе из блока.
    print v.sqrt()
```

### Написание контекстных менеджеров

Внутреннее устройство инструкции ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ довольно сложное. Большинство людей будут использовать ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ только вместе с существующими объектами и не нуждаются в знании этих деталей, поэтому можно пропустить остальную часть этого раздела, если захочется. Авторам новых объектов потребуется разобраться в деталях реализации и стоит продолжить чтение.

Объяснение протокола управления контекстом на высоком уровне:

- Выражение вычисляется и должно дать объект, называемый «менеджер контекста». Менеджер контекста должен иметь методы [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) и [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__).
- Вызывается метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) менеджера контекста. Возвращённое значение присваивается *VAR*. Если конструкция `as VAR` отсутствует, значение просто игнорируется.
- Код внутри *блока* выполняется.
- Если в блоке *BLOCK* возникает исключение, вызывается метод `__exit__(type, value, traceback)()` с деталями исключения – теми же значениями, которые возвращает [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info). Возвращаемое значение метода определяет, будет ли исключение проброшено заново: любое ложное значение приводит к повторному возбуждению, а `True` – к его подавлению. Подавлять исключение нужно лишь в редких случаях, поскольку если это сделать, автор кода, содержащего оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘, никогда не узнает, что что-то пошло не так.
- Если *BLOCK* не возбудил исключение, метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) всё равно вызывается, но *type*, *value* и *traceback* равны `None`.

Рассмотрим пример. Мы не будем приводить подробный код, а лишь в общих чертах опишем методы, необходимые для базы данных, поддерживающей транзакции.

(Для тех, кто не знаком с терминологией баз данных: набор изменений в базе данных группируется в транзакцию. Транзакции могут быть либо зафиксированы (committed) – это означает, что все изменения записаны в базу данных, либо откачены (rolled back) – что означает, что все изменения отменены, а база данных не изменена. За дополнительной информацией обращайтесь к любому учебнику по базам данных.)

Предположим, что существует объект, представляющий подключение к базе данных. Наша цель – позволить пользователю написать такой код:

```python
db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... дополнительные операции ...
```

Транзакция должна быть зафиксирована, если код в блоке выполняется без ошибок, или откатана при возникновении исключения. Вот базовый интерфейс для `DatabaseConnection`, который я буду предполагать:

```python
class DatabaseConnection:
    # Интерфейс базы данных
    def cursor(self):
        "Returns a cursor object and starts a new transaction"
    def commit(self):
        "Commits current transaction"
    def rollback(self):
        "Rolls back current transaction"
```

Метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__) довольно прост: ему нужно только начать новую транзакцию. Для данного приложения результирующий объект курсора был бы полезен, поэтому метод будет возвращать его. Затем пользователь может добавить `as cursor` в свою инструкцию ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘, чтобы привязать курсор к имени переменной.

```python
class DatabaseConnection:
    ...
    def __enter__(self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor
```

Метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) самый сложный, потому что в нём должна выполняться основная работа. Метод должен проверить, произошло ли исключение. Если исключения не было, транзакция фиксируется. Если было исключение, транзакция откатывается.

В приведённом ниже коде выполнение просто дойдёт до конца функции, вернув значение по умолчанию `None`. `None` – ложное значение, поэтому исключение будет автоматически возбуждено повторно. При желании можно сделать это явнее и добавить оператор [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return) в отмеченном месте.

```python
class DatabaseConnection:
    ...
    def __exit__(self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False
```

### Модуль contextlib

Модуль [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib) предоставляет несколько функций и декоратор, которые полезны при написании объектов для использования с оператором '[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)'.

Декоратор называется `contextmanager()` и позволяет написать одну функцию-генератор вместо определения нового класса. Генератор должен выдать ровно одно значение. Код до [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) выполняется как метод [`__enter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__enter__), а возвращаемое значение yield становится значением, которое будет связано с переменной в предложении [`as`](https://python-all.ru/3.0/reference/compound_stmts.html#with) оператора ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#as)‘ (если оно есть). Код после [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) выполняется в методе [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__). Любое исключение, возникшее в блоке, будет возбуждено оператором [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield).

Используя этот декоратор, наш пример с базой данных из предыдущего раздела можно было бы записать так:

```python
from contextlib import contextmanager

@contextmanager
def db_transaction(connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...
```

В модуле [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib) также есть функция `nested(mgr1, mgr2, ...)()`, которая объединяет несколько менеджеров контекста, чтобы не писать вложенные операторы ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘. В этом примере один оператор ‘[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)‘ одновременно начинает транзакцию базы данных и захватывает блокировку потока:

```python
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...
```

Наконец, функция `closing(object)()` возвращает *object*, чтобы его можно было привязать к переменной, и вызывает `object.close` в конце блока.

```python
import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
```

> **См. также**
>
> **[**PEP 343**](https://python-all.ru/3.0/whatsnew/2.6.html) – Оператор «with»**
>
> PEP написан Гвидо ван Россумом и Ником Когланом; реализован Майком Блэндом, Гвидо ван Россумом и Нилом Норвицем. В PEP показан код, генерируемый для оператора ‘
>
> [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)
>
> ‘, что может быть полезно для понимания его работы.
>
> Документация к модулю [`contextlib`](https://python-all.ru/3.0/library/contextlib.html#module-contextlib).

## PEP 366: Явные относительные импорты из главного модуля

Опция [*-m*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-m) в Python позволяет запускать модуль как сценарий. При запуске модуля, находящегося внутри пакета, относительные импорты работали некорректно.

Исправление для Python 2.6 добавляет атрибут `__package__` к модулям. Если этот атрибут присутствует, относительные импорты будут выполняться относительно значения этого атрибута, а не атрибута `__name__`.

Импортеры в стиле PEP 302 могут затем устанавливать `__package__` по мере необходимости. Модуль [`runpy`](https://python-all.ru/3.0/library/runpy.html#module-runpy), реализующий флаг [*-m*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-m), теперь делает это, так что относительные импорты теперь будут правильно работать в скриптах, запускаемых изнутри пакета.

## PEP 370: Персональный каталог `site-packages`

При запуске Python пути поиска модулей `sys.path` обычно включает каталог, путь которого заканчивается на `"site-packages"`. Этот каталог предназначен для хранения локально установленных пакетов, доступных всем пользователям машины или конкретной установки.

Python 2.6 вводит соглашение о каталогах site, специфичных для пользователя. Каталог зависит от платформы:

- Unix и Mac OS X: `~/.local/`
- Windows: `%APPDATA%/Python`

Внутри этого каталога будут подкаталоги, специфичные для версий, такие как `lib/python2.6/site-packages` в Unix/Mac OS и `Python26/site-packages` в Windows.

If you don’t like the default directory, it can be overridden by an environment variable. [**PYTHONUSERBASE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONUSERBASE) sets the root directory used for all Python versions supporting this feature. On Windows, the directory for application-specific data can be changed by setting the **APPDATA** environment variable. You can also modify the `site.py` file for your Python installation.

Эту возможность можно полностью отключить, запустив Python с ключом [*-s*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-s) или установив переменную окружения [**PYTHONNOUSERSITE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONNOUSERSITE).

> **См. также**
>
> **[**PEP 370**](https://python-all.ru/3.0/whatsnew/2.6.html) – Персональный каталог `site-packages`**
>
> PEP написан и реализован Кристианом Хеймсом.

## PEP 371: Пакет `multiprocessing`

Новый пакет [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) позволяет программам Python создавать новые процессы, которые будут выполнять вычисления и возвращать результат родительскому процессу. Родительский и дочерние процессы могут общаться с помощью очередей и каналов, синхронизировать свои операции с помощью блокировок и семафоров, а также могут совместно использовать простые массивы данных.

Модуль [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing) изначально был точной эмуляцией модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading), использующей процессы вместо потоков. Эта цель была отброшена на пути к Python 2.6, но общий подход модуля остаётся похожим. Основным классом является `Process`, которому передаётся вызываемый объект и набор аргументов. Метод `start()` запускает вызываемый объект в подпроцессе, после чего можно вызвать метод `is_alive()`, чтобы проверить, работает ли ещё подпроцесс, и метод `join()`, чтобы дождаться завершения процесса.

Вот простой пример, где подпроцесс вычисляет факториал. Функция, выполняющая вычисление, написана так, что она работает значительно дольше, когда входной аргумент кратен 4.

```python
import time
from multiprocessing import Process, Queue

def factorial(queue, N):
    "Compute a factorial."
    # If N is a multiple of 4, this function will take much longer.
    if (N % 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Put the result on the queue
    queue.put(fact)

if __name__ == '__main__':
    queue = Queue()

    N = 5

    p = Process(target=factorial, args=(queue, N))
    p.start()
    p.join()

    result = queue.get()
    print 'Factorial', N, '=', result
```

`очередь` используется для передачи входного параметра *N* и результата. Объект `очередь` хранится в глобальной переменной. Дочерний процесс использует значение переменной, которое было на момент его создания; поскольку это `очередь`, родительский и дочерний процессы могут общаться через этот объект. (Если бы родительский процесс изменил значение глобальной переменной, значение дочернего процесса осталось бы неизменным, и наоборот.)

Два других класса, `Pool` и `Manager`, предоставляют интерфейсы более высокого уровня. `Pool` создаёт фиксированное количество рабочих процессов, и затем запросы могут быть распределены между рабочими процессами вызовом `apply()` или `apply_async()` для добавления одного запроса, и [`map()`](https://python-all.ru/3.0/library/functions.html#map) или `map_async()` для добавления нескольких запросов. Следующий код использует `Pool` для распределения запросов между 5 рабочими процессами и получения списка результатов:

```python
from multiprocessing import Pool

def factorial(N, dictionary):
    "Compute a factorial."
    ...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
    print v
```

Это даёт следующий вывод:

```python
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
```

Другой интерфейс высокого уровня, класс `Manager`, создаёт отдельный серверный процесс, который может хранить главные копии структур данных Python. Другие процессы могут затем обращаться к этим структурам данных и изменять их с помощью прокси-объектов. Следующий пример создаёт общий словарь вызовом метода [`dict()`](https://python-all.ru/3.0/library/stdtypes.html#dict); затем рабочие процессы вставляют значения в словарь. (Блокировка не выполняется автоматически, что в этом примере не важно. Методы `Manager` также включают `Lock()`, `RLock()` и `Semaphore()` для создания общих блокировок.)

```python
import time
from multiprocessing import Pool, Manager

def factorial(N, dictionary):
    "Compute a factorial."
    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Store result in dictionary
    dictionary[N] = fact

if __name__ == '__main__':
    p = Pool(5)
    mgr = Manager()
    d = mgr.dict()         # Create shared dictionary

    # Run tasks using the pool
    for N in range(1, 1000, 10):
        p.apply_async(factorial, (N, d))

# Mark pool as closed -- no more tasks can be added.
p.close()

# Wait for tasks to exit
p.join()

# Output results
for k, v in sorted(d.items()):
    print k, v
```

Это выведет следующий результат:

```python
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
```

> **См. также**
>
> Документация для модуля [`multiprocessing`](https://python-all.ru/3.0/library/multiprocessing.html#module-multiprocessing).
>
> **[**PEP 371**](https://python-all.ru/3.0/whatsnew/2.6.html) – Добавление пакета multiprocessing**
>
> PEP написан Джесси Ноллером и Ричардом Удкерком; реализован Ричардом Удкерком и Джесси Ноллером.

## PEP 3101: Расширенное форматирование строк

В Python 3.0 оператор *%* дополнен более мощным методом форматирования строк [`format()`](https://python-all.ru/3.0/library/functions.html#format). Поддержка метода [`str.format()`](https://python-all.ru/3.0/library/stdtypes.html#str.format) была перенесена в Python 2.6.

В версии 2.6 как 8-битные, так и строки Unicode имеют метод *.format()*, который рассматривает строку как шаблон и принимает аргументы для форматирования. Шаблон форматирования использует фигурные скобки (*{*, *}*) в качестве специальных символов:

```python
>>> # Подставить позиционный аргумент 0 в строку
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # Использовать именованные аргументы-ключевые слова
>>> "User ID: {uid}   Last seen: {last_login}".format(
...    uid="root",
...    last_login = "5 Mar 2008 07:20")
'User ID: root   Last seen: 5 Mar 2008 07:20'
```

Фигурные скобки можно экранировать, удваивая их:

```python
>>> "Empty dict: {{}}".format()
"Empty dict: {}"
```

Имена полей могут быть целыми числами, указывающими на позиционные аргументы, например `{0}`, `{1}` и т.д., или именами именованных аргументов. Также можно указывать составные имена полей, которые читают атрибуты или получают доступ к ключам словаря:

```python
>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'
```

Обратите внимание, что при использовании нотации в стиле словаря, например `[.mp4]`, не нужно заключать строку в кавычки; значение будет найдено по ключу `.mp4`. Строки, начинающиеся с цифры, преобразуются в целое число. Внутри строки формата нельзя писать более сложные выражения.

До сих пор мы показывали, как указать, какое поле подставить в результирующую строку. Точное форматирование также можно контролировать, добавляя двоеточие и спецификатор формата. Например:

```python
>>> # Поле 0: выравнивание влево, заполнить до 15 символов
>>> # Поле 1: выравнивание вправо, заполнить до 6 символов
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
>>> fmt.format('Tutorial', 50)
'Tutorial        $    50'
>>> fmt.format('Banquet', 125)
'Banquet         $   125'
```

Спецификаторы формата могут ссылаться на другие поля через вложение:

```python
>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234  '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234                      '
```

Выравнивание поля в заданной ширине можно указать:

| Символ | Эффект |
| --- | --- |
| \< (по умолчанию) | Выравнивание влево |
| \> | Выравнивание вправо |
| ^ | По центру |
| = | (Только для числовых типов) Заполнение после знака. |

Спецификаторы формата также могут включать тип представления, который управляет форматированием значения. Например, числа с плавающей запятой могут быть отформатированы как обычное число или в экспоненциальной нотации:

```python
>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
```

Доступны различные типы представления. Обратитесь к документации Python 2.6 за [*полным списком*](https://python-all.ru/3.0/library/string.html#formatstrings); вот пример:

| `b` | Двоичный. Выводит число по основанию 2. |
| --- | --- |
| `c` | Символьный. Преобразует целое число в соответствующий символ Unicode перед выводом. |
| `d` | Десятичное целое. Выводит число в системе с основанием 10. |
| `o` | Восьмеричный формат. Выводит число в системе с основанием 8. |
| `x` | Шестнадцатеричный. Выводит число по основанию 16, используя строчные буквы для цифр старше 9. |
| `e` | Экспоненциальная запись. Выводит число в научной нотации с использованием буквы 'e' для обозначения экспоненты. |
| `g` | Общий формат. Выводит число в формате с фиксированной точкой, если только число не слишком велико, в этом случае переключается на экспоненциальную нотацию 'e'. |
| `n` | Число. Аналогично 'g' (для чисел с плавающей запятой) или 'd' (для целых чисел), но с использованием текущей локали для вставки соответствующих разделителей разрядов. |
| `%` | Проценты. Умножает число на 100 и выводит в фиксированном формате ('f'), с последующим знаком процента. |

Классы и типы могут определить метод [`__format__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__format__), чтобы управлять тем, как они форматируются. Он получает один аргумент – спецификатор формата:

```python
def __format__(self, format_spec):
    if isinstance(format_spec, unicode):
        return unicode(str(self))
    else:
        return str(self)
```

Существует также встроенная функция [`format()`](https://python-all.ru/3.0/library/functions.html#format), которая форматирует одно значение. Она вызывает метод [`__format__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__format__) типа с указанным спецификатором:

```python
>>> format(75.6564, '.2f')
'75.66'
```

> **См. также**
>
> **[*Синтаксис строк форматирования*](https://python-all.ru/3.0/library/string.html#formatstrings)**
>
> Справочная документация по полям формата.
>
> **[**PEP 3101**](https://python-all.ru/3.0/whatsnew/2.6.html) - Расширенное форматирование строк**
>
> PEP написан Талином. Реализован Эриком Смитом.

## PEP 3105: `print` как функция

Инструкция `print` становится функцией [`print()`](https://python-all.ru/3.0/library/functions.html#print) в Python 3.0. Превращение [`print()`](https://python-all.ru/3.0/library/functions.html#print) в функцию позволяет заменить её, написав `def print(...)` или импортировав новую функцию откуда-то ещё.

В Python 2.6 есть импорт `__future__`, который удаляет `print` как синтаксис языка, позволяя вместо этого использовать функциональную форму. Например:

```python
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
```

Сигнатура новой функции:

```python
def print(*args, sep=' ', end='\n', file=None)
```

Параметры:

> - *args*: позиционные аргументы, значения которых будут выведены.
> - *sep*: разделитель, который будет выводиться между аргументами.
> - *end*: завершающий текст, который будет выведен после того, как все аргументы будут выведены.
> - *file*: файловый объект, в который будет отправлен вывод.

> **См. также**
>
> **[**PEP 3105**](https://python-all.ru/3.0/whatsnew/2.6.html) - Сделать print функцией**
>
> PEP написан Георгом Брандлом.

## PEP 3110: Изменения в обработке исключений

Одна ошибка, которую иногда допускают программисты Python, – написание следующего кода:

```python
try:
    ...
except TypeError, ValueError:  # Неверно!
    ...
```

Вероятно, автор пытается перехватить исключения [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), но этот код на самом деле делает нечто иное: он перехватывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и связывает полученный объект исключения с локальным именем `"ValueError"`. Исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) не будет перехвачено вовсе. Правильный код указывает кортеж исключений:

```python
try:
    ...
except (TypeError, ValueError):
    ...
```

Эта ошибка возникает из-за неоднозначности использования запятой: обозначает ли она два разных узла в дереве разбора или один узел, являющийся кортежем?

Python 3.0 устраняет эту неоднозначность, заменяя запятую словом «as». Чтобы перехватить исключение и сохранить объект исключения в переменной `exc`, нужно написать:

```python
try:
    ...
except TypeError as exc:
    ...
```

Python 3.0 будет поддерживать только использование «as» и, следовательно, интерпретирует первый пример как перехват двух разных исключений. Python 2.6 поддерживает как запятую, так и «as», поэтому существующий код продолжит работать. Поэтому рекомендуется использовать «as» при написании нового кода Python, который будет выполняться только в 2.6.

> **См. также**
>
> **[**PEP 3110**](https://python-all.ru/3.0/whatsnew/2.6.html) - Перехват исключений в Python 3000**
>
> PEP написан и реализован Коллином Уинтером.

## PEP 3112: Байтовые литералы

Python 3.0 принимает Unicode в качестве основного строкового типа языка и обозначает 8-битные литералы иначе: либо как `b'string'`, либо с помощью конструктора [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes). Для обратной совместимости Python 2.6 добавляет [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) как синоним для типа [`str`](https://python-all.ru/3.0/library/functions.html#str), а также поддерживает нотацию `b''`.

Тип [`str`](https://python-all.ru/3.0/library/functions.html#str) в 2.6 отличается от типа [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) в 3.0 по нескольким параметрам; самое заметное – конструктор совершенно другой. В 3.0 `bytes([65, 66, 67])` состоит из 3 элементов и содержит байты, соответствующие `ABC`; в 2.6 `bytes([65, 66, 67])` возвращает 12-байтовую строку, представляющую результат [`str()`](https://python-all.ru/3.0/library/functions.html#str) от списка.

Основное применение [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) в Python 2.6 будет заключаться в написании проверок типа объекта, таких как `isinstance(x, bytes)`. Это поможет конвертеру 2to3, который не может определить, предполагается ли в коде 2.x, что строки содержат символы или 8-битные байты; теперь можно использовать либо [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes), либо [`str`](https://python-all.ru/3.0/library/functions.html#str), чтобы точно выразить своё намерение, и полученный код также будет корректен в Python 3.0.

Существует также импорт `__future__`, который приводит к тому, что все строковые литералы становятся строками Unicode. Это означает, что управляющие последовательности `\u` можно использовать для включения символов Unicode:

```python
from __future__ import unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

print len(s)               # 12 Unicode characters
```

На уровне C Python 3.0 переименует существующий 8-битный строковый тип, называемый в Python 2.x `PyStringObject`, в [`PyBytesObject`](https://python-all.ru/3.0/c-api/bytes.html#PyBytesObject). Python 2.6 использует `#define`, чтобы поддерживать использование имён [`PyBytesObject`](https://python-all.ru/3.0/c-api/bytes.html#PyBytesObject), [`PyBytes_Check`](https://python-all.ru/3.0/c-api/bytes.html#PyBytes_Check), [`PyBytes_FromStringAndSize`](https://python-all.ru/3.0/c-api/bytes.html#PyBytes_FromStringAndSize) и всех остальных функций и макросов, используемых со строками.

Экземпляры типа [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes) неизменяемы, как и строки. Новый тип [`bytearray`](https://python-all.ru/3.0/library/functions.html#bytearray) хранит изменяемую последовательность байтов:

```python
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
```

Массивы байтов поддерживают большинство методов строковых типов, таких как `startswith()`/`endswith()`, `find()`/`rfind()`, а также некоторые методы списков, например `append()`, `pop()` и `reverse()`.

```python
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
```

Существует также соответствующий C API с функциями [`PyByteArray_FromObject`](https://python-all.ru/3.0/c-api/bytearray.html#PyByteArray_FromObject), [`PyByteArray_FromStringAndSize`](https://python-all.ru/3.0/c-api/bytearray.html#PyByteArray_FromStringAndSize) и различными другими функциями.

> **См. также**
>
> **[**PEP 3112**](https://python-all.ru/3.0/whatsnew/2.6.html) - Байтовые литералы в Python 3000**
>
> PEP написан Джейсоном Орендорфом; портирован в 2.6 Кристианом Хаймсом.

## PEP 3116: Новая библиотека ввода-вывода

Встроенные файловые объекты Python поддерживают множество методов, но файлоподобные объекты не обязательно поддерживают их все. Объекты, имитирующие файлы, обычно поддерживают `read()` и `write()`, но могут не поддерживать, например, `readline()`. Python 3.0 представляет многоуровневую библиотеку ввода-вывода в модуле [`io`](https://python-all.ru/3.0/library/io.html#module-io), которая разделяет функции буферизации и обработки текста и базовые операции чтения и записи.

Модуль [`io`](https://python-all.ru/3.0/library/io.html#module-io) предоставляет три уровня абстрактных базовых классов:

- `RawIOBase` определяет низкоуровневые операции ввода-вывода: `read()`, `readinto()`, `write()`, `seek()`, `tell()`, `truncate()` и `close()`. Большинство методов этого класса обычно отображаются на один системный вызов. Также есть методы `readable()`, `writable()` и `seekable()` для определения того, какие операции разрешены для данного объекта.

  Python 3.0 имеет конкретные реализации этого класса для файлов и сокетов, но Python 2.6 не перестраивал свои файловые объекты и сокеты таким образом.
- `BufferedIOBase` – это абстрактный базовый класс, который буферизует данные в памяти, чтобы уменьшить количество используемых системных вызовов, делая обработку ввода-вывода более эффективной. Он поддерживает все методы `RawIOBase` и добавляет атрибут `raw`, содержащий базовый низкоуровневый объект.

  Есть пять конкретных классов, реализующих этот ABC. `BufferedWriter` и `BufferedReader` предназначены для объектов, поддерживающих только запись или только чтение, которые имеют метод `seek()` для произвольного доступа. Объекты `BufferedRandom` поддерживают чтение и запись на одном и том же базовом потоке, а `BufferedRWPair` предназначен для таких объектов, как TTY, которые имеют операции чтения и записи, действующие на несвязанных потоках данных. Класс `BytesIO` поддерживает чтение, запись и позиционирование в буфере в памяти.
- `TextIOBase`: предоставляет функции для чтения и записи строк (помните, что в Python 3.0 строки будут в Юникоде), а также поддержку универсальных символов новой строки. `TextIOBase` определяет метод `readline()` и поддерживает итерацию по объектам.

  Есть две конкретные реализации. `TextIOWrapper` оборачивает буферизованный объект ввода-вывода, поддерживая все методы для текстового ввода-вывода и добавляя атрибут `buffer` для доступа к базовому объекту. `StringIO` просто буферизует всё в памяти, никогда ничего не записывая на диск.

  (В Python 2.6 [`io.StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) реализован на чистом Python, поэтому он довольно медленный. Поэтому пока следует придерживаться существующего модуля `StringIO` или `cStringIO`. Рано или поздно модуль [`io`](https://python-all.ru/3.0/library/io.html#module-io) Python 3.0 будет переписан на C для ускорения, и, возможно, реализация на C будет перенесена в версии 2.x.)

В Python 2.6 базовые реализации не были перестроены, чтобы основываться на классах модуля [`io`](https://python-all.ru/3.0/library/io.html#module-io). Этот модуль предоставляется, чтобы упростить написание кода, совместимого с Python 3.0, и избавить разработчиков от необходимости писать собственные реализации буферизации и текстового ввода-вывода.

> **См. также**
>
> **[**PEP 3116**](https://python-all.ru/3.0/whatsnew/2.6.html) - Новый ввод-вывод**
>
> PEP написан Дэниелом Штуцбахом, Майком Вердоне и Гвидо ван Россумом. Код – Гвидо ван Россум, Георг Брандль, Вальтер Дёрвальд, Джереми Хилтон, Мартин фон Лёвис, Тони Лаундс и другие.

## PEP 3118: Пересмотренный буферный протокол

Протокол буфера – это C-уровневый API, который позволяет типам Python обмениваться указателями на свои внутренние представления. Например, файл, отображаемый в память, можно рассматривать как буфер символов, и это позволяет другому модулю, например [`re`](https://python-all.ru/3.0/library/re.html#module-re), обрабатывать такие файлы как строку символов для поиска.

Основными пользователями буферного протокола являются пакеты для численных расчетов, такие как NumPy, которые предоставляют доступ к внутреннему представлению массивов, чтобы вызывающие могли записывать данные напрямую в массив, а не через более медленный API. Данный PEP обновляет буферный протокол с учетом опыта разработки NumPy, добавляя ряд новых возможностей, таких как указание формы массива или блокировка области памяти.

Самая важная новая функция C API – это `PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)`, которая принимает объект и набор флагов и заполняет структуру `Py_buffer` информацией о представлении объекта в памяти. Объекты могут использовать эту операцию для блокировки памяти, пока внешний вызывающий код может изменять содержимое, поэтому существует соответствующая функция `PyBuffer_Release(Py_buffer *view)`, чтобы сообщить, что внешний вызывающий код завершил работу.

Аргумент *flags* функции [`PyObject_GetBuffer`](https://python-all.ru/3.0/c-api/buffer.html#PyObject_GetBuffer) задаёт ограничения на возвращаемую память. Вот несколько примеров:

> - `PyBUF_WRITABLE` указывает, что память должна быть доступна для записи.
> - `PyBUF_LOCK` запрашивает блокировку только для чтения или исключительную блокировку памяти.
> - `PyBUF_C_CONTIGUOUS` и `PyBUF_F_CONTIGUOUS` запрашивают C-непрерывный (последнее измерение изменяется быстрее всего) или Fortran-непрерывный (первое измерение изменяется быстрее всего) макет массива.

Два новых кода аргументов для [`PyArg_ParseTuple`](https://python-all.ru/3.0/c-api/arg.html#PyArg_ParseTuple), `s*` и `z*`, возвращают заблокированные буферные объекты для параметра.

> **См. также**
>
> **[**PEP 3118**](https://python-all.ru/3.0/whatsnew/2.6.html) - Пересмотр буферного протокола**
>
> PEP написан Трэвисом Олифантом и Карлом Бэнксом; реализован Трэвисом Олифантом.

## PEP 3119: Абстрактные базовые классы

Некоторые объектно-ориентированные языки, такие как Java, поддерживают интерфейсы, объявляя, что класс имеет заданный набор методов или поддерживает определённый протокол доступа. Абстрактные базовые классы (ABC) – это аналогичная возможность для Python. Поддержка ABC состоит из модуля [`abc`](https://python-all.ru/3.0/library/abc.html#module-abc), содержащего метакласс с именем `ABCMeta`, специальной обработки этого метакласса встроенными функциями [`isinstance()`](https://python-all.ru/3.0/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.0/library/functions.html#issubclass), а также набора базовых ABC, которые разработчики Python считают широко полезными. Будущие версии Python, вероятно, добавят больше ABC.

Допустим, у вас есть некий класс, и вы хотите узнать, поддерживает ли он доступ в стиле словаря. Однако фраза «стиль словаря» расплывчата. Вероятно, это означает, что доступ к элементам через `obj[1]` работает. Подразумевает ли это, что присваивание элементов через `obj[2] = value` тоже работает? Или что объект будет иметь методы `keys()`, `values()` и `items()`? А итеративные варианты, такие как `iterkeys()`? `copy()` и `update()`? Итерация по объекту с помощью [`iter()`](https://python-all.ru/3.0/library/functions.html#iter)?

Модуль [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections) в Python 2.6 содержит несколько разных ABC, отражающих эти различия. `Iterable` означает, что класс определяет [`__iter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__iter__), а `Container` – что класс определяет метод [`__contains__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__contains__) и, следовательно, поддерживает выражения `x in y`. Базовый интерфейс словаря – получение и установка элементов, а также `keys()`, `values()` и `items()` – определяется ABC `MutableMapping`.

Можно наследовать свои классы от конкретной ABC, чтобы указать, что они поддерживают интерфейс этой ABC:

```python
import collections

class Storage(collections.MutableMapping):
    ...
```

В качестве альтернативы можно написать класс без наследования от нужного ABC и вместо этого зарегистрировать класс, вызвав метод `register()` этого ABC:

```python
import collections

class Storage:
    ...

collections.MutableMapping.register(Storage)
```

Для классов, которые вы пишете, наследование от ABC, вероятно, понятнее. Метод `register()` полезен, когда вы написали новый ABC, который может описать существующий тип или класс, или если вы хотите объявить, что какой-то сторонний класс реализует ABC. Например, если вы определили ABC `PrintableType`, то вполне допустимо сделать так:

```python
# Зарегистрировать типы Python
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
```

Классы должны следовать семантике, заданной ABC, но Python не может это проверить; автор класса должен сам понять требования ABC и реализовать код соответствующим образом.

Чтобы проверить, поддерживает ли объект определённый интерфейс, можно теперь написать:

```python
def func(d):
    if not isinstance(d, collections.MutableMapping):
        raise ValueError("Mapping object expected, not %r" % d)
```

Не думайте, что теперь нужно начинать писать множество проверок, как в примере выше. У Python сложилась сильная традиция утиной типизации, где явная проверка типов никогда не выполняется, а код просто вызывает методы объекта, полагаясь, что эти методы существуют, и возбуждает исключение, если их нет. Будьте осмотрительны при проверке ABC и делайте это только в случае крайней необходимости.

Можно создавать собственные ABC, используя `abc.ABCMeta` в качестве метакласса в определении класса:

```python
from abc import ABCMeta, abstractmethod

class Drawable():
    __metaclass__ = ABCMeta

    @abstractmethod
    def draw(self, x, y, scale=1.0):
        pass

    def draw_doubled(self, x, y):
        self.draw(x, y, scale=2.0)

class Square(Drawable):
    def draw(self, x, y, scale):
        ...
```

В приведённом выше ABC `Drawable` метод `draw_doubled()` отображает объект в двойном размере и может быть реализован через другие методы, описанные в `Drawable`. Поэтому классам, реализующим этот ABC, не нужно предоставлять собственную реализацию `draw_doubled()`, хотя они могут это сделать. Однако реализация `draw()` обязательна; ABC не может предоставить полезную общую реализацию.

К методам, которые обязательно должны быть реализованы, можно применить декоратор `@abstractmethod`, например к `draw()`; тогда Python будет возбуждать исключение для классов, не определяющих этот метод. Обратите внимание, что исключение возбуждается только при попытке создать экземпляр подкласса, в котором отсутствует данный метод:

```python
>>> class Circle(Drawable):
...     pass
...
>>> c = Circle()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
```

Абстрактные атрибуты данных можно объявить с помощью декоратора `@abstractproperty`:

```python
from abc import abstractproperty
...

@abstractproperty
def readonly(self):
   return self._x
```

Подклассы затем должны определить свойство [`readonly()`](https://python-all.ru/3.0/c-api/buffer.html#readonly).

> **См. также**
>
> **[**PEP 3119**](https://python-all.ru/3.0/whatsnew/2.6.html) – Введение абстрактных базовых классов**
>
> PEP написан Гвидо ван Россумом и Талином. Реализован Гвидо ван Россумом. Портирован в 2.6 Бенджамином Арангуреном при участии Алекса Мартелли.

## PEP 3127: Поддержка и синтаксис целочисленных литералов

Python 3.0 изменяет синтаксис восьмеричных (основание 8) целочисленных литералов, добавляя префикс «0o» или «0O» вместо ведущего нуля, а также добавляет поддержку двоичных (основание 2) целочисленных литералов с префиксом «0b» или «0B».

Python 2.6 не отказывается от поддержки ведущего нуля для восьмеричных чисел, но добавляет поддержку «0o» и «0b»:

```python
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
```

Встроенная функция [`oct()`](https://python-all.ru/3.0/library/functions.html#oct) по-прежнему возвращает числа с ведущим нулём, а новая встроенная функция [`bin()`](https://python-all.ru/3.0/library/functions.html#bin) возвращает двоичное представление числа:

```python
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
```

Встроенные функции [`int()`](https://python-all.ru/3.0/library/functions.html#int) и `long()` теперь принимают префиксы “0o” и “0b” при запросе основания 8 или 2, или когда аргумент *base* равен нулю (что означает, что используемое основание должно определяться из строки):

```python
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
```

> **См. также**
>
> **[**PEP 3127**](https://python-all.ru/3.0/whatsnew/2.6.html) – Поддержка и синтаксис целочисленных литералов**
>
> PEP написан Патриком Мопином; портирован в 2.6 Эриком Смитом.

## PEP 3129: Декораторы классов

Декораторы были расширены с функций на классы. Теперь допустимо написать:

```python
@foo
@bar
class A:
  pass
```

Это эквивалентно:

```python
class A:
  pass

A = foo(bar(A))
```

> **См. также**
>
> **[**PEP 3129**](https://python-all.ru/3.0/whatsnew/2.6.html) - Декораторы классов**
>
> PEP написан Коллином Уинтером.

## PEP 3141: Иерархия типов для чисел

Python 3.0 добавляет несколько абстрактных базовых классов для числовых типов, вдохновлённых числовой башней Scheme. Эти классы были перенесены в Python 2.6 как модуль [`numbers`](https://python-all.ru/3.0/library/numbers.html#module-numbers).

Самый общий ABC – это `Number`. Он не определяет никаких операций и существует только для того, чтобы можно было проверить, является ли объект числом, с помощью `isinstance(obj, Number)`.

`Complex` является подклассом `Number`. Комплексные числа поддерживают основные операции сложения, вычитания, умножения, деления и возведения в степень, а также позволяют получить действительную и мнимую части и сопряжённое число. Встроенный комплексный тип Python является реализацией `Complex`.

`Real` является подклассом `Complex` и добавляет операции, которые работают только с вещественными числами: `floor()`, `trunc()`, округление, взятие остатка по модулю N, целочисленное деление и сравнения.

Числа `Rational` происходят от `Real`, имеют свойства `numerator` и `denominator` и могут быть преобразованы в числа с плавающей запятой. Python 2.6 добавляет простой класс рациональных чисел `Fraction` в модуле [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions). (Он называется `Fraction`, а не `Rational`, чтобы избежать конфликта имён с [`numbers.Rational`](https://python-all.ru/3.0/library/numbers.html#numbers.Rational).)

Целые числа `Integral` происходят от `Rational` и могут сдвигаться влево и вправо с помощью `<<` и `>>`, комбинироваться с помощью побитовых операций, таких как `&` и `|`, а также использоваться в качестве индексов массивов и границ срезов.

В Python 3.0 PEP слегка переопределяет существующие встроенные функции [`round()`](https://python-all.ru/3.0/library/functions.html#round), [`math.floor()`](https://python-all.ru/3.0/library/math.html#math.floor), [`math.ceil()`](https://python-all.ru/3.0/library/math.html#math.ceil) и добавляет новую – [`math.trunc()`](https://python-all.ru/3.0/library/math.html#math.trunc), которая была перенесена в Python 2.6. [`math.trunc()`](https://python-all.ru/3.0/library/math.html#math.trunc) округляет к нулю, возвращая ближайшее `Integral`, которое находится между аргументом функции и нулём.

> **См. также**
>
> **[**PEP 3141**](https://python-all.ru/3.0/whatsnew/2.6.html) – Иерархия типов для чисел**
>
> PEP написан Джеффри Яскиным.
>
> [Числовая башня Scheme](https://python-all.ru/3.0/whatsnew/2.6.html) из руководства по Guile.
>
> [Типы чисел Scheme](https://python-all.ru/3.0/whatsnew/2.6.html) из спецификации R5RS Scheme.

### Модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions)

Чтобы дополнить иерархию числовых типов, модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions) предоставляет класс рациональных чисел. Рациональные числа хранят свои значения в виде числителя и знаменателя, образующих дробь, и могут точно представлять такие числа, как `2/3`, которые числа с плавающей запятой могут лишь аппроксимировать.

Конструктор `Fraction` принимает два целых значения `Integral`, которые будут числителем и знаменателем результирующей дроби.

```python
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
```

Для преобразования чисел с плавающей запятой в рациональные числа тип float теперь имеет метод `as_integer_ratio()`, который возвращает числитель и знаменатель дроби, равной тому же значению с плавающей запятой:

```python
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
```

Обратите внимание: значения, которые могут быть лишь аппроксимированы числами с плавающей запятой, например 1./3, не упрощаются до аппроксимируемого числа; дробь пытается соответствовать значению с плавающей запятой **в точности**.

Модуль [`fractions`](https://python-all.ru/3.0/library/fractions.html#module-fractions) основан на реализации Шурда Мулендера (Sjoerd Mullender), которая долгое время находилась в каталоге `Demo/classes/` в Python. Эта реализация была значительно обновлена Джеффри Яскином (Jeffrey Yasskin).

## Прочие изменения языка

Некоторые небольшие изменения, внесённые в ядро языка Python:

- Функция [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) перехватывала и игнорировала все ошибки, предполагая, что они означают, что метод [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__) каким-то образом не сработал и возвращаемое значение [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) поэтому будет `False`. Однако эту логику не следует применять к [`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt) и [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit); Python 2.6 больше не будет отбрасывать такие исключения, когда [`hasattr()`](https://python-all.ru/3.0/library/functions.html#hasattr) сталкивается с ними. (Исправлено Бенджамином Петерсоном (Benjamin Peterson); [issue 2196](https://python-all.ru/3.0/whatsnew/2.6.html).)
- При вызове функции с использованием синтаксиса `**` для передачи именованных аргументов больше не требуется использовать словарь Python; теперь подойдёт любое отображение:

  ```python
  >>> def f(**kw):
  ...    print sorted(kw)
  ...
  >>> ud=UserDict.UserDict()
  >>> ud['a'] = 1
  >>> ud['b'] = 'string'
  >>> f(**ud)
  ['a', 'b']
  ```

  (Автор: Александр Белопольский (Alexander Belopolsky); [issue 1686487](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Также стало разрешено указывать именованные аргументы после аргумента `*args` в вызове функции.

  ```python
  >>> def f(*args, **kw):
  ...     print args, kw
  ...
  >>> f(1,2,3, *(4,5,6), keyword=13)
  (1, 2, 3, 4, 5, 6) {'keyword': 13}
  ```

  Раньше это приводило бы к синтаксической ошибке. (Автор: Амори Форжо д’Арк (Amaury Forgeot d’Arc); [issue 3473](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Новая встроенная функция `next(iterator, [default])` возвращает следующий элемент из указанного итератора. Если указан аргумент *default*, то он будет возвращён, если *iterator* исчерпан; в противном случае будет возбуждено исключение [`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration). (Перенесено в [issue 2719](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Теперь кортежи имеют методы `index()` и `count()`, соответствующие методам `index()` и `count()` списков:

  ```python
  >>> t = (0,1,2,3,4,0,1,2)
  >>> t.index(3)
  3
  >>> t.count(0)
  2
  ```

  (Автор: Рэймонд Хеттингер)
- Встроенные типы теперь имеют улучшенную поддержку расширенного синтаксиса срезов, принимая различные комбинации `(start, stop, step)`. Раньше поддержка была частичной, и некоторые граничные случаи не работали. (Реализовано Томасом Воутерсом (Thomas Wouters).)
- Свойства теперь имеют три атрибута: `getter`, `setter` и `deleter`, которые являются декораторами, предоставляющими удобные сокращения для добавления функции чтения, записи или удаления к существующему свойству. Использовать их можно так:

  ```python
  class C(object):
      @property
      def x(self):
          return self._x

      @x.setter
      def x(self, value):
          self._x = value

      @x.deleter
      def x(self):
          del self._x

  class D(C):
      @C.x.getter
      def x(self):
          return self._x * 2

      @x.setter
      def x(self, value):
          self._x = value / 2
  ```
- Несколько методов встроенных типов множеств теперь принимают несколько итерируемых объектов: `intersection()`, `intersection_update()`, `union()`, `update()`, `difference()` и `difference_update()`.

  ```python
  >>> s=set('1234567890')
  >>> s.intersection('abc123', 'cdf246')  # Пересечение всех входных данных
  set(['2'])
  >>> s.difference('246', '789')
  set(['1', '0', '3', '5'])
  ```

  (Автор: Raymond Hettinger.)
- Добавлено много возможностей для чисел с плавающей запятой. Функция [`float()`](https://python-all.ru/3.0/library/functions.html#float) теперь преобразует строку `nan` в значение IEEE 754 Not A Number, а `+inf` и `-inf` – в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Другие функции модуля [`math`](https://python-all.ru/3.0/library/math.html#module-math), `isinf()` и `isnan()`, возвращают true, если их аргумент с плавающей запятой является бесконечным или Not A Number. ([issue 1640](https://python-all.ru/3.0/whatsnew/2.6.html))

  Были добавлены функции преобразования чисел с плавающей запятой в шестнадцатеричные строки ([issue 3008](https://python-all.ru/3.0/whatsnew/2.6.html)). Эти функции преобразуют числа с плавающей запятой в строковое представление и обратно, не внося ошибок округления при преобразовании между десятичной и двоичной системами. Числа с плавающей запятой имеют метод [`hex()`](https://python-all.ru/3.0/library/functions.html#hex), возвращающий строковое представление, а метод `float.fromhex()` преобразует строку обратно в число:

  ```python
  >>> a = 3.75
  >>> a.hex()
  '0x1.e000000000000p+1'
  >>> float.fromhex('0x1.e000000000000p+1')
  3.75
  >>> b=1./3
  >>> b.hex()
  '0x1.5555555555555p-2'
  ```
- Числовая тонкость: при создании комплексного числа из двух чисел с плавающей запятой в системах, поддерживающих знаковые нули (-0 и +0), конструктор [`complex()`](https://python-all.ru/3.0/library/functions.html#complex) теперь сохраняет знак нуля. (Исправлено Марком Т. Дикинсоном; [issue 1507](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Классы, которые наследуют метод [`__hash__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__hash__) от родительского класса, могут установить `__hash__ = None`, чтобы указать, что класс не является хешируемым. Это заставит `hash(obj)` вызывать исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), и класс не будет считаться реализующим ABC `Hashable`.

  Это следует делать, когда определён метод `__cmp__()` или [`__eq__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__eq__), который сравнивает объекты по значению, а не по идентичности. Все объекты имеют метод хеширования по умолчанию, использующий `id(obj)` в качестве хеш-значения. Не существует аккуратного способа удалить метод [`__hash__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__hash__), унаследованный от родительского класса, поэтому присваивание `None` было реализовано как переопределение. На уровне C расширения могут установить `tp_hash` в [`PyObject_HashNotImplemented`](https://python-all.ru/3.0/c-api/object.html#PyObject_HashNotImplemented). (Исправлено Ником Когланом и Амари Форжо д’Арк; [issue 2235](https://python-all.ru/3.0/whatsnew/2.6.html).)
- В интерфейс `исключение` продолжают вноситься изменения, как того требует [**PEP 352**](https://python-all.ru/3.0/whatsnew/2.6.html). В версии 2.6 атрибут `message` объявлен устаревшим в пользу атрибута `args`.
- Исключение [`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit) теперь наследуется от [`BaseException`](https://python-all.ru/3.0/library/exceptions.html#exceptions.BaseException) вместо [`Exception`](https://python-all.ru/3.0/library/exceptions.html#exceptions.Exception). Это означает, что обработчик исключений вида `except Exception:` не будет случайно перехватывать [`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit). (Предложено Чедом Остином; [issue 1537](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Объекты-генераторы теперь имеют атрибут `gi_code`, который ссылается на исходный объект кода, лежащий в основе генератора. (Предложено Коллином Уинтером; [issue 1473257](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Встроенная функция [`compile()`](https://python-all.ru/3.0/library/functions.html#compile) теперь принимает именованные аргументы, а также позиционные параметры. (Предложено Томасом Воутерсом; [issue 1444529](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Конструктор [`complex()`](https://python-all.ru/3.0/library/functions.html#complex) теперь принимает строки, содержащие комплексные числа в скобках, то есть `complex(repr(cplx))` теперь будет возвращать исходное значение. Например, `complex('(3+4j)')` теперь возвращает значение (3+4j). ([issue 1491866](https://python-all.ru/3.0/whatsnew/2.6.html))
- Метод строки `translate()` теперь принимает `None` в качестве параметра таблицы перевода, который рассматривается как тождественное преобразование. Это упрощает выполнение операций, которые только удаляют символы. (Предложено Бенгтом Рихтером и реализовано Рэймондом Хеттингером; [issue 1193128](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Встроенная функция [`dir()`](https://python-all.ru/3.0/library/functions.html#dir) теперь проверяет наличие метода [`__dir__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__dir__) у получаемых объектов. Этот метод должен возвращать список строк, содержащих имена допустимых атрибутов объекта, и позволяет объекту контролировать значение, которое возвращает [`dir()`](https://python-all.ru/3.0/library/functions.html#dir). Объекты, имеющие методы [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattribute__), могут использовать это для рекламирования псевдоатрибутов, которые они будут поддерживать. ([issue 1591665](https://python-all.ru/3.0/whatsnew/2.6.html))
- Объекты методов экземпляра имеют новые атрибуты для объекта и функции, составляющих метод; новый синоним для `im_self` – это `__self__`, а `im_func` также доступен как `__func__`. Старые имена по-прежнему поддерживаются в Python 2.6, но исчезли в 3.0.
- An obscure change: when you use the the [`locals()`](https://python-all.ru/3.0/library/functions.html#locals) function inside a [`class`](https://python-all.ru/3.0/reference/compound_stmts.html#class) statement, the resulting dictionary no longer returns free variables. (Free variables, in this case, are variables referenced in the [`class`](https://python-all.ru/3.0/reference/compound_stmts.html#class) statement that aren’t attributes of the class.)

### Оптимизации

- Модуль [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) был переписан на C. Это позволяет вызывать предупреждения из парсера и может также ускорить запуск интерпретатора. (Предложено Нилом Норвитцем и Бреттом Кэнноном; [issue 1631171](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Объекты типов теперь имеют кэш методов, который может сократить работу, необходимую для поиска правильной реализации метода для конкретного класса; после кэширования интерпретатору не нужно обходить базовые классы, чтобы определить, какой метод вызвать. Кэш очищается, если базовый класс или сам класс изменяется, поэтому кэш должен оставаться корректным даже в условиях динамической природы Python. (Оригинальная оптимизация реализована Армином Риго, обновлена для Python 2.6 Кевином Джейкобсом; [issue 1700288](https://python-all.ru/3.0/whatsnew/2.6.html).)

  По умолчанию это изменение применяется только к типам, входящим в ядро Python. Модули расширения могут быть несовместимы с этим кэшем, поэтому они должны явно добавить `Py_TPFLAGS_HAVE_VERSION_TAG` в поле `tp_flags` модуля, чтобы включить кэш методов. (Чтобы быть совместимым с кэшем методов, код модуля расширения не должен напрямую обращаться и изменять член `tp_dict` любого из реализуемых типов. Большинство модулей этого не делают, но интерпретатор Python не может это определить. См. [issue 1878](https://python-all.ru/3.0/whatsnew/2.6.html) для обсуждения.)
- Вызовы функций с именованными аргументами стали значительно быстрее за счет быстрого сравнения указателей, что обычно экономит время полного сравнения строк. (Предложено Рэймондом Хеттингером после первоначальной реализации Антуана Питу; [issue 1819](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Все функции модуля [`struct`](https://python-all.ru/3.0/library/struct.html#module-struct) были переписаны на C благодаря работе на спринте Need For Speed. (Предложено Рэймондом Хеттингером.)
- Некоторые стандартные встроенные типы теперь устанавливают бит в своих объектах типа. Это ускоряет проверку, является ли объект подклассом одного из этих типов. (Автор: Neal Norwitz.)
- Строки Unicode теперь используют более быстрый код для обнаружения пробельных символов и разрывов строк; это ускоряет метод `split()` примерно на 25% и `splitlines()` на 35%. (Предложено Антуаном Питу.) Использование памяти сокращено за счет применения pymalloc для данных строк Unicode.
- Инструкция `with` теперь сохраняет метод [`__exit__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__exit__) в стеке, что дает небольшое ускорение. (Реализовано Джеффри Яскиным.)
- Для уменьшения использования памяти сборщик мусора теперь очищает внутренние списки свободных блоков при сборке мусора самого старшего поколения объектов. Это может вернуть память операционной системе быстрее.

### Изменения в интерпретаторе

Два параметра командной строки зарезервированы для использования другими реализациями Python. Переключатель *-J* зарезервирован для Jython для Jython-специфичных опций, таких как переключатели, передаваемые базовой JVM. *-X* зарезервирован для опций, специфичных для конкретной реализации Python, такой как CPython, Jython или IronPython. Если любой из этих параметров используется с Python 2.6, интерпретатор сообщит, что данный параметр в настоящее время не используется.

Теперь Python можно запретить запись файлов `.pyc` или `.pyo`, указав интерпретатору ключ [*-B*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-B) или установив переменную окружения [**PYTHONDONTWRITEBYTECODE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Эта настройка доступна программам Python как переменная `sys.dont_write_bytecode`, и код Python может изменить её значение, чтобы повлиять на поведение интерпретатора. (Предложено Нилом Норвицем и Георгом Брандлем.)

Кодировку, используемую для стандартного ввода, вывода и ошибок, можно задать, установив переменную окружения [**PYTHONIOENCODING**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONIOENCODING) перед запуском интерпретатора. Значение должно быть строкой вида `<encoding>` или `<encoding>:<errorhandler>`. Часть *encoding* задаёт имя кодировки, например `utf-8` или `latin-1`; необязательная часть *errorhandler* задаёт, что делать с символами, которые не могут быть обработаны данной кодировкой, и должна быть одним из значений: “error”, “ignore” или “replace”. (Предложено Мартином фон Лёвисом.)

## Новые, улучшенные и устаревшие модули

Как и в каждом релизе, стандартная библиотека Python получила ряд улучшений и исправлений ошибок. Вот частичный список наиболее заметных изменений, отсортированный по алфавиту по именам модулей. Обратитесь к файлу `Misc/NEWS` в дереве исходных кодов для получения более полного списка изменений или просмотрите журналы Subversion для получения всех подробностей.

- (Режим предупреждений о 3.0) В Python 3.0 будет реорганизована стандартная библиотека: многие устаревшие модули будут удалены, а другие переименованы. Python 2.6, запущенный в режиме предупреждений о 3.0, будет выдавать предупреждения об этих модулях при их импорте.

  Список устаревших модулей: `audiodev`, `bgenlocations`, `buildtools`, `bundlebuilder`, `Canvas`, `compiler`, `dircache`, `dl`, `fpformat`, `gensuitemodule`, `ihooks`, `imageop`, `imgfile`, `linuxaudiodev`, `mhlib`, `mimetools`, `multifile`, `new`, `pure`, `statvfs`, `sunaudiodev`, `test.testall`, и `toaiff`.
- Модули [`asyncore`](https://python-all.ru/3.0/library/asyncore.html#module-asyncore) и [`asynchat`](https://python-all.ru/3.0/library/asynchat.html#module-asynchat) снова активно поддерживаются, и было применено несколько патчей и исправлений ошибок. (Поддерживается Джозией Карлсоном; см. [issue 1736190](https://python-all.ru/3.0/whatsnew/2.6.html) для одного патча.)
- У модуля `bsddb` также появился новый мейнтейнер – Хесус Сеа, и теперь пакет доступен как самостоятельный. Веб-страница пакета: [www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/3.0/whatsnew/2.6.html). Планируется удалить пакет из стандартной библиотеки в Python 3.0, так как он выпускается гораздо чаще, чем Python.

  Модуль `bsddb.dbshelve` теперь использует самый высокий доступный протокол сериализации вместо того, чтобы ограничиваться протоколом 1. (Предложено У. Барнсом; [issue 1551443](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi) теперь будет читать переменные из строки запроса HTTP POST запроса. Это позволяет использовать действия формы с URL, содержащими строки запроса, например “/cgi-bin/add.py?category=1”. (Предложено Александром Фиори и Нубисом; [issue 1817](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Функции `parse_qs()` и `parse_qsl()` были перенесены из модуля [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi) в модуль `urlparse`. Версии, все еще доступные в модуле [`cgi`](https://python-all.ru/3.0/library/cgi.html#module-cgi), будут вызывать сообщения [`PendingDeprecationWarning`](https://python-all.ru/3.0/library/exceptions.html#exceptions.PendingDeprecationWarning) в 2.6 ([issue 600362](https://python-all.ru/3.0/whatsnew/2.6.html)).
- Модуль [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) подвергся значительной доработке, предложенной Марком Дикинсоном и Кристианом Хаймсом. Было добавлено пять новых функций:

  - `polar()` преобразует комплексное число в полярную форму, возвращая модуль и аргумент комплексного числа.
  - `rect()` делает обратное, преобразуя пару модуль, аргумент обратно в соответствующее комплексное число.
  - `phase()` возвращает аргумент (также называемый углом) комплексного числа.
  - `isnan()` возвращает True, если либо вещественная, либо мнимая часть его аргумента является NaN.
  - `isinf()` возвращает True, если либо вещественная, либо мнимая часть его аргумента бесконечна.

  Ревизии также улучшили числовую надёжность модуля [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath). Для всех функций вещественная и мнимая части результатов точны до нескольких единиц последнего разряда (ulps), когда это возможно. Подробности см. в [issue 1381](https://python-all.ru/3.0/whatsnew/2.6.html). Также исправлены разрезы ветвей для `asinh()`, `atanh()` и `atan()`.

  Тесты для модуля были существенно расширены; почти 2000 новых тестов проверяют алгебраические функции.

  На платформах IEEE 754 модуль [`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) теперь обрабатывает специальные значения IEEE 754 и исключения с плавающей запятой в соответствии с Приложением ‘G’ стандарта C99.
- Новый тип данных в модуле [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections): `namedtuple(typename, fieldnames)` – это фабричная функция, которая создаёт подклассы стандартного кортежа, поля которых доступны как по имени, так и по индексу. Например:

  ```python
  >>> var_type = collections.namedtuple('variable',
  ...             'id name type size')
  >>> # Имена разделяются пробелами или запятыми
  >>> # 'id, name, type, size' также будет работать
  >>> var_type._fields
  ('id', 'name', 'type', 'size')

  >>> var = var_type(1, 'frequency', 'int', 4)
  >>> print var[0], var.id    # Эквивалентно
  1 1
  >>> print var[2], var.type  # Эквивалентно
  int int
  >>> var._asdict()
  {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'}
  >>> v2 = var._replace(name='amplitude')
  >>> v2
  variable(id=1, name='amplitude', type='int', size=4)
  ```

  Некоторые места в стандартной библиотеке, которые возвращали кортежи, были изменены так, чтобы возвращать экземпляры `namedtuple`. Например, метод `Decimal.as_tuple()` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.

  (Автор: Raymond Hettinger.)
- Ещё одно изменение в модуле [`collections`](https://python-all.ru/3.0/library/collections.html#module-collections): тип `deque` теперь поддерживает необязательный параметр *maxlen*; если он указан, размер дека будет ограничен не более чем *maxlen* элементами. Добавление новых элементов в полный дек приводит к отбрасыванию старых.

  ```python
  >>> from collections import deque
  >>> dq=deque(maxlen=3)
  >>> dq
  deque([], maxlen=3)
  >>> dq.append(1) ; dq.append(2) ; dq.append(3)
  >>> dq
  deque([1, 2, 3], maxlen=3)
  >>> dq.append(4)
  >>> dq
  deque([2, 3, 4], maxlen=3)
  ```

  (Автор: Raymond Hettinger.)
- Объекты `Morsel` модуля `Cookie` теперь поддерживают атрибут `httponly`. В некоторых браузерах куки с этим атрибутом недоступны для чтения или изменения через JavaScript. (Автор: Arvin Schnell; [issue 1638033](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Новый метод окна в модуле [`curses`](https://python-all.ru/3.0/library/curses.html#module-curses), `chgat()`, изменяет атрибуты отображения для заданного числа символов на одной строке. (Автор: Fabian Kreutz.)

  ```python
  # Текст жирным шрифтом, начинающийся с y=0, x=21
  # и влияющий на остальную часть строки
  stdscr.chgat(0, 21, curses.A_BOLD)
  ```

  Класс `Textbox` в модуле [`curses.textpad`](https://python-all.ru/3.0/library/curses.html#module-curses.textpad) теперь поддерживает редактирование как в режиме вставки, так и в режиме замены. Режим вставки включается передачей истинного значения для параметра *insert\_mode* при создании экземпляра `Textbox`.
- Методы `strftime()` модуля [`datetime`](https://python-all.ru/3.0/library/datetime.html#module-datetime) теперь поддерживают код формата `%f`, который разворачивается в количество микросекунд в объекте, дополненное слева нулями до шести знаков. (Автор: Skip Montanaro; [issue 1158](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`decimal`](https://python-all.ru/3.0/library/decimal.html#module-decimal) был обновлён до версии 1.66 [Общей спецификации десятичных чисел](https://python-all.ru/3.0/whatsnew/2.6.html). Новые возможности включают некоторые методы для основных математических функций, таких как `exp()` и `log10()`:

  ```python
  >>> Decimal(1).exp()
  Decimal("2.718281828459045235360287471")
  >>> Decimal("2.7182818").ln()
  Decimal("0.9999999895305022877376682436")
  >>> Decimal(1000).log10()
  Decimal("3")
  ```

  Метод `as_tuple()` объектов `Decimal` теперь возвращает именованный кортеж с полями `sign`, `digits` и `exponent`.

  (Реализовано Facundo Batista и Mark Dickinson. Поддержка именованных кортежей добавлена Raymond Hettinger.)
- Класс `SequenceMatcher` модуля [`difflib`](https://python-all.ru/3.0/library/difflib.html#module-difflib) теперь возвращает именованные кортежи, представляющие совпадения, с атрибутами `a`, `b` и `size`. (Автор: Raymond Hettinger.)
- В конструктор класса [`ftplib.FTP`](https://python-all.ru/3.0/library/ftplib.html#ftplib.FTP), а также в метод `connect()`, был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.) Кроме того, методы `storbinary()` и `storlines()` класса `FTP` теперь принимают необязательный параметр *колбэк*, который будет вызываться с каждым блоком данных после его отправки. (Автор: Phil Schwartz; [issue 1221598](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Встроенная функция `reduce()` также доступна в модуле [`functools`](https://python-all.ru/3.0/library/functools.html#module-functools). В Python 3.0 эта встроенная функция была удалена, и `reduce()` доступна только из [`functools`](https://python-all.ru/3.0/library/functools.html#module-functools); в настоящее время нет планов удалять эту встроенную функцию в серии 2.x. (Исправлено Кристианом Хаймсом; [issue 1739906](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Когда это возможно, модуль [`getpass`](https://python-all.ru/3.0/library/getpass.html#module-getpass) теперь использует `/dev/tty` для вывода приглашения и чтения пароля, при необходимости переключаясь на стандартный поток ошибок и стандартный ввод. Если пароль может отображаться на терминале, перед показом приглашения выводится предупреждение. (Автор: Gregory P. Smith.)
- Функция [`glob.glob()`](https://python-all.ru/3.0/library/glob.html#glob.glob) теперь может возвращать имена файлов в Unicode, если использовался путь в Unicode и в каталоге есть соответствующие имена в Unicode. ([issue 1001604](https://python-all.ru/3.0/whatsnew/2.6.html))
- Модуль `gopherlib` был удалён.
- Новая функция в модуле [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq), `merge(iter1, iter2, ...)`, принимает любое количество итерируемых объектов, возвращающих данные в отсортированном порядке, и возвращает новый генератор, который выдает содержимое всех итераторов, также в отсортированном порядке. Например:

  ```python
  >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
  [1, 2, 3, 5, 8, 9, 16]
  ```

  Ещё одна новая функция, `heappushpop(heap, item)`, добавляет *item* в *heap*, затем извлекает и возвращает наименьший элемент. Это эффективнее, чем последовательный вызов `heappush()` и `heappop()`.

  [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq) теперь реализован так, что использует только сравнение «меньше», вместо ранее использовавшегося сравнения «меньше или равно». Это приводит к тому, что использование [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq) для типа совпадает с поведением метода `list.sort()`. (Автор: Raymond Hettinger.)
- В конструкторы классов `httplib.HTTPConnection` и `HTTPSConnection` был добавлен необязательный параметр `timeout`, задающий таймаут в секундах. (Добавлено Facundo Batista.)
- Большинство функций модуля [`inspect`](https://python-all.ru/3.0/library/inspect.html#module-inspect), таких как `getmoduleinfo()` и `getargs()`, теперь возвращают именованные кортежи. Помимо поведения как у кортежей, элементы возвращаемого значения также можно получить как атрибуты. (Автор: Raymond Hettinger.)

  Некоторые новые функции в модуле включают `isgenerator()`, `isgeneratorfunction()`, и `isabstract()`.
- Модуль [`itertools`](https://python-all.ru/3.0/library/itertools.html#module-itertools) приобрёл несколько новых функций.

  `izip_longest(iter1, iter2, ...[, fillvalue])` создаёт кортежи из каждого из элементов; если некоторые итерируемые объекты короче других, недостающие значения устанавливаются в *fillvalue*. Например:

  ```python
  >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
  ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
  ```

  `product(iter1, iter2, ..., [repeat=N])` возвращает декартово произведение переданных итерируемых объектов – набор кортежей, содержащих все возможные комбинации элементов, возвращаемых каждым итерируемым объектом.

  ```python
  >>> list(itertools.product([1,2,3], [4,5,6]))
  [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]
  ```

  Необязательный именованный аргумент *repeat* используется для вычисления произведения итерируемого объекта или набора итерируемых объектов самих на себя, повторённого *N* раз. С одним итерируемым аргументом возвращаются кортежи из *N* элементов:

  ```python
  >>> list(itertools.product([1,2], repeat=3))
  [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
   (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
  ```

  С двумя итерируемыми объектами возвращаются кортежи из *2N* элементов.

  ```python
  >>> list(itertools.product([1,2], [3,4], repeat=2))
  [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
   (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
   (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
   (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
  ```

  `combinations(iterable, r)` возвращает подпоследовательности длины *r* из элементов *iterable*.

  ```python
  >>> list(itertools.combinations('123', 2))
  [('1', '2'), ('1', '3'), ('2', '3')]
  >>> list(itertools.combinations('123', 3))
  [('1', '2', '3')]
  >>> list(itertools.combinations('1234', 3))
  [('1', '2', '3'), ('1', '2', '4'),
   ('1', '3', '4'), ('2', '3', '4')]
  ```

  `permutations(iter[, r])` возвращает все перестановки длины *r* из элементов итерируемого объекта. Если *r* не указан, по умолчанию берётся количество элементов, производимых итерируемым объектом.

  ```python
  >>> list(itertools.permutations([1,2,3,4], 2))
  [(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]
  ```

  `itertools.chain(*iterables)` – существующая функция в [`itertools`](https://python-all.ru/3.0/library/itertools.html#module-itertools), которая получила новый конструктор в Python 2.6. `itertools.chain.from_iterable(iterable)` принимает один итерируемый объект, который должен возвращать другие итерируемые объекты. `chain()` затем вернёт все элементы первого итерируемого объекта, затем все элементы второго и так далее.

  ```python
  >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
  [1, 2, 3, 4, 5, 6]
  ```

  (Всё добавлено Рэймондом Хеттингером.)
- Класс `FileHandler` модуля [`logging`](https://python-all.ru/3.0/library/logging.html#module-logging) и его подклассы `WatchedFileHandler`, `RotatingFileHandler` и `TimedRotatingFileHandler` теперь имеют необязательный параметр *delay* в своих конструкторах. Если *delay* равен true, открытие файла журнала откладывается до первого вызова `emit()`. (Автор: Vinay Sajip.)

  `TimedRotatingFileHandler` также имеет параметр конструктора *utc*. Если аргумент равен true, при определении момента полуночи и генерации имён файлов будет использоваться время UTC; в противном случае – местное время.
- В модуль [`math`](https://python-all.ru/3.0/library/math.html#module-math) было добавлено несколько новых функций:

  - [`isinf()`](https://python-all.ru/3.0/library/math.html#math.isinf) и [`isnan()`](https://python-all.ru/3.0/library/math.html#math.isnan) определяют, является ли заданное число с плавающей точкой положительной или отрицательной бесконечностью или NaN (Not a Number – не числом) соответственно.
  - [`copysign()`](https://python-all.ru/3.0/library/math.html#math.copysign) копирует знаковый бит числа IEEE 754, возвращая абсолютное значение *x*, объединённое со знаковым битом *y*. Например, `math.copysign(1, -0.0)` возвращает -1.0. (Автор: Christian Heimes.)
  - [`factorial()`](https://python-all.ru/3.0/library/math.html#math.factorial) вычисляет факториал числа. (Автор: Raymond Hettinger; [issue 2138](https://python-all.ru/3.0/whatsnew/2.6.html).)
  - [`fsum()`](https://python-all.ru/3.0/library/math.html#math.fsum) суммирует поток чисел из итерируемого объекта, стараясь избежать потери точности за счёт использования частичных сумм. (Авторы: Jean Brouwers, Raymond Hettinger и Mark Dickinson; [issue 2819](https://python-all.ru/3.0/whatsnew/2.6.html).)
  - [`acosh()`](https://python-all.ru/3.0/library/math.html#math.acosh), [`asinh()`](https://python-all.ru/3.0/library/math.html#math.asinh) и [`atanh()`](https://python-all.ru/3.0/library/math.html#math.atanh) вычисляют обратные гиперболические функции.
  - [`log1p()`](https://python-all.ru/3.0/library/math.html#math.log1p) возвращает натуральный логарифм от *1+x* (по основанию *e*).
  - `trunc()` округляет число в сторону нуля, возвращая ближайшее `Integral`, находящееся между аргументом функции и нулём. Добавлено в рамках обратного портирования [иерархии типов чисел из PEP 3141](https://python-all.ru/3.0/whatsnew/2.6.html#pep-3141).
- Модуль [`math`](https://python-all.ru/3.0/library/math.html#module-math) был улучшен для более согласованного поведения на разных платформах, особенно в части обработки исключений с плавающей точкой и специальных значений IEEE 754.

  По возможности модуль следует рекомендациям стандарта C99 относительно специальных значений IEEE 754. Например, `sqrt(-1.)` теперь почти на всех платформах должно вызывать [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), в то время как `sqrt(float('NaN'))` должно возвращать NaN на всех платформах IEEE 754. Там, где приложение F стандарта C99 рекомендует сигнализировать «деление на ноль» или «недопустимая операция», Python будет вызывать [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError). Там, где приложение F рекомендует сигнализировать «переполнение», Python будет вызывать [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError). (См. [issue 711019](https://python-all.ru/3.0/whatsnew/2.6.html) и [issue 1640](https://python-all.ru/3.0/whatsnew/2.6.html).)

  (Добавлено Кристианом Хаймсом и Марком Дикинсоном.)
- Модули `MimeWriter` и `mimify` устарели; вместо них используйте пакет [`email`](https://python-all.ru/3.0/library/email.html#module-email).
- Модуль `md5` устарел; используйте модуль [`hashlib`](https://python-all.ru/3.0/library/hashlib.html#module-hashlib).
- Объекты `mmap` теперь имеют метод `rfind()`, который ищет подстроку, начиная с конца строки и двигаясь назад. Метод `find()` также получил параметр *end*, указывающий индекс, на котором нужно остановить поиск. (Предложено Джоном Лентоном.)
- Модуль [`operator`](https://python-all.ru/3.0/library/operator.html#module-operator) получил функцию `methodcaller()`, которая принимает имя и необязательный набор аргументов и возвращает вызываемый объект, который будет вызывать именованную функцию с переданными ему аргументами. Например:

  ```python
  >>> # Эквивалентно lambda s: s.replace('old', 'new')
  >>> replacer = operator.methodcaller('replace', 'old', 'new')
  >>> replacer('old wine in old bottles')
  'new wine in new bottles'
  ```

  (Добавлено Георгом Брандлом по предложению Грегори Петросяна.)

  Функция `attrgetter()` теперь принимает имена с точками и выполняет соответствующий поиск атрибутов:

  ```python
  >>> inst_name = operator.attrgetter(
  ...        '__class__.__name__')
  >>> inst_name('')
  'str'
  >>> inst_name(help)
  '_Helper'
  ```

  (Добавлено Георгом Брандлом по предложению Барри Уорсо.)
- Модуль [`os`](https://python-all.ru/3.0/library/os.html#module-os) теперь включает в себя несколько новых системных вызовов. `fchmod(fd, mode)` и `fchown(fd, uid, gid)` изменяют режим и владельца открытого файла, а `lchmod(path, mode)` изменяет режим символической ссылки. (Авторы: Georg Brandl и Christian Heimes.)

  `chflags()` и `lchflags()` являются обёртками для соответствующих системных вызовов (где они доступны) и изменяют флаги файла. Константы значений флагов определены в модуле [`stat`](https://python-all.ru/3.0/library/stat.html#module-stat); некоторые возможные значения включают `UF_IMMUTABLE`, указывающий, что файл нельзя изменять, и `UF_APPEND`, указывающий, что данные можно только добавлять в файл. (Автор: M. Levinson.)

  `os.closerange(low, high)` эффективно закрывает все файловые дескрипторы от *low* до *high*, игнорируя любые ошибки и не включая сам *high*. Эта функция теперь используется модулем [`subprocess`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess) для ускорения запуска процессов. (Автор: Georg Brandl; [issue 1663329](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Метод `clear()` объекта `os.environ` теперь будет не только очищать ключи объекта, но и сбрасывать переменные окружения с помощью [`os.unsetenv()`](https://python-all.ru/3.0/library/os.html#os.unsetenv). (Автор: Martin Horcicka; [issue 1181](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Функция [`os.walk()`](https://python-all.ru/3.0/library/os.html#os.walk) теперь имеет параметр `followlinks`. Если он установлен в True, функция будет следовать символическим ссылкам на каталоги и обходить их содержимое. Для обратной совместимости значение по умолчанию этого параметра – false. Учтите, что функция может войти в бесконечную рекурсию, если есть символическая ссылка, указывающая на родительский каталог. ([issue 1273829](https://python-all.ru/3.0/whatsnew/2.6.html))
- В модуле [`os.path`](https://python-all.ru/3.0/library/os.path.html#module-os.path) функция `splitext()` была изменена, чтобы не разделять по ведущим точкам. Это даёт лучшие результаты при работе с точечными файлами Unix. Например, `os.path.splitext('.ipython')` теперь возвращает `('.ipython', '')` вместо `('', '.ipython')`. ([issue 115886](https://python-all.ru/3.0/whatsnew/2.6.html))

  Новая функция `os.path.relpath(path, start='.')` возвращает относительный путь от пути `start` (если он указан) или от текущего рабочего каталога к целевому пути `path`. (Автор: Richard Barran; [issue 1339796](https://python-all.ru/3.0/whatsnew/2.6.html).)

  В Windows [`os.path.expandvars()`](https://python-all.ru/3.0/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения, заданные в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Автор: Josiah Carlson; [issue 957650](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Отладчик Python, предоставляемый модулем [`pdb`](https://python-all.ru/3.0/library/pdb.html#module-pdb), получил новую команду: «run» перезапускает отлаживаемую программу Python и может опционально принимать новые аргументы командной строки для программы. (Автор: Rocky Bernstein; [issue 1393667](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `posixfile` устарел; [`fcntl.lockf()`](https://python-all.ru/3.0/library/fcntl.html#fcntl.lockf) обеспечивает лучшую блокировку.

  Функция `post_mortem()`, используемая для начала отладки трассировки стека, теперь будет использовать трассировку, возвращаемую [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info), если трассировка не предоставлена. (Предложено Факундо Батистой; [issue 1106316](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`pickletools`](https://python-all.ru/3.0/library/pickletools.html#module-pickletools) теперь имеет функцию `optimize()`, которая принимает строку, содержащую pickle, и удаляет некоторые неиспользуемые коды операций, возвращая более короткий pickle, содержащий ту же структуру данных. (Автор: Raymond Hettinger.)
- Модуль `popen2` устарел; используйте модуль [`подпроцесс`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess).
- В модуль [`pkgutil`](https://python-all.ru/3.0/library/pkgutil.html#module-pkgutil) была добавлена функция `get_data()`, которая возвращает содержимое ресурсных файлов, входящих в установленный пакет Python. Например:

  ```python
  >>> import pkgutil
  >>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
  BaseException
   +-- SystemExit
   +-- KeyboardInterrupt
   +-- GeneratorExit
   +-- Exception
        +-- StopIteration
        +-- StandardError
   ...
  ```

  (Автор: Paul Moore; [issue 2439](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Объекты `Parser` модуля `pyexpat` теперь позволяют устанавливать свой атрибут `buffer_size` для изменения размера буфера, используемого для хранения символьных данных. (Автор: Achim Gaedke; [issue 1137](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `Queue` теперь предоставляет варианты очередей, которые извлекают элементы в разном порядке. Класс `PriorityQueue` хранит элементы очереди в куче и извлекает их в порядке приоритета, а `LifoQueue` извлекает сначала наиболее недавно добавленные элементы, то есть ведёт себя как стек. (Автор: Raymond Hettinger.)
- Объекты `Random` модуля [`random`](https://python-all.ru/3.0/library/random.html#module-random) теперь можно упаковывать с помощью pickle на 32-битной системе и распаковывать на 64-битной, и наоборот. К сожалению, это изменение также означает, что объекты `Random` из Python 2.6 невозможно правильно распаковать в более ранних версиях Python. (Автор: Shawn Ligocki; [задача 1727780](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Новая функция `triangular(low, high, mode)` возвращает случайные числа, подчиняющиеся треугольному распределению. Возвращаемые значения находятся между *low* и *high* (не включая сам *high*), а *mode* – наиболее часто встречающееся значение в распределении. (Авторы: Wladmir van der Laan и Raymond Hettinger; [issue 1681432](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Длительные поиски по регулярному выражению, выполняемые модулем [`re`](https://python-all.ru/3.0/library/re.html#module-re) будут проверять доставку сигналов, поэтому продолжительные поиски теперь можно прерывать. (Предложено Джошем Хойтом и Ральфом Шмиттом; [issue 846388](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Модуль регулярных выражений реализован путём компиляции байт-кода для крошечной виртуальной машины, специфичной для регулярных выражений. Недоверенный код может напрямую создавать вредоносные строки байт-кода и вызывать сбои, поэтому Python 2.6 включает верификатор байт-кода регулярных выражений. (Предложено Гвидо ван Россумом на основе работы для Google App Engine; [issue 3487](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `rgbimg` был удалён.
- Модуль [`rlcompleter`](https://python-all.ru/3.0/library/rlcompleter.html#module-rlcompleter), его метод `Completer.complete()` теперь будет игнорировать исключения, возникающие при вычислении имени. (Исправлено Лоренцем Кваком; [issue 2250](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Экземпляры `scheduler` модуля [`sched`](https://python-all.ru/3.0/library/sched.html#module-sched) теперь имеют атрибут `queue` только для чтения, который возвращает содержимое очереди планировщика, представленное в виде списка именованных кортежей с полями `(time, priority, action, argument)`. (Предложено Рэймондом Хеттингером; [issue 1861](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`select`](https://python-all.ru/3.0/library/select.html#module-select) теперь содержит функции-обёртки для системных вызовов Linux `epoll` и BSD `kqueue`. В существующие объекты `poll` был добавлен метод `modify()`; `pollobj.modify(fd, eventmask)` принимает файловый дескриптор или файловый объект и маску событий, изменяя сохранённую маску событий для этого файла. (Предложено Кристианом Хаймсом; [issue 1657](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `sets` объявлен устаревшим; лучше использовать встроенные типы [`set`](https://python-all.ru/3.0/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.0/library/stdtypes.html#frozenset).
- Модуль `sha` устарел; вместо него используйте модуль [`hashlib`](https://python-all.ru/3.0/library/hashlib.html#module-hashlib).
- Функция [`shutil.copytree()`](https://python-all.ru/3.0/library/shutil.html#shutil.copytree) теперь имеет необязательный аргумент *ignore*, который принимает вызываемый объект. Этот вызываемый объект будет получать путь к каждому каталогу и список его содержимого и возвращать список имён, которые будут игнорироваться, а не копироваться.

  Модуль [`shutil`](https://python-all.ru/3.0/library/shutil.html#module-shutil) также предоставляет функцию `ignore_patterns()` для использования с этим новым параметром. `ignore_patterns()` принимает произвольное количество шаблонов в стиле glob и возвращает вызываемый объект, который будет игнорировать все файлы и каталоги, соответствующие любому из этих шаблонов. Следующий пример копирует дерево каталогов, но пропускает как каталоги `.svn`, так и резервные файлы Emacs, имена которых заканчиваются на '~':

  ```python
  shutil.copytree('Doc/library', '/tmp/library',
                  ignore=shutil.ignore_patterns('*~', '.svn'))
  ```

  (Предложено Тареком Зиаде; [issue 2663](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Интеграция обработки сигналов с циклами событий GUI, такими как используемые в Tkinter или GTk+, долгое время была проблемой; большинство программ в итоге прибегают к опросу, пробуждаясь каждую долю секунды, чтобы проверить, произошли ли какие-либо события GUI. Модуль [`signal`](https://python-all.ru/3.0/library/signal.html#module-signal) теперь может сделать это более эффективно. Вызов `signal.set_wakeup_fd(fd)` устанавливает файловый дескриптор для использования; когда получен сигнал, в этот файловый дескриптор записывается один байт. Существует также функция на уровне C, [`PySignal_SetWakeupFd`](https://python-all.ru/3.0/c-api/exceptions.html#PySignal_SetWakeupFd), для установки дескриптора.

  Циклы событий будут использовать это, открывая канал для создания двух дескрипторов: один для чтения и один для записи. Дескриптор записи будет передан `set_wakeup_fd()`, а дескриптор чтения будет добавлен в список дескрипторов, отслеживаемых циклом событий через `select` или `poll`. При получении сигнала будет записан один байт, и основной цикл событий будет разбужен, что позволяет избежать необходимости опроса.

  (Предложено Адамом Олсеном; [issue 1583](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Функция `siginterrupt()` теперь доступна из кода Python и позволяет изменять, могут ли сигналы прерывать системные вызовы. (Предложено Ральфом Шмиттом.)

  Функции `setitimer()` и `getitimer()` также были добавлены (там, где они доступны). `setitimer()` позволяет устанавливать интервальные таймеры, которые вызовут отправку сигнала процессу по истечении заданного времени, измеряемого в реальном времени, затраченном процессорном времени или суммарном времени процесса и системы. (Предложено Гильерме Поло; [issue 2240](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`smtplib`](https://python-all.ru/3.0/library/smtplib.html#module-smtplib) теперь поддерживает SMTP через SSL благодаря добавлению класса `SMTP_SSL`. Этот класс поддерживает интерфейс, идентичный существующему классу `SMTP`. (Предложено Монти Тейлором.) Оба конструктора классов также имеют необязательный параметр `timeout`, задающий тайм-аут для начальной попытки подключения, измеряемый в секундах. (Предложено Факундо Батистой.)

  В модуль также была добавлена реализация протокола LMTP ([**RFC 2033**](https://python-all.ru/3.0/whatsnew/2.6.html)). LMTP используется вместо SMTP при передаче электронной почты между агентами, которые не управляют почтовой очередью. (LMTP реализован Лейфом Хедстрёмом; [issue 957003](https://python-all.ru/3.0/whatsnew/2.6.html).)

  SMTP.starttls() теперь соответствует [**RFC 3207**](https://python-all.ru/3.0/whatsnew/2.6.html) и забывает любые знания, полученные от сервера, но не полученные в результате самого согласования TLS. (Патч предоставлен Биллом Феннером; [issue 829951](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) теперь поддерживает TIPC ([http://tipc.sf.net](https://python-all.ru/3.0/whatsnew/2.6.html)), высокопроизводительный протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса TIPC представляют собой кортежи из 4 или 5 элементов. (Автор: Alberto Bertogli; [issue 1646](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Новая функция `create_connection()` принимает адрес\\nи подключается к нему, используя необязательное значение тайм-аута, возвращая\\nподключённый объект сокета.
- Базовые классы модуля `SocketServer` теперь поддерживают вызов метода `handle_timeout()` после периода бездействия, заданного атрибутом сервера `timeout`. (Предложено Майклом Помранингом.) Метод `serve_forever()` теперь принимает необязательный интервал опроса, измеряемый в секундах, определяющий, как часто сервер будет проверять запрос на завершение работы. (Предложено Педро Вернеком и Джеффри Яскиным; [issue 742598](https://python-all.ru/3.0/whatsnew/2.6.html), [issue 1193577](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`sqlite3`](https://python-all.ru/3.0/library/sqlite3.html#module-sqlite3), поддерживаемый Герхардом Херингом, обновлён с версии 2.3.2 в Python 2.5 до версии 2.4.1.
- Модуль [`struct`](https://python-all.ru/3.0/library/struct.html#module-struct) теперь поддерживает тип C99 `_Bool`, с использованием символа формата `'?'`. (Предложено Дэвидом Ремалем.)
- Объекты `Popen`, предоставляемые модулем [`subprocess`](https://python-all.ru/3.0/library/subprocess.html#module-subprocess),\\nтеперь имеют методы `terminate()`, `kill()` и `send_signal()`.\\nВ Windows `send_signal()` поддерживает только сигнал `SIGTERM`,\\nи все эти методы являются псевдонимами функции Win32 API\\n`TerminateProcess`.\\n(Автор: Christian Heimes.)
- Новая переменная в модуле [`sys`](https://python-all.ru/3.0/library/sys.html#module-sys), `float_info`, представляет собой объект, содержащий информацию, полученную из файла `float.h` о поддержке чисел с плавающей точкой на платформе. Атрибуты этого объекта включают `mant_dig` (количество цифр в мантиссе), `epsilon` (наименьшая разница между 1.0 и следующим представимым большим значением) и несколько других. (Предложено Кристианом Хаймсом; [issue 1534](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Ещё одна новая переменная, `dont_write_bytecode`, управляет тем, будет ли Python записывать файлы `.pyc` или `.pyo` при импорте модуля. Если эта переменная истинна, скомпилированные файлы не записываются. Переменная изначально устанавливается при запуске путём указания ключа [*-B*](https://python-all.ru/3.0/using/cmdline.html#cmdoption-B) интерпретатору Python или установкой переменной окружения [**PYTHONDONTWRITEBYTECODE**](https://python-all.ru/3.0/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE) перед запуском интерпретатора. Код Python может впоследствии изменить значение этой переменной, чтобы управлять записью файлов байт-кода. (Предложено Нилом Норвицем и Георгом Брандлем.)

  Информация об аргументах командной строки, переданных интерпретатору Python, доступна через чтение атрибутов именованного кортежа, доступного как `sys.flags`. Например, атрибут `verbose` истинен, если Python был запущен в подробном режиме, `debug` истинен в режиме отладки и т.д. Все эти атрибуты доступны только для чтения. (Предложено Кристианом Хаймсом.)

  Новая функция `getsizeof()` принимает объект Python и возвращает объём памяти, используемый объектом, измеряемый в байтах. Встроенные объекты возвращают корректные результаты; сторонние расширения могут этого не делать, но могут определить метод `__sizeof__()` для возврата размера объекта. (Предложено Робертом Шуппенисом; [issue 2898](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Теперь можно определить текущие функции профилировщика и трассировщика, вызвав [`sys.getprofile()`](https://python-all.ru/3.0/library/sys.html#sys.getprofile) и [`sys.gettrace()`](https://python-all.ru/3.0/library/sys.html#sys.gettrace). (Предложено Георгом Брандлем; [issue 1648](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`tarfile`](https://python-all.ru/3.0/library/tarfile.html#module-tarfile) теперь поддерживает tar-файлы POSIX.1-2001 (pax) в дополнение к уже поддерживаемым форматам POSIX.1-1988 (ustar) и GNU tar. Формат по умолчанию – GNU tar; укажите параметр `format`, чтобы открыть файл в другом формате:

  ```python
  tar = tarfile.open("output.tar", "w",
                     format=tarfile.PAX_FORMAT)
  ```

  Новые параметры `encoding` и `errors` задают кодировку и схему обработки ошибок для преобразования символов. `'strict'`, `'ignore'` и `'replace'` – три стандартных способа обработки ошибок в Python; `'utf-8'` – специальное значение, которое заменяет плохие символы их представлением в UTF-8. (Преобразование символов происходит потому, что формат PAX поддерживает имена файлов в Юникоде, по умолчанию используется кодировка UTF-8.)

  Метод `TarFile.add()` теперь принимает аргумент `exclude`, который является функцией, используемой для исключения определённых имён файлов из архива. Функция должна принимать имя файла и возвращать true, если файл следует исключить, или false, если его следует архивировать. Функция применяется как к имени, изначально переданному `add()`, так и к именам файлов в рекурсивно добавляемых каталогах.

  (Все изменения выполнены Lars Gustäbel.)
- Необязательный параметр `timeout` был добавлен в конструктор класса [`telnetlib.Telnet`](https://python-all.ru/3.0/library/telnetlib.html#telnetlib.Telnet), задающий тайм-аут в секундах. (Добавлено Факундо Батистой.)
- Класс [`tempfile.NamedTemporaryFile`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile) обычно удаляет созданный временный файл при закрытии. Теперь это поведение можно изменить, передав `delete=False` конструктору. (Предложено Дэмиеном Миллером; [issue 1537850](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Новый класс `SpooledTemporaryFile` ведёт себя как временный файл, но хранит данные в памяти до превышения максимального размера. При достижении этого предела содержимое записывается во временный файл на диске. (Автор: Dustin J. Mitchell.)

  Классы `NamedTemporaryFile` и `SpooledTemporaryFile` оба работают как контекстные менеджеры, поэтому можно написать `with tempfile.NamedTemporaryFile() as tmp: ...`. (Автор: Alexander Belopolsky; [issue 2021](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `test.test_support` получил несколько контекстных менеджеров, полезных для написания тестов. `EnvironmentVarGuard()` – это контекстный менеджер, который временно изменяет переменные окружения и автоматически восстанавливает их старые значения.

  Ещё один контекстный менеджер, `TransientResource`, может обрамлять вызовы ресурсов, которые могут быть недоступны; он перехватывает и игнорирует указанный список исключений. Например, сетевой тест может игнорировать определённые ошибки при подключении к внешнему веб-сайте:

  ```python
  with test_support.TransientResource(IOError,
                                  errno=errno.ETIMEDOUT):
      f = urllib.urlopen('https://sf.net')
      ...
  ```

  Наконец, `check_warnings()` сбрасывает фильтры предупреждений модуля `warning` и возвращает объект, который будет записывать все возникающие предупреждения ([issue 3781](https://python-all.ru/3.0/whatsnew/2.6.html)):

  ```python
  with test_support.check_warnings() as wrec:
      warnings.simplefilter("always")
      # ... код, вызывающий предупреждение ...
      assert str(wrec.message) == "function is outdated"
      assert len(wrec.warnings) == 1, "Multiple warnings raised"
  ```

  (Автор: Бретт Кэннон.)
- Модуль [`textwrap`](https://python-all.ru/3.0/library/textwrap.html#module-textwrap) теперь может сохранять существующие пробелы в начале и конце новых строк, если указать `drop_whitespace=False` в качестве аргумента:

  ```python
  >>> S = """This  sentence  has a bunch   of
  ...   extra   whitespace."""
  >>> print textwrap.fill(S, width=15)
  This  sentence
  has a bunch
  of    extra
  whitespace.
  >>> print textwrap.fill(S, drop_whitespace=False, width=15)
  This  sentence
    has a bunch
     of    extra
     whitespace.
  >>>
  ```

  (Автор: Dwayne Bailey; [issue 1581073](https://python-all.ru/3.0/whatsnew/2.6.html).)
- API модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) изменяется для использования свойств, таких как `daemon`, вместо методов `setDaemon()` и `isDaemon()`, а некоторые методы переименованы с использованием подчёркиваний вместо верблюжьего регистра; например, метод `activeCount()` переименован в `active_count()`. Версии модуля 2.6 и 3.0 поддерживают одни и те же свойства и переименованные методы, но старые методы не удаляются. Дата устаревания старых API в Python 3.x не установлена; старые API не будут удалены ни в одной версии 2.x. (Реализовано несколькими людьми, в первую очередь Бенджамином Петерсоном.)

  Потоковые объекты `Thread` модуля [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) получили свойство `ident`, возвращающее идентификатор потока – ненулевое целое число. (Автор: Gregory P. Smith; [issue 2871](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`timeit`](https://python-all.ru/3.0/library/timeit.html#module-timeit) теперь принимает как вызываемые объекты, так и строки для измеряемого выражения и кода настройки. Были добавлены две вспомогательные функции для создания экземпляров `Timer`: `repeat(stmt, setup, time, repeat, number)` и `timeit(stmt, setup, time, number)` создают экземпляр и вызывают соответствующий метод. (Автор: Erik Demaine; [issue 1533909](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `Tkinter` теперь принимает списки и кортежи для опций, разделяя элементы пробелами перед передачей результирующего значения в Tcl/Tk. (Автор: Guilherme Polo; [issue 2906](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль [`turtle`](https://python-all.ru/3.0/library/turtle.html#module-turtle) для черепашьей графики был значительно улучшен Gregor Lingl. Новые возможности модуля включают:

  - Улучшенная анимация движения и поворота черепахи.
  - Управление движением черепахи с помощью новых методов `delay()`, `tracer()` и `speed()`.
  - Возможность задавать новые формы для черепахи и определять новую систему координат.
  - Черепахи теперь имеют метод `undo()`, который может отменять действия.
  - Простая поддержка реакции на события ввода, такие как активность мыши и клавиатуры, что позволяет писать простые игры.
  - Файл `turtle.cfg` можно использовать для настройки начального вида экрана черепахи.
  - Докстринги модуля могут быть заменены новыми докстрингами, переведёнными на другой язык.

  ([issue 1513695](https://python-all.ru/3.0/whatsnew/2.6.html))
- Необязательный параметр `timeout` был добавлен в функцию `urllib.urlopen()` и конструктор класса `urllib.ftpwrapper`, а также в функцию `urllib2.urlopen()`. Параметр задаёт тайм-аут в секундах. Например:

  ```python
  >>> u = urllib2.urlopen("http://slow.example.com",
                          timeout=3)
  Traceback (most recent call last):
    ...
  urllib2.URLError: <urlopen error timed out>
  >>>
  ```

  (Добавлено Facundo Batista.)
- База данных Юникода, предоставляемая модулем [`unicodedata`](https://python-all.ru/3.0/library/unicodedata.html#module-unicodedata), обновлена до версии 5.1.0. (Обновлено Мартином фон Лёвисом; [issue 3811](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Функции `formatwarning()` и `showwarning()` модуля [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) получили необязательный аргумент *line*, который можно использовать для передачи строки исходного кода. (Добавлено в рамках [issue 1631171](https://python-all.ru/3.0/whatsnew/2.6.html), в котором часть модуля [`warnings`](https://python-all.ru/3.0/library/warnings.html#module-warnings) была переписана на C.)

  Новая функция `catch_warnings()` – это контекстный менеджер, предназначенный для тестирования, позволяющий временно изменять фильтры предупреждений, а затем восстанавливать их исходные значения ([issue 3781](https://python-all.ru/3.0/whatsnew/2.6.html)).
- Классы XML-RPC `SimpleXMLRPCServer` и `DocXMLRPCServer` теперь можно предотвратить от немедленного открытия и привязки к своему сокету, передав True в качестве параметра конструктора `bind_and_activate`. Это можно использовать для изменения атрибута экземпляра `allow_reuse_address` перед вызовом методов `server_bind()` и `server_activate()` для открытия сокета и начала прослушивания соединений. (Автор: Peter Parente; [issue 1599845](https://python-all.ru/3.0/whatsnew/2.6.html).)

  `SimpleXMLRPCServer` также имеет атрибут `_send_traceback_header`; если он истинен, исключение и форматированная трассировка возвращаются в виде HTTP-заголовков «X-Exception» и «X-Traceback». Эта функция предназначена только для отладки и не должна использоваться на производственных серверах, так как трассировки могут раскрыть пароли или другую конфиденциальную информацию. (Автор: Alan McIntyre в рамках его проекта для Google Summer of Code 2007.)
- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразования не всегда была корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и `time`. ([issue 1330538](https://python-all.ru/3.0/whatsnew/2.6.html)) Код также может обрабатывать даты до 1900 года (предложено Ральфом Шмиттом; [issue 2014](https://python-all.ru/3.0/whatsnew/2.6.html)) и 64-битные целые числа, представленные с помощью `<i8>` в XML-RPC ответах (предложено Рику Линдбладом; [issue 2985](https://python-all.ru/3.0/whatsnew/2.6.html)).
- Класс `ZipFile` модуля [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile) теперь имеет методы `extract()` и `extractall()`, которые распаковывают один файл или все файлы архива в текущий каталог или в указанный каталог:

  ```python
  z = zipfile.ZipFile('python-251.zip')

  # Распаковать один файл, записывая его относительно
  # в каталог /tmp.
  z.extract('Python/sysmodule.c', '/tmp')

  # Распаковать все файлы из архива.
  z.extractall()
  ```

  (Автор: Alan McIntyre; [issue 467924](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Методы [`open()`](https://python-all.ru/3.0/library/functions.html#open), `read()` и `extract()` теперь могут принимать как имя файла, так и объект `ZipInfo`. Это полезно, если архив случайно содержит дублирующееся имя файла. (Автор: Graham Horler; [issue 1775025](https://python-all.ru/3.0/whatsnew/2.6.html).)

  Наконец, [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile) теперь поддерживает имена файлов в Unicode для архивов. (Автор: Alexey Borzenkov; [issue 1734346](https://python-all.ru/3.0/whatsnew/2.6.html).)

### Модуль [`ast`](https://python-all.ru/3.0/library/ast.html#module-ast)

Модуль [`ast`](https://python-all.ru/3.0/library/ast.html#module-ast) предоставляет представление Python-кода в виде абстрактного синтаксического дерева (AST), и Armin Ronacher добавил набор вспомогательных функций, выполняющих различные распространённые задачи. Они будут полезны для пакетов HTML-шаблонов, анализаторов кода и подобных инструментов, обрабатывающих код Python.

Функция `parse()` принимает выражение и возвращает AST. Функция `dump()` выводит представление дерева, подходящее для отладки:

```python
import ast

t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
```

Это выводит глубоко вложенное дерево:

```python
Module(body=[
  Assign(targets=[
    Name(id='d', ctx=Store())
   ], value=Dict(keys=[], values=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Assign(targets=[
      Subscript(value=
        Name(id='d', ctx=Load()),
          slice=
          Index(value=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], value=
     BinOp(left=
      BinOp(left=
       Call(func=
        Name(id='ord', ctx=Load()), args=[
          Name(id='i', ctx=Load())
         ], keywords=[], starargs=None, kwargs=None),
       op=Sub(), right=Call(func=
        Name(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=None, kwargs=None)),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   Print(dest=None, values=[
     Name(id='d', ctx=Load())
   ], nl=True)
 ])
```

Метод `literal_eval()` принимает строку или AST, представляющее литеральное выражение, анализирует и вычисляет его, а затем возвращает полученное значение. Литеральное выражение – это выражение Python, содержащее только строки, числа, словари и т.д., но без инструкций или вызовов функций. Если нужно вычислить выражение, но нельзя принять риск безопасности при использовании [`eval()`](https://python-all.ru/3.0/library/functions.html#eval), `literal_eval()` выполнит это безопасно:

```python
>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
  ...
ValueError: malformed string
```

The module also includes `NodeVisitor` and `NodeTransformer` classes for traversing and modifying an AST, and functions for common transformations such as changing line numbers.

### Модуль `future_builtins`

Python 3.0 вносит множество изменений в набор встроенных функций, и большинство из них нельзя перенести в серию Python 2.x, так как это нарушит совместимость. Модуль `future_builtins` предоставляет версии этих встроенных функций, которые можно импортировать при написании кода, совместимого с Python 3.0.

Функции в этом модуле в настоящее время включают:

- `ascii(obj)`: эквивалентно [`repr()`](https://python-all.ru/3.0/library/functions.html#repr). В Python 3.0 [`repr()`](https://python-all.ru/3.0/library/functions.html#repr) будет возвращать строку Unicode, а [`ascii()`](https://python-all.ru/3.0/library/functions.html#ascii) будет возвращать чистую ASCII-байтовую строку.
- `filter(predicate, iterable)`,\\n`map(func, iterable1, ...)`: версии 3.0\\nвозвращают итераторы, в отличие от встроенных функций 2.x, которые возвращают списки.
- `hex(value)`, `oct(value)`: вместо вызова методов `__hex__()` или `__oct__()` эти версии будут вызывать метод [`__index__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__index__) и преобразовывать результат в шестнадцатеричное или восьмеричное представление. [`oct()`](https://python-all.ru/3.0/library/functions.html#oct) будет использовать новую нотацию `0o` для своего результата.

### Модуль [`json`](https://python-all.ru/3.0/library/json.html#module-json): JavaScript Object Notation

Новый модуль [`json`](https://python-all.ru/3.0/library/json.html#module-json) поддерживает кодирование и декодирование типов Python в JSON (Javascript Object Notation). JSON – это легковесный формат обмена данными, часто используемый в веб-приложениях. Дополнительную информацию о JSON можно найти по адресу [http://www.json.org](https://python-all.ru/3.0/whatsnew/2.6.html).

[`json`](https://python-all.ru/3.0/library/json.html#module-json) поддерживает декодирование и кодирование большинства встроенных типов Python.\\nСледующий пример кодирует и декодирует словарь:

```python
>>> import json
>>> data = {"spam" : "foo", "parrot" : 42}
>>> in_json = json.dumps(data) # Закодировать данные
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Декодировать в объект Python
{"spam" : "foo", "parrot" : 42}
```

Также можно написать собственные декодеры и кодеры для поддержки большего количества типов. Также поддерживается pretty-printing JSON-строк.

[`json`](https://python-all.ru/3.0/library/json.html#module-json) (изначально назывался simplejson) был написан Бобом Ипполито.

### Модуль [`plistlib`](https://python-all.ru/3.0/library/plistlib.html#module-plistlib): парсер Property-List

Формат `.plist` широко используется в Mac OS X для хранения базовых типов данных (чисел, строк, списков и словарей) путём их сериализации в XML-подобный формат. Он напоминает сериализацию типов данных XML-RPC.

Несмотря на то, что этот формат в основном используется в Mac OS X, в нём нет ничего специфичного для Mac, и реализация на Python работает на любой платформе, которую поддерживает Python, поэтому модуль [`plistlib`](https://python-all.ru/3.0/library/plistlib.html#module-plistlib) был перенесён в стандартную библиотеку.

Использовать модуль просто:

```python
import sys
import plistlib
import datetime

# Создать структуру данных
data_struct = dict(lastAccessed=datetime.datetime.now(),
                   version=1,
                   categories=('Personal','Shared','Private'))

# Создать строку, содержащую XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct

# Записать структуру данных в файл и прочитать её обратно.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist принимает как файлоподобные объекты, так и пути.
plistlib.writePlist(data_struct, sys.stdout)
```

### Улучшения ctypes

Томас Хеллер продолжал поддерживать и улучшать модуль [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes).

[`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) теперь поддерживает тип данных `c_bool`, представляющий тип C99 `bool`. (Предложено Дэвидом Ремалем; [issue 1649190](https://python-all.ru/3.0/whatsnew/2.6.html).)

Типы строк, буферов и массивов [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) получили улучшенную поддержку расширенного синтаксиса срезов, где можно указывать различные комбинации `(start, stop, step)`. (Реализовано Томасом Ваутерсом.)

Все типы данных [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) теперь поддерживают методы `from_buffer()` и `from_buffer_copy()`, которые создают экземпляр ctypes на основе предоставленного буферного объекта. `from_buffer_copy()` копирует содержимое объекта, а `from_buffer()` использует ту же область памяти.

Новое соглашение о вызовах указывает [`ctypes`](https://python-all.ru/3.0/library/ctypes.html#module-ctypes) очищать переменные `errno` или Win32 LastError при каждом обёрнутом вызове. (Реализовано Томасом Хеллером; [issue 1798](https://python-all.ru/3.0/whatsnew/2.6.html).)

Теперь можно получить значение переменной Unix `errno` после вызова функции. При создании обёрнутой функции можно передать `use_errno=True` в качестве именованного параметра функции `DLL()`, а затем вызывать методы модуля `set_errno()` и `get_errno()` для установки и получения значения ошибки.

Переменная Win32 LastError аналогичным образом поддерживается функциями `DLL()`, `OleDLL()` и `WinDLL()`. Необходимо передать `use_last_error=True` в качестве именованного параметра, а затем вызывать методы модуля `set_last_error()` и `get_last_error()`.

Функция `byref()`, используемая для получения указателя на экземпляр ctypes, теперь имеет необязательный параметр *offset*, который представляет собой количество байтов, добавляемое к возвращаемому указателю.

### Улучшенная поддержка SSL

Билл Янссен внёс значительные улучшения в поддержку Secure Sockets Layer в Python 2.6, добавив новый модуль [`ssl`](https://python-all.ru/3.0/library/ssl.html#module-ssl), построенный на основе библиотеки [OpenSSL](https://python-all.ru/3.0/whatsnew/2.6.html). Этот новый модуль предоставляет более тонкий контроль над согласованным протоколом, используемыми сертификатами X.509 и лучше поддерживает написание SSL-серверов (в отличие от клиентов) на Python. Существующая поддержка SSL в модуле [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) не была удалена и продолжает работать, хотя она будет удалена в Python 3.0.

Чтобы использовать новый модуль, сначала необходимо обычным способом создать TCP-соединение, а затем передать его функции [`ssl.wrap_socket()`](https://python-all.ru/3.0/library/ssl.html#ssl.wrap_socket). Можно указать, требуется ли сертификат, и получить информацию о сертификате, вызвав метод `getpeercert()`.

> **См. также**
>
> Документация по модулю [`ssl`](https://python-all.ru/3.0/library/ssl.html#module-ssl).

## Изменения в сборке и C API

Изменения процесса сборки Python и C API включают:

- Теперь Python должен компилироваться компиляторами C89 (спустя 19\\nлет!). Это означает, что дерево исходного кода Python отказалось от собственных\\nреализаций `memmove` и `strerror`, которые\\nвходят в стандартную библиотеку C89.
- Python 2.6 можно собрать с помощью Microsoft Visual Studio 2008 (версия 9.0), и это новый компилятор по умолчанию. Файлы сборки находятся в каталоге `PCbuild`. (Реализовано Кристианом Хаймсом.)
- На Mac OS X Python 2.6 можно скомпилировать как универсальную сборку с четырьмя архитектурами. Скрипт **configure** принимает ключ *--with-universal-archs=\[32-bit|64-bit|all\]*, который определяет, собирать ли двоичные файлы для 32-разрядных архитектур (x86, PowerPC), 64-разрядных (x86-64 и PPC-64) или для обеих. (Предложено Рональдом Оссуреном.)
- Модуль BerkeleyDB теперь имеет объект C API, доступный как\\n`bsddb.db.api`. Этот объект может использоваться другими расширениями C,\\nкоторые хотят использовать модуль `bsddb` для своих целей.\\n(Автор: Duncan Grisby; [issue 1551895](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Новый интерфейс буферов, описанный ранее в\\n[разделе PEP 3118](https://python-all.ru/3.0/whatsnew/2.6.html#pep-3118-revised-buffer-protocol),\\nдобавляет [`PyObject_GetBuffer`](https://python-all.ru/3.0/c-api/buffer.html#PyObject_GetBuffer) и [`PyBuffer_Release`](https://python-all.ru/3.0/c-api/buffer.html#PyBuffer_Release),\\nа также несколько других функций.
- Использование Python библиотеки C stdio теперь потокобезопасно, по крайней мере\\nнастолько, насколько потокобезопасна сама нижележащая библиотека. Ранее потенциальная\\nошибка возникала, если один поток закрывал файловый объект, в то время как другой поток\\nчитал из него или записывал в него. В 2.6 файловые объекты\\nимеют счётчик ссылок, которым управляют функции\\n`PyFile_IncUseCount` и `PyFile_DecUseCount`.\\nФайловые объекты нельзя закрыть, пока счётчик ссылок\\nне равен нулю. `PyFile_IncUseCount` следует вызывать, пока GIL\\nвсё ещё удерживается, перед выполнением операции ввода-вывода с использованием\\nуказателя `FILE *`, а `PyFile_DecUseCount` следует вызывать\\nсразу после повторного захвата GIL.\\n(Авторы: Antoine Pitrou и Gregory P. Smith.)
- Одновременный импорт модулей в двух разных потоках больше не приводит к взаимоблокировке; теперь будет возбуждаться [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError). Новая функция API,\\n[`PyImport_ImportModuleNoBlock`](https://python-all.ru/3.0/c-api/import.html#PyImport_ImportModuleNoBlock), сначала ищет модуль в\\n`sys.modules`, а затем пытается импортировать его после\\nполучения блокировки импорта. Если блокировка импорта удерживается другим\\nпотоком, возбуждается [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError).\\n(Автор: Christian Heimes.)
- Несколько функций возвращают информацию о поддержке чисел с плавающей запятой на платформе.\\n[`PyFloat_GetMax`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetMax) возвращает\\nмаксимальное представимое значение с плавающей запятой,\\nа [`PyFloat_GetMin`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetMin) возвращает минимальное\\nположительное значение. [`PyFloat_GetInfo`](https://python-all.ru/3.0/c-api/float.html#PyFloat_GetInfo) возвращает объект,\\nсодержащий дополнительную информацию из файла `float.h`, такую как\\n`"mant_dig"` (количество цифр в мантиссе), `"epsilon"`\\n(наименьшая разница между 1.0 и следующим большим представимым значением),\\nи некоторые другие.\\n(Автор: Christian Heimes; [issue 1534](https://python-all.ru/3.0/whatsnew/2.6.html).)
- C-функции и методы, использующие\\n[`PyComplex_AsCComplex`](https://python-all.ru/3.0/c-api/complex.html#PyComplex_AsCComplex), теперь будут принимать аргументы, у которых\\nесть метод [`__complex__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__complex__). В частности, функции модуля\\n[`cmath`](https://python-all.ru/3.0/library/cmath.html#module-cmath) теперь будут принимать объекты с этим методом.\\nЭто обратный перенос изменения из Python 3.0.\\n(Автор: Mark Dickinson; [issue 1675423](https://python-all.ru/3.0/whatsnew/2.6.html).)
- C API Python теперь включает две функции для сравнения строк без учёта регистра: `PyOS_stricmp(char*, char*)` и `PyOS_strnicmp(char*, char*, Py_ssize_t)`. (Предложено Кристианом Хаймсом; [issue 1635](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Многие расширения на C определяют собственные маленькие макросы для добавления целых чисел и строк в словарь модуля в функции `init*`. Python 2.6 наконец-то определяет стандартные макросы для добавления значений в модуль: [`PyModule_AddStringMacro`](https://python-all.ru/3.0/c-api/module.html#PyModule_AddStringMacro) и [`PyModule_AddIntMacro()`](https://python-all.ru/3.0/c-api/module.html#PyModule_AddIntMacro). (Предложено Кристианом Хаймсом.)
- Некоторые макросы были переименованы как в Python 3.0, так и в 2.6, чтобы яснее показать, что это макросы, а не функции. `Py_Size()` стал `Py_SIZE()`, `Py_Type()` стал `Py_TYPE()`, а `Py_Refcnt()` стал `Py_REFCNT()`. Макросы со смешанным регистром по-прежнему доступны в Python 2.6 для обратной совместимости. ([issue 1629](https://python-all.ru/3.0/whatsnew/2.6.html))
- Distutils теперь помещает расширения на C, которые он собирает, в другой каталог при работе с отладочной версией Python. (Предложено Коллином Уинтером; [issue 1530959](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Некоторые базовые типы данных, такие как целые числа и строки, поддерживают внутренние списки свободных объектов, которые можно повторно использовать. Структуры данных для этих списков теперь следуют соглашению об именовании: переменная всегда называется `free_list`, счётчик всегда называется `numfree`, и всегда определяется макрос `Py<typename>_MAXFREELIST`.
- Новая цель Makefile, «make patchcheck», подготавливает исходное дерево Python к созданию патча: исправляет завершающие пробелы во всех изменённых файлах `.py`, проверяет, была ли изменена документация, и сообщает, обновлены ли файлы `Misc/ACKS` и `Misc/NEWS`. (Предложено Бреттом Кэнноном.)

  Еще одна новая цель, «make profile-opt», компилирует двоичный файл Python с использованием профильно-ориентированной оптимизации GCC. Она компилирует Python с включенным профилированием, запускает набор тестов для получения набора результатов профилирования, а затем компилирует с использованием этих результатов для оптимизации. (Автор: Грегори П. Смит.)

### Изменения для конкретных платформ: Windows

- Поддержка Windows 95, 98, ME и NT4 прекращена. Python 2.6 требует по крайней мере Windows 2000 SP4.
- Новым компилятором по умолчанию на Windows стал Visual Studio 2008 (версия 9.0). Каталоги сборки для Visual Studio 2003 (версия 7.1) и 2005 (версия 8.0) были перемещены в каталог PC/. Новый каталог `PCbuild` поддерживает кросс-компиляцию для X64, отладочные сборки и профильную оптимизацию (PGO). Сборки с PGO примерно на 10% быстрее обычных. (Предложено Кристианом Хаймсом с помощью Амаури Форжо д'Арк и Мартина фон Лёвиса.)
- Модуль [`msvcrt`](https://python-all.ru/3.0/library/msvcrt.html#module-msvcrt) теперь поддерживает как обычные, так и широкосимвольные варианты консольного I/O API. Функция `getwch()` считывает нажатие клавиши и возвращает значение Unicode, так же как и функция `getwche()`. Функция `putwch()` принимает символ Unicode и выводит его на консоль. (Предложено Кристианом Хаймсом.)
- [`os.path.expandvars()`](https://python-all.ru/3.0/library/os.path.html#os.path.expandvars) теперь будет раскрывать переменные окружения в форме «%var%», а «~user» будет раскрываться в путь к домашнему каталогу пользователя. (Предложено Джозайей Карлсоном; [issue 957650](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Объекты сокетов модуля [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) теперь имеют метод\\n`ioctl()`, который предоставляет ограниченный интерфейс к\\nсистемному интерфейсу `WSAIoctl`.
- Модуль `_winreg` теперь имеет функцию `ExpandEnvironmentStrings()`, которая раскрывает ссылки на переменные окружения, такие как `%NAME%`, во входной строке. Объекты-дескрипторы, предоставляемые этим модулем, теперь поддерживают протокол контекста, поэтому их можно использовать в операторах [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with). (Предложено Кристианом Хаймсом.)

  `_winreg` также имеет лучшую поддержку систем x64, предоставляя функции `DisableReflectionKey()`, `EnableReflectionKey()` и `QueryReflectionKey()`, которые включают и отключают отражение реестра для 32-разрядных процессов, работающих в 64-разрядных системах. ([issue 1753245](https://python-all.ru/3.0/whatsnew/2.6.html))
- Объект `Record` модуля [`msilib`](https://python-all.ru/3.0/library/msilib.html#module-msilib) получил методы `GetInteger()` и `GetString()`, которые возвращают значения полей как целое число или строку. (Предложено Флорисом Брюнноге; [issue 2125](https://python-all.ru/3.0/whatsnew/2.6.html).)

### Изменения для конкретных платформ: Mac OS X

- При компиляции фреймворк-сборки Python теперь можно указать имя фреймворка, передав опцию *--with-framework-name=* скрипту **configure**.
- Модуль `macfs` был удалён. Это, в свою очередь, потребовало удаления функции `macostools.touched()`, поскольку она зависела от модуля `macfs`. ([issue 1490190](https://python-all.ru/3.0/whatsnew/2.6.html))
- Многие другие модули 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`.

### Изменения для конкретных портов: IRIX

Ряд старых модулей, специфичных для 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`.

## Перенос на Python 2.6

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:

- Классы, которые не должны быть хешируемыми, должны устанавливать `__hash__ = None` в своих определениях, чтобы указать на этот факт.
- Строковые исключения удалены. Попытка их использовать вызывает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).
- Метод [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__) класса [`collections.deque`](https://python-all.ru/3.0/library/collections.html#collections.deque) теперь очищает все существующие содержимое deque перед добавлением элементов из итерируемого объекта. Это изменение приводит поведение в соответствие с `list.__init__()`.
- [`object.__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__) ранее принимал произвольные позиционные и именованные аргументы, игнорируя их. В Python 2.6 это больше не допускается и приводит к [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). Это повлияет на методы [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__), которые в конечном итоге вызывают соответствующий метод у [`object`](https://python-all.ru/3.0/library/functions.html#object) (возможно, через использование [`super()`](https://python-all.ru/3.0/library/functions.html#super)). См. обсуждение в [issue 1683368](https://python-all.ru/3.0/whatsnew/2.6.html).
- Конструктор `Decimal` теперь принимает начальные и конечные пробелы при передаче строки. Ранее он возбуждал исключение `InvalidOperation`. С другой стороны, метод `create_decimal()` объектов `Context` теперь явно запрещает лишние пробелы, возбуждая исключение `ConversionSyntax`.
- Из-за случайности в реализации, при передаче пути к файлу встроенной функции [`__import__()`](https://python-all.ru/3.0/library/functions.html#__import__) она фактически импортировала указанный файл. Однако это никогда не предполагалось работать, и теперь реализация явно проверяет этот случай и возбуждает [`ImportError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ImportError).
- C API: функции [`PyImport_Import`](https://python-all.ru/3.0/c-api/import.html#PyImport_Import) и [`PyImport_ImportModule`](https://python-all.ru/3.0/c-api/import.html#PyImport_ImportModule)\\nтеперь по умолчанию выполняют абсолютный импорт, а не относительный.\\nЭто повлияет на расширения C, которые импортируют другие модули.
- C API: типы данных расширений, которые не должны быть хэшируемыми,\\nдолжны определять свой слот `tp_hash` как\\n[`PyObject_HashNotImplemented`](https://python-all.ru/3.0/c-api/object.html#PyObject_HashNotImplemented).
- В модуле [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) исключение [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error) теперь наследуется от [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError). Ранее оно не было подклассом `StandardError`, но теперь им стало через [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError). (Реализовано Грегори П. Смитом; [issue 1706815](https://python-all.ru/3.0/whatsnew/2.6.html).)
- Модуль `xmlrpclib` больше не преобразует автоматически [`datetime.date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и [`datetime.time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) в тип `xmlrpclib.DateTime`; семантика преобразования не обязательно была корректна для всех приложений. Код, использующий `xmlrpclib`, должен преобразовывать экземпляры `date` и `time` . ([issue 1330538](https://python-all.ru/3.0/whatsnew/2.6.html))
- (Режим предупреждения 3.0) Класс `Exception` теперь выдаёт предупреждение\\nпри доступе с помощью среза или индекса; поведение `Exception`\\nкак кортежа постепенно прекращается.
- (Режим предупреждений для версии 3.0) Сравнения на неравенство между двумя словарями или двумя объектами, не реализующими методы сравнения, теперь выводят предупреждения. `dict1 == dict2` всё ещё работает, но `dict1 < dict2` постепенно убирается.

  Сравнения между ячейками (cells), которые являются деталью реализации правил области видимости Python, также вызывают предупреждения, поскольку такие сравнения полностью запрещены в 3.0.

## Благодарности

Автор хотел бы поблагодарить следующих людей за предложения, исправления и помощь с различными черновиками этой статьи: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.
