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

---

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

| Автор: | R. David Murray \<[rdmurray@bitdance.com](https://python-all.ru/3.4/whatsnew/3.4.html)\> (Редактор) |
| --- | --- |

Эта статья описывает новые возможности в Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 г. Для получения полной информации см. [список изменений](https://python-all.ru/3.4/whatsnew/changelog.html).

> **См. также**
>
> [**PEP 429**](https://python-all.ru/3.4/whatsnew/3.4.html) – График выпуска Python 3.4

## Краткий обзор – Основные моменты выпуска

Новые синтаксические возможности:

- В Python 3.4 не было добавлено новых синтаксических возможностей.

Другие новые возможности:

- [*pip всегда должен быть доступен*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-453) ([**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [*Вновь созданные файловые дескрипторы не наследуются*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-446) ([**PEP 446**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- опция командной строки для [*изолированного режима*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-isolated-mode) ([issue 16499](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [*улучшения в обработке кодеков*](https://python-all.ru/3.4/whatsnew/3.4.html#codec-handling-improvements) , которые не являются текстовыми кодировками (множество проблем).
- [*Тип ModuleSpec*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-451) для системы импорта ([**PEP 451**](https://python-all.ru/3.4/whatsnew/3.4.html)). (Влияет на авторов импортёров.)
- Формат [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) стал [*более компактным и эффективным*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-marshal-3) ([issue 16475](https://python-all.ru/3.4/whatsnew/3.4.html)).

Новые модули библиотеки:

- [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio): [*Новый временный API для асинхронного ввода-вывода*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-asyncio) ([**PEP 3156**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`ensurepip`](https://python-all.ru/3.4/library/ensurepip.html#module-ensurepip): [*Загрузка установщика pip*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-ensurepip) ([**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`enum`](https://python-all.ru/3.4/library/enum.html#module-enum): [*Поддержка перечислений*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-enum) ([**PEP 435**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`pathlib`](https://python-all.ru/3.4/library/pathlib.html#module-pathlib): [*Объектно-ориентированные пути файловой системы*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pathlib) ([**PEP 428**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors): [*Высокоуровневая и эффективная мультиплексация ввода-вывода*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-selectors), построенная на примитивах модуля [`select`](https://python-all.ru/3.4/library/select.html#module-select) (часть [**PEP 3156**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`statistics`](https://python-all.ru/3.4/library/statistics.html#module-statistics): Базовая [*численно устойчивая библиотека статистики*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-statistics) ([**PEP 450**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc): [*Отслеживание выделения памяти в Python*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-tracemalloc) ([**PEP 454**](https://python-all.ru/3.4/whatsnew/3.4.html)).

Значительно улучшенные библиотечные модули:

- [*Обобщённые функции с единой диспетчеризацией*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-singledispatch) в [`functools`](https://python-all.ru/3.4/library/functools.html#module-functools) ([**PEP 443**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Новый [`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) [*протокол 4*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-protocol-4) ([**PEP 3154**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) теперь имеет [*опцию для отказа от использования os.fork в Unix*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-multiprocessing-no-fork) ([issue 8713](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`email`](https://python-all.ru/3.4/library/email.html#module-email) содержит новый подмодуль [`contentmanager`](https://python-all.ru/3.4/library/email.contentmanager.html#module-email.contentmanager) и новый подкласс [`Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message) (`EmailMessage`), который [*упрощает обработку MIME*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-email-contentmanager) ([issue 18891](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Модули [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) и [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc) теперь способны корректно интроспектировать гораздо более широкий спектр вызываемых объектов, что улучшает вывод системы Python [`help()`](https://python-all.ru/3.4/library/functions.html#help).
- API модуля [`ipaddress`](https://python-all.ru/3.4/library/ipaddress.html#module-ipaddress) объявлен стабильным

Улучшения в области безопасности:

- [*Безопасный и взаимозаменяемый алгоритм хеширования*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-456) ([**PEP 456**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [*Сделать вновь созданные файловые дескрипторы ненаследуемыми*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-446) ([**PEP 446**](https://python-all.ru/3.4/whatsnew/3.4.html)), чтобы избежать утечки файловых дескрипторов в дочерние процессы.
- Новая опция командной строки для [*изолированного режима*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-isolated-mode), ([issue 16499](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) теперь имеет [*опцию для отказа от использования os.fork в Unix*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-multiprocessing-no-fork). Методы *spawn* и *forkserver* более безопасны, поскольку не передают данные дочерним процессам.
- Дочерние процессы [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) в Windows больше не наследуют все наследуемые дескрипторы родителя, а только необходимые.
- Новая функция [`hashlib.pbkdf2_hmac()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.pbkdf2_hmac) предоставляет [функцию формирования ключа на основе пароля PKCS#5 версии 2](https://python-all.ru/3.4/whatsnew/3.4.html).
- [*Поддержка TLSv1.1 и TLSv1.2*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-tls-11-12) для [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl).
- [*Поддержка получения сертификатов из системного хранилища сертификатов Windows*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew34-win-cert-store) для [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl).
- [*Поддержка SNI (Server Name Indication) на стороне сервера*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew34-sni) для [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl).
- Класс [`ssl.SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) получил [*множество улучшений*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew34-sslcontext).
- Все модули стандартной библиотеки, поддерживающие SSL, теперь поддерживают проверку сертификатов сервера, включая сопоставление имени хоста ([`ssl.match_hostname()`](https://python-all.ru/3.4/library/ssl.html#ssl.match_hostname)) и списки отзыва сертификатов (CRL, см. [`ssl.SSLContext.load_verify_locations()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_verify_locations)).

Улучшения реализации CPython:

- [*Безопасная финализация объектов*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-442) ([**PEP 442**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Благодаря [**PEP 442**](https://python-all.ru/3.4/whatsnew/3.4.html), в большинстве случаев [*глобальные переменные модуля больше не устанавливаются в None при завершении работы*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-442) ([issue 18214](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [*Настраиваемые распределители памяти*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-445) ([**PEP 445**](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [*Argument Clinic*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-436) ([**PEP 436**](https://python-all.ru/3.4/whatsnew/3.4.html))

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

## Новые возможности

### PEP 453: Явная начальная загрузка PIP в установках Python

#### Автоматическая установка pip по умолчанию

Новый модуль [`ensurepip`](https://python-all.ru/3.4/library/ensurepip.html#module-ensurepip) (определённый в [**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html)) предоставляет стандартный кроссплатформенный механизм для начальной установки pip в установки Python и виртуальные окружения. Версия `pip`, включённая в Python 3.4.0, – `pip` 1.5.4, а будущие выпуски 3.4.x будут обновлять встроенную версию до последней версии `pip`, доступной на момент создания кандидата в релизы.

По умолчанию команды `pipX` и `pipX.Y` будут установлены на всех платформах (где X.Y обозначает версию установки Python), вместе с пакетом Python `pip` и его зависимостями. В Windows и в виртуальных окружениях на всех платформах, команда без версии `pip` также будет установлена. На других платформах системная команда без версии `pip` обычно относится к отдельно установленной версии Python 2.

Утилита командной строки [*pyvenv*](https://python-all.ru/3.4/using/scripts.html#scripts-pyvenv) и модуль [`venv`](https://python-all.ru/3.4/library/venv.html#module-venv) используют модуль [`ensurepip`](https://python-all.ru/3.4/library/ensurepip.html#module-ensurepip), чтобы сделать `pip` легко доступным в виртуальных окружениях. При использовании утилиты командной строки `pip` устанавливается по умолчанию, а при использовании [`venv`](https://python-all.ru/3.4/library/venv.html#module-venv) модуля [*API*](https://python-all.ru/3.4/library/venv.html#venv-api) установка `pip` должна быть запрошена явно.

Для [*сборок CPython из исходного кода в POSIX-системах*](https://python-all.ru/3.4/using/unix.html#building-python-on-unix) команды `make install` и `make altinstall` по умолчанию выполняют начальную установку `pip`. Это поведение можно контролировать с помощью параметров configure и переопределять параметрами Makefile.

В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают `pip` вместе с самим CPython (пользователи могут отказаться от его установки во время процесса установки). Пользователям Windows нужно будет согласиться на автоматические изменения `PATH`, чтобы `pip` был доступен из командной строки по умолчанию, в противном случае к нему можно обратиться через загрузчик Python для Windows как `py -m pip`.

Как [обсуждается в PEP](https://python-all.ru/3.4/whatsnew/3.4.html), разработчики дистрибутивов могут принять решение не устанавливать эти команды по умолчанию, при условии, что при их вызове они предоставляют четкие и простые инструкции по их установке на этой платформе (обычно с помощью системного менеджера пакетов).

> **Примечание**
>
> Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3, по умолчанию при прямом вызове `ensurepip` устанавливаются только версионированные команды `pip3` и `pip3.4` – опция `--default-pip` необходима, чтобы также запросить команду без версии `pip`. `pyvenv` и установщик Windows гарантируют, что команда без квалификатора `pip` доступна в этих окружениях, и `pip` всегда можно вызвать через переключатель `-m`, а не напрямую, чтобы избежать неоднозначности в системах с несколькими установками Python.

#### Изменения в документации

В рамках этого изменения разделы [*Установка модулей Python*](https://python-all.ru/3.4/installing/index.html#installing-index) и [*Распространение модулей Python*](https://python-all.ru/3.4/distributing/index.html#distributing-index) документации были полностью переработаны в короткие вводные руководства и FAQ. Большая часть документации по упаковке теперь перенесена в [Руководство пользователя по упаковке Python](https://python-all.ru/3.4/whatsnew/3.4.html), поддерживаемое Python Packaging Authority, и в документацию отдельных проектов.

Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как [*Installing Python Modules (Legacy version)*](https://python-all.ru/3.4/install/index.html#install-index) и [*Distributing Python Modules (Legacy version)*](https://python-all.ru/3.4/distutils/index.html#distutils-index).

> **См. также**
>
> **[**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html) – Явная автоматическая установка pip в дистрибутивах Python**
>
> PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.

### PEP 446: Вновь созданные файловые дескрипторы являются ненаследуемыми

[**PEP 446**](https://python-all.ru/3.4/whatsnew/3.4.html) делает вновь созданные файловые дескрипторы [*ненаследуемыми*](https://python-all.ru/3.4/library/os.html#fd-inheritance). В целом, это поведение, которое нужно приложению: при запуске нового процесса наличие открытых файлов также открытыми в новом процессе может привести к всевозможным труднонаходимым ошибкам и потенциально к проблемам безопасности.

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

- [`os.get_inheritable()`](https://python-all.ru/3.4/library/os.html#os.get_inheritable), [`os.set_inheritable()`](https://python-all.ru/3.4/library/os.html#os.set_inheritable)
- [`os.get_handle_inheritable()`](https://python-all.ru/3.4/library/os.html#os.get_handle_inheritable), [`os.set_handle_inheritable()`](https://python-all.ru/3.4/library/os.html#os.set_handle_inheritable)
- [`socket.socket.get_inheritable()`](https://python-all.ru/3.4/library/socket.html#socket.socket.get_inheritable), [`socket.socket.set_inheritable()`](https://python-all.ru/3.4/library/socket.html#socket.socket.set_inheritable)

> **См. также**
>
> **[**PEP 446**](https://python-all.ru/3.4/whatsnew/3.4.html) – Сделать вновь созданные файловые дескрипторы ненаследуемыми**
>
> PEP написан и реализован Victor Stinner.

### Улучшения в работе с кодеками

С самого начала модуль [`codecs`](https://python-all.ru/3.4/library/codecs.html#module-codecs) предназначался для работы как типонезависимая динамическая система кодирования и декодирования. Однако его тесная связь с текстовой моделью Python, особенно методы удобства, ограниченные конкретными типами, на встроенных [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray), долгое время скрывали этот факт.

Важным шагом к прояснению ситуации стало то, что функции удобства [`codecs.encode()`](https://python-all.ru/3.4/library/codecs.html#codecs.encode) и [`codecs.decode()`](https://python-all.ru/3.4/library/codecs.html#codecs.decode) теперь должным образом документированы в Python 2.7, 3.3 и 3.4. Эти функции присутствуют в модуле [`codecs`](https://python-all.ru/3.4/library/codecs.html#module-codecs) (и покрыты регрессионными тестами) начиная с Python 2.4, но ранее были доступны только через интроспекцию во время выполнения.

В отличие от методов удобства на [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray), функции удобства [`codecs`](https://python-all.ru/3.4/library/codecs.html#module-codecs) поддерживают произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются кодировками текста Unicode (в Python 3) или преобразованиями `basestring` \<-\> `basestring` (в Python 2).

В Python 3.4 интерпретатор может распознавать известные нетекстовые кодировки, предоставляемые стандартной библиотекой, и при необходимости направлять пользователей к этим универсальным вспомогательным функциям:

```python
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
```

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

```python
>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
```

Наконец, как показывают примеры выше, эти улучшения позволили восстановить вспомогательные псевдонимы для неюникодных кодеков, которые сами были восстановлены в Python 3.2. Это означает, что кодирование двоичных данных в их шестнадцатеричное представление и обратно (например) теперь можно записать так:

```python
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
```

Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в [*Двоичные преобразования*](https://python-all.ru/3.4/library/codecs.html#binary-transforms) и [*Текстовые преобразования*](https://python-all.ru/3.4/library/codecs.html#text-transforms).

(Предложено Ником Когланом в [issue 7475](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 17827](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 17828](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 19619](https://python-all.ru/3.4/whatsnew/3.4.html).)

### PEP 451: Тип ModuleSpec для системы импорта

[**PEP 451**](https://python-all.ru/3.4/whatsnew/3.4.html) предоставляет инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (то есть спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько API, связанных с импортом. Это изменение также является ступенькой к [нескольким будущим улучшениям импорта](https://python-all.ru/3.4/whatsnew/3.4.html).

Изменения, видимые публично, полностью обратно совместимы. Более того, они должны быть незаметны для всех, кроме авторов импортеров. Ключевые методы finder и loader объявлены устаревшими, но продолжат работать. Новые импортеры должны использовать новые методы, описанные в PEP. Существующие импортеры следует обновить для реализации новых методов. См. раздел [*Устаревшее*](https://python-all.ru/3.4/whatsnew/3.4.html#deprecated-3-4) со списком методов, которые следует заменить, и их замен.

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

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

- База данных Unicode обновлена до версии UCD 6.3.
- [`min()`](https://python-all.ru/3.4/library/functions.html#min) и [`max()`](https://python-all.ru/3.4/library/functions.html#max) теперь принимают именованный аргумент *default*, который можно использовать для указания значения, возвращаемого, если итерируемый объект не содержит элементов. (Предложено Джулианом Берманом в [issue 18111](https://python-all.ru/3.4/whatsnew/3.4.html).)
- На объекты модулей теперь можно создавать слабые ссылки ([`weakref`](https://python-all.ru/3.4/library/weakref.html#module-weakref)).
- Атрибуты `__file__` модулей (и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением: `__main__.__file__`, когда скрипт был запущен напрямую с относительным путём. (Предложено Бреттом Кэнноном в [issue 18416](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Все кодеки UTF-\* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если не используется обработчик ошибок `surrogatepass`, за исключением декодера UTF-16 (который принимает корректные суррогатные пары) и кодера UTF-16 (который создаёт их при кодировании символов вне BMP). (Предложено Виктором Стиннером, Кан-Хао (Кенни) Лу и Сергеем Сторчакой в [issue 12892](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новый немецкий EBCDIC-кодек [*codec*](https://python-all.ru/3.4/library/codecs.html#standard-encodings) `cp273`. (Предложено Майклом Бирнфельдом и Эндрю Кучлингом в [issue 1097797](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новый украинский [*codec*](https://python-all.ru/3.4/library/codecs.html#standard-encodings) `cp1125`. (Предложено Сергеем Сторчакой в [issue 19668](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes).join() и [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray).join() теперь принимают произвольные буферные объекты в качестве аргументов. (Предложено Антуаном Питру в [issue 15958](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Конструктор [`int`](https://python-all.ru/3.4/library/functions.html#int) теперь принимает любой объект, имеющий метод `__index__`, для аргумента *base*. (Предложено Марком Дикинсоном в [issue 16772](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Объекты фреймов теперь имеют метод [`clear()`](https://python-all.ru/3.4/reference/datamodel.html#frame.clear), который удаляет все ссылки на локальные переменные из фрейма. (Предложено Антуаном Питру в [issue 17934](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`memoryview`](https://python-all.ru/3.4/library/stdtypes.html#memoryview) теперь зарегистрирован как [`Sequence`](https://python-all.ru/3.4/library/collections.abc.html#module-collections.abc) и поддерживает встроенную функцию [`reversed()`](https://python-all.ru/3.4/library/functions.html#reversed). (Предложено Ником Когланом и Клодиу Попой в [issue 18690](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 19078](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Сигнатуры, выводимые [`help()`](https://python-all.ru/3.4/library/functions.html#help), были изменены и улучшены в нескольких случаях в результате внедрения Argument Clinic и других изменений в модулях [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) и [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc).
- [`__length_hint__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__length_hint__) теперь является частью формальной спецификации языка (см. [**PEP 424**](https://python-all.ru/3.4/whatsnew/3.4.html)). (Предложено Армином Ронахером в [issue 16148](https://python-all.ru/3.4/whatsnew/3.4.html).)

## Новые модули

### asyncio

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

Для Python 3.4 этот модуль считается [*временным API*](https://python-all.ru/3.4/glossary.html#term-provisional-api).

> **См. также**
>
> **[**PEP 3156**](https://python-all.ru/3.4/whatsnew/3.4.html) – Асинхронный ввод-вывод: перезагрузка: модуль «asyncio»**
>
> PEP написан, реализацией руководил Гвидо ван Россум.

### ensurepip

Новый модуль [`ensurepip`](https://python-all.ru/3.4/library/ensurepip.html#module-ensurepip) является основной инфраструктурой для реализации [**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html). В обычных условиях конечным пользователям не придётся взаимодействовать с этим модулем, но его можно использовать для ручной начальной загрузки `pip`, если автоматическая установка в текущее окружение или виртуальное окружение была отклонена.

[`ensurepip`](https://python-all.ru/3.4/library/ensurepip.html#module-ensurepip) включает встроенную копию `pip`, актуальную на момент первого кандидата в релиз той версии CPython, с которой поставляется (это относится как к исправляющим, так и к функциональным релизам). `ensurepip` не обращается к интернету. Если установка имеет доступ в интернет, после запуска `ensurepip` встроенный `pip` можно использовать для обновления `pip` до более новой версии, чем встроенная. (Обратите внимание, что такая обновлённая версия `pip` считается отдельно установленным пакетом и не будет удалена при удалении Python.)

Модуль назван *ensure*pip, потому что если его вызвать, когда `pip` уже установлен, он ничего не делает. У него также есть опция `--upgrade`, которая заставит его установить встроенную копию `pip`, если существующая установленная версия `pip` старше встроенной.

### enum

Новый модуль [`enum`](https://python-all.ru/3.4/library/enum.html#module-enum) (определённый в [**PEP 435**](https://python-all.ru/3.4/whatsnew/3.4.html)) предоставляет стандартную реализацию перечисляемых типов, позволяя другим модулям (например, [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket)) выдавать более информативные сообщения об ошибках и улучшенную поддержку отладки за счёт замены непрозрачных целочисленных констант на обратно совместимые значения перечислений.

> **См. также**
>
> **[**PEP 435**](https://python-all.ru/3.4/whatsnew/3.4.html) – Добавление типа Enum в стандартную библиотеку Python**
>
> PEP написан Барри Варшавой, Илай Бендерски и Итаном Фурманом, реализован Итаном Фурманом.

### pathlib

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

Для Python 3.4 этот модуль считается [*временным API*](https://python-all.ru/3.4/glossary.html#term-provisional-api).

> **См. также**
>
> **[**PEP 428**](https://python-all.ru/3.4/whatsnew/3.4.html) – Модуль pathlib – объектно-ориентированные пути файловой системы**
>
> PEP написан и реализован Antoine Pitrou.

### selectors

Новый модуль [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors) (созданный в рамках реализации [**PEP 3156**](https://python-all.ru/3.4/whatsnew/3.4.html)) позволяет выполнять высокоуровневое и эффективное мультиплексирование ввода-вывода на основе примитивов модуля [`select`](https://python-all.ru/3.4/library/select.html#module-select).

### statistics

The new [`statistics`](https://python-all.ru/3.4/library/statistics.html#module-statistics) module (defined in [**PEP 450**](https://python-all.ru/3.4/whatsnew/3.4.html)) offers some core statistics functionality directly in the standard library. This module supports calculation of the mean, median, mode, variance and standard deviation of a data series.

> **См. также**
>
> **[**PEP 450**](https://python-all.ru/3.4/whatsnew/3.4.html) – Добавление модуля статистики в стандартную библиотеку**
>
> PEP написан и реализован Стивеном Д’Апрано

### tracemalloc

Новый модуль [`tracemalloc`](https://python-all.ru/3.4/library/tracemalloc.html#module-tracemalloc) (описан в [**PEP 454**](https://python-all.ru/3.4/whatsnew/3.4.html)) – это инструмент отладки для трассировки блоков памяти, выделяемых Python. Он предоставляет следующую информацию:

- Отслеживание места выделения объекта
- Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти
- Вычисление различий между двумя снимками для обнаружения утечек памяти

> **См. также**
>
> **[**PEP 454**](https://python-all.ru/3.4/whatsnew/3.4.html) – Добавление нового модуля tracemalloc для отслеживания выделений памяти Python**
>
> Автор PEP и разработчик: Victor Stinner

## Улучшенные модули

### abc

Новую функцию [`abc.get_cache_token()`](https://python-all.ru/3.4/library/abc.html#abc.get_cache_token) можно использовать, чтобы узнать, когда нужно сбрасывать кеши, на которые влияют изменения в графе объектов. (Автор: Łukasz Langa, [issue 16832](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый класс [`ABC`](https://python-all.ru/3.4/library/abc.html#abc.ABC) имеет мета-класс [`ABCMeta`](https://python-all.ru/3.4/library/abc.html#abc.ABCMeta). Использование `ABC` в качестве базового класса даёт тот же эффект, что и указание `metaclass=abc.ABCMeta`, но запись получается проще и читается легче. (Автор: Bruno Dupuis, [issue 16049](https://python-all.ru/3.4/whatsnew/3.4.html).)

### aifc

Метод [`getparams()`](https://python-all.ru/3.4/library/aifc.html#aifc.aifc.getparams) теперь возвращает именованный кортеж, а не простой кортеж. (Автор: Claudiu Popa, [issue 17818](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`aifc.open()`](https://python-all.ru/3.4/library/aifc.html#aifc.open) теперь поддерживает протокол менеджера контекста: при использовании в блоке [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) метод [`close()`](https://python-all.ru/3.4/library/aifc.html#aifc.aifc.close) возвращаемого объекта будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka, [задача 16486](https://python-all.ru/3.4/whatsnew/3.4.html).)

Методы [`writeframesraw()`](https://python-all.ru/3.4/library/aifc.html#aifc.aifc.writeframesraw) и [`writeframes()`](https://python-all.ru/3.4/library/aifc.html#aifc.aifc.writeframes) теперь принимают любой [*bytes-like object*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object). (Автор: Serhiy Storchaka, [issue 8311](https://python-all.ru/3.4/whatsnew/3.4.html).)

### argparse

Класс [`FileType`](https://python-all.ru/3.4/library/argparse.html#argparse.FileType) теперь принимает аргументы *encoding* и *errors*, которые передаются в [`open()`](https://python-all.ru/3.4/library/functions.html#open). (Автор: Lucas Maystre, [issue 11175](https://python-all.ru/3.4/whatsnew/3.4.html).)

### audioop

[`audioop`](https://python-all.ru/3.4/library/audioop.html#module-audioop) теперь поддерживает 24-битные сэмплы. (Автор: Serhiy Storchaka, [issue 12866](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новая функция [`byteswap()`](https://python-all.ru/3.4/library/audioop.html#audioop.byteswap) преобразует сэмплы из формата big-endian в little-endian и обратно. (Автор: Serhiy Storchaka, [issue 19641](https://python-all.ru/3.4/whatsnew/3.4.html).)

Все функции [`audioop`](https://python-all.ru/3.4/library/audioop.html#module-audioop) теперь принимают любой [*bytes-like object*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object). Строки не принимаются: раньше они не работали, теперь сразу вызывают ошибку. (Автор: Serhiy Storchaka, [issue 16685](https://python-all.ru/3.4/whatsnew/3.4.html).)

### base64

Функции кодирования и декодирования в [`base64`](https://python-all.ru/3.4/library/base64.html#module-base64) теперь принимают любой [*bytes-like object*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object) вместо ранее требовавшегося экземпляра [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) или [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray). (Автор: Nick Coghlan, [issue 17839](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новые функции [`a85encode()`](https://python-all.ru/3.4/library/base64.html#base64.a85encode), [`a85decode()`](https://python-all.ru/3.4/library/base64.html#base64.a85decode), [`b85encode()`](https://python-all.ru/3.4/library/base64.html#base64.b85encode) и [`b85decode()`](https://python-all.ru/3.4/library/base64.html#base64.b85decode) позволяют кодировать и декодировать двоичные данные соответственно в форматы `Ascii85` и `Base85` (используемый в git/mercurial). Функции `a85` имеют параметры, позволяющие сделать их совместимыми с разновидностями кодировки `Ascii85`, включая вариант Adobe. (Авторы: Martin Morrison, проект Mercurial, Serhiy Storchaka и Antoine Pitrou, [issue 17618](https://python-all.ru/3.4/whatsnew/3.4.html).)

### collections

Метод [`ChainMap.new_child()`](https://python-all.ru/3.4/library/collections.html#collections.ChainMap.new_child) теперь принимает аргумент *m*, задающий дочернее отображение для добавления в цепочку. Это позволяет использовать для дочернего элемента существующее отображение и/или пользовательский тип отображения. (Автор: Vinay Sajip, [issue 16613](https://python-all.ru/3.4/whatsnew/3.4.html).)

### colorsys

Количество цифр в коэффициентах для преобразования RGB – YIQ было расширено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов не должно превышать 1% и может лучше совпадать с результатами из других источников. (Авторы: Brian Landers и Serhiy Storchaka, [issue 14323](https://python-all.ru/3.4/whatsnew/3.4.html).)

### contextlib

Новый менеджер контекста [`contextlib.suppress`](https://python-all.ru/3.4/library/contextlib.html#contextlib.suppress) помогает прояснить намерение кода, который намеренно подавляет исключения от одной инструкции. (Авторы: Raymond Hettinger, [issue 15806](https://python-all.ru/3.4/whatsnew/3.4.html), и Zero Piraeus, [issue 19266](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый менеджер контекста [`contextlib.redirect_stdout()`](https://python-all.ru/3.4/library/contextlib.html#contextlib.redirect_stdout) упрощает для вспомогательных скриптов работу с негибкими API, которые выводят результаты в [`sys.stdout`](https://python-all.ru/3.4/library/sys.html#sys.stdout) и не предоставляют возможности перенаправить его. Используя менеджер контекста, вывод в [`sys.stdout`](https://python-all.ru/3.4/library/sys.html#sys.stdout) можно перенаправить в любой другой поток или, в сочетании с [`io.StringIO`](https://python-all.ru/3.4/library/io.html#io.StringIO), в строку. Последнее может быть особенно полезно, например, для захвата вывода от функции, написанной для реализации интерфейса командной строки. Рекомендуется использовать только во вспомогательных скриптах, так как это влияет на глобальное состояние [`sys.stdout`](https://python-all.ru/3.4/library/sys.html#sys.stdout). (Автор: Raymond Hettinger, [issue 15805](https://python-all.ru/3.4/whatsnew/3.4.html).)

Документация к [`contextlib`](https://python-all.ru/3.4/library/contextlib.html#module-contextlib) также была обновлена и включает [*обсуждение*](https://python-all.ru/3.4/library/contextlib.html#single-use-reusable-and-reentrant-cms) различий между одноразовыми, многократно используемыми и реентерабельными менеджерами контекста.

### dbm

Объекты [`dbm.open()`](https://python-all.ru/3.4/library/dbm.html#dbm.open) теперь поддерживают протокол менеджера контекста. При использовании в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) метод `close` объекта базы данных будет вызван автоматически в конце блока. (Авторы: Claudiu Popa и Nick Coghlan, [issue 19282](https://python-all.ru/3.4/whatsnew/3.4.html).)

### dis

Функции [`show_code()`](https://python-all.ru/3.4/library/dis.html#dis.show_code), [`dis()`](https://python-all.ru/3.4/library/dis.html#dis.dis), [`distb()`](https://python-all.ru/3.4/library/dis.html#dis.distb) и [`disassemble()`](https://python-all.ru/3.4/library/dis.html#dis.disassemble) теперь принимают именованный аргумент *file*, который определяет, куда они выводят результат.

Модуль [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) теперь построен на основе класса [`Instruction`](https://python-all.ru/3.4/library/dis.html#dis.Instruction), который предоставляет объектно-ориентированный доступ к деталям каждой отдельной операции байт-кода.

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

```python
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
```

Различные инструменты отображения в модуле [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) были переписаны для использования этих новых компонентов.

Кроме того, новый удобный для приложений класс [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) предоставляет объектно-ориентированный API для анализа байт-кода как в удобочитаемой форме, так и для итерации по инструкциям. Конструктор [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) принимает те же аргументы, что и `get_instruction()` (плюс необязательный *current\_offset*), и полученный объект можно итерировать для получения объектов [`Instruction`](https://python-all.ru/3.4/library/dis.html#dis.Instruction). Но у него также есть метод [`dis`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode.dis), эквивалентный вызову [`dis`](https://python-all.ru/3.4/library/dis.html#dis.dis) на аргументе конструктора, но возвращающий многострочную строку:

```python
>>> bytecode = dis.Bytecode(lambda x: x +1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()       
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']
```

[`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) также имеет метод класса [`from_traceback()`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode.from_traceback), который позволяет манипулировать трассировкой (то есть `print(Bytecode.from_traceback(tb).dis())` эквивалентно `distb(tb)`).

(Предложено Nick Coghlan, Ryan Kelly и Thomas Kluyver в [issue 11816](https://python-all.ru/3.4/whatsnew/3.4.html) и Claudiu Popa в [issue 17916](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новая функция [`stack_effect()`](https://python-all.ru/3.4/library/dis.html#dis.stack_effect) вычисляет влияние на стек Python заданного опкода и аргумента – информацию, недоступную иным способом. (Предложено Larry Hastings в [issue 19722](https://python-all.ru/3.4/whatsnew/3.4.html).)

### doctest

Новый [*флаг опции*](https://python-all.ru/3.4/library/doctest.html#doctest-options) [`FAIL_FAST`](https://python-all.ru/3.4/library/doctest.html#doctest.FAIL_FAST) останавливает выполнение тестов при первом же обнаружении ошибки. (Предложено R. David Murray и Daniel Urban в [issue 16522](https://python-all.ru/3.4/whatsnew/3.4.html).)

Интерфейс командной строки [`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest) теперь использует [`argparse`](https://python-all.ru/3.4/library/argparse.html#module-argparse) и имеет две новые опции: `-o` и `-f`. `-o` позволяет указывать [*опции doctest*](https://python-all.ru/3.4/library/doctest.html#doctest-options) в командной строке, а `-f` является сокращением для `-o FAIL_FAST` (по аналогии с подобной опцией, поддерживаемой [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) CLI). (Предложено R. David Murray в [issue 11390](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest) теперь будет находить доктесты в строках `__doc__` модулей расширения. (Предложено Zachary Ware в [issue 3158](https://python-all.ru/3.4/whatsnew/3.4.html).)

### email

[`as_string()`](https://python-all.ru/3.4/library/email.message.html#email.message.Message.as_string) теперь принимает аргумент *policy* для переопределения политики сообщения по умолчанию при формировании его строкового представления. Это означает, что `as_string` теперь можно использовать в большем числе ситуаций, без необходимости создавать и использовать [`generator`](https://python-all.ru/3.4/library/email.generator.html#module-email.generator) для передачи параметров форматирования его методу `flatten`. (Предложено R. David Murray в [issue 18600](https://python-all.ru/3.4/whatsnew/3.4.html).)

Добавлен новый метод [`as_bytes()`](https://python-all.ru/3.4/library/email.message.html#email.message.Message.as_bytes) для получения байтового представления сообщения, аналогично тому, как `as_string` даёт строковое представление. Он не принимает аргумент *maxheaderlen*, но принимает аргументы *unixfrom* и *policy*. Метод [`Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message) [`__bytes__()`](https://python-all.ru/3.4/library/email.message.html#email.message.Message.__bytes__) вызывает его, так что `bytes(mymsg)` теперь будет давать интуитивно понятный результат: объект bytes, содержащий полностью отформатированное сообщение. (Предложено R. David Murray в [issue 18600](https://python-all.ru/3.4/whatsnew/3.4.html).)

Метод [`Message.set_param()`](https://python-all.ru/3.4/library/email.message.html#email.message.Message.set_param) теперь принимает именованный аргумент *replace*. При его указании соответствующий заголовок будет обновлён без изменения его позиции в списке заголовков. Для обратной совместимости значение по умолчанию – `False`. (Предложено R. David Murray в [issue 18891](https://python-all.ru/3.4/whatsnew/3.4.html).)

Добавлена пара новых подклассов [`Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message) ([`EmailMessage`](https://python-all.ru/3.4/library/email.contentmanager.html#email.message.EmailMessage) и [`MIMEPart`](https://python-all.ru/3.4/library/email.contentmanager.html#email.message.MIMEPart)), а также новый подмодуль [`contentmanager`](https://python-all.ru/3.4/library/email.contentmanager.html#module-email.contentmanager) и новый атрибут [`policy`](https://python-all.ru/3.4/library/email.policy.html#module-email.policy) [`content_manager`](https://python-all.ru/3.4/library/email.policy.html#email.policy.EmailPolicy.content_manager). Вся документация сейчас находится в новом модуле, который добавляется как часть нового [*предварительного API email*](https://python-all.ru/3.4/glossary.html#term-provisional-api). Эти классы предоставляют ряд новых методов, которые значительно упрощают извлечение содержимого из сообщений email и вставку содержимого в них. Подробнее см. документацию [`contentmanager`](https://python-all.ru/3.4/library/email.contentmanager.html#module-email.contentmanager) и [*Примеры использования предварительного API*](https://python-all.ru/3.4/library/email-examples.html#email-contentmanager-api-examples). Эти дополнения API завершают основную часть работы, запланированной в рамках проекта email6. Текущий предварительный API планируется сделать окончательным в Python 3.5 (возможно, с несколькими небольшими дополнениями в области обработки ошибок). (Предложено R. David Murray в [issue 18891](https://python-all.ru/3.4/whatsnew/3.4.html).)

### filecmp

Новая функция [`clear_cache()`](https://python-all.ru/3.4/library/filecmp.html#filecmp.clear_cache) позволяет очищать кэш сравнения [`filecmp`](https://python-all.ru/3.4/library/filecmp.html#module-filecmp), который использует информацию [`os.stat()`](https://python-all.ru/3.4/library/os.html#os.stat) для определения, изменился ли файл с момента последнего сравнения. Это может пригодиться, например, если файл мог быть изменён и повторно проверен за время, меньшее, чем разрешающая способность поля времени модификации конкретной файловой системы. (Предложено Mark Levitt в [issue 18149](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый атрибут модуля [`DEFAULT_IGNORES`](https://python-all.ru/3.4/library/filecmp.html#filecmp.DEFAULT_IGNORES) предоставляет список каталогов, используемых как значение по умолчанию для параметра *ignore* функции [`dircmp()`](https://python-all.ru/3.4/library/filecmp.html#filecmp.dircmp). (Предложено Eli Bendersky в [issue 15442](https://python-all.ru/3.4/whatsnew/3.4.html).)

### functools

Новый дескриптор [`partialmethod()`](https://python-all.ru/3.4/library/functools.html#functools.partialmethod) привносит частичное применение аргументов для дескрипторов, подобно тому как [`partial()`](https://python-all.ru/3.4/library/functools.html#functools.partial) обеспечивает его для обычных вызываемых объектов. Новый дескриптор также упрощает получение произвольных вызываемых объектов (включая экземпляры [`partial()`](https://python-all.ru/3.4/library/functools.html#functools.partial)), которые ведут себя как обычные методы экземпляра при включении в определение класса. (Предложено Alon Horev и Nick Coghlan в [issue 4331](https://python-all.ru/3.4/whatsnew/3.4.html).)

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

> **См. также**
>
> **[**PEP 443**](https://python-all.ru/3.4/whatsnew/3.4.html) – Однодиспетчерские обобщённые функции**
>
> PEP написан и реализован Лукашем Лангой.

[`total_ordering()`](https://python-all.ru/3.4/library/functools.html#functools.total_ordering) теперь поддерживает возврат значения [`NotImplemented`](https://python-all.ru/3.4/library/constants.html#NotImplemented) из нижележащей функции сравнения. (Предложено Katie Miller в [issue 10042](https://python-all.ru/3.4/whatsnew/3.4.html).)

Чисто-питоновская версия функции [`partial()`](https://python-all.ru/3.4/library/functools.html#functools.partial) теперь находится в стандартной библиотеке; в CPython она переопределяется ускоренной версией на C, но доступна для использования в других реализациях. (Предложено Brian Thorne в [issue 12428](https://python-all.ru/3.4/whatsnew/3.4.html).)

### gc

Новая функция [`get_stats()`](https://python-all.ru/3.4/library/gc.html#gc.get_stats) возвращает список из трёх словарей (по одному на поколение), содержащих статистику сборок мусора с момента запуска интерпретатора. (Предложено Antoine Pitrou в [issue 16351](https://python-all.ru/3.4/whatsnew/3.4.html).)

### glob

Новая функция [`escape()`](https://python-all.ru/3.4/library/glob.html#glob.escape) предоставляет способ экранировать специальные символы в имени файла, чтобы они не участвовали в раскрытии шаблона glob, а вместо этого сопоставлялись буквально. (Предложено Serhiy Storchaka в [задаче 8402](https://python-all.ru/3.4/whatsnew/3.4.html).)

### hashlib

Новая функция [`hashlib.pbkdf2_hmac()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.pbkdf2_hmac) реализует [функцию формирования ключа на основе пароля PBKDF2 (PKCS#5)](https://python-all.ru/3.4/whatsnew/3.4.html). (Предложено Christian Heimes в [issue 18582](https://python-all.ru/3.4/whatsnew/3.4.html).)

Атрибут [`name`](https://python-all.ru/3.4/library/hashlib.html#hashlib.hash.name) хеш-объектов [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib) теперь является официально поддерживаемым интерфейсом. Он всегда существовал в [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib) CPython (хотя и не возвращал имена в нижнем регистре для всех поддерживаемых хешей), но не был публичным интерфейсом, поэтому некоторые другие реализации Python ранее его не поддерживали. (Предложено Jason R. Coombs в [issue 18532](https://python-all.ru/3.4/whatsnew/3.4.html).)

### hmac

[`hmac`](https://python-all.ru/3.4/library/hmac.html#module-hmac) теперь принимает `bytearray` наряду с `bytes` для аргумента *key* функции [`new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new), а параметр *msg* как функции [`new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new), так и метода [`update()`](https://python-all.ru/3.4/library/hmac.html#hmac.HMAC.update) теперь принимает любой тип, поддерживаемый модулем [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib). (Предложено Jonas Borgström в [issue 18240](https://python-all.ru/3.4/whatsnew/3.4.html).)

Аргумент *digestmod* функции [`hmac.new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new) теперь может быть любым именем хеш-алгоритма, распознаваемым модулем [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib). Кроме того, текущее поведение, при котором значение *digestmod* по умолчанию равно `MD5`, считается устаревшим: в будущей версии Python значения по умолчанию не будет. (Предложено Christian Heimes в [issue 17276](https://python-all.ru/3.4/whatsnew/3.4.html).)

С добавлением атрибутов [`block_size`](https://python-all.ru/3.4/library/hmac.html#hmac.HMAC.block_size) и [`name`](https://python-all.ru/3.4/library/hmac.html#hmac.HMAC.name) (а также формальной документации атрибута [`digest_size`](https://python-all.ru/3.4/library/hmac.html#hmac.HMAC.digest_size)), модуль [`hmac`](https://python-all.ru/3.4/library/hmac.html#module-hmac) теперь полностью соответствует API [**PEP 247**](https://python-all.ru/3.4/whatsnew/3.4.html). (Предложено Christian Heimes в [issue 18775](https://python-all.ru/3.4/whatsnew/3.4.html).)

### html

Новая функция [`unescape()`](https://python-all.ru/3.4/library/html.html#html.unescape) преобразует символьные ссылки HTML5 в соответствующие символы Юникода. (Предложено Ezio Melotti в [issue 2927](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) принимает новый именованный аргумент *convert\_charrefs*, который при значении `True` автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно `False`, но в будущей версии Python оно изменится на `True`, поэтому рекомендуется явно задавать его и обновить код для использования этой новой возможности. (Предложено Ezio Melotti в [issue 13633](https://python-all.ru/3.4/whatsnew/3.4.html).)

Аргумент *strict* класса [`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) теперь считается устаревшим. (Предложено Ezio Melotti в [issue 15114](https://python-all.ru/3.4/whatsnew/3.4.html).)

### http

[`send_error()`](https://python-all.ru/3.4/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error) теперь принимает необязательный дополнительный параметр *explain*, который можно использовать для указания расширенного описания ошибки, переопределяя жёстко заданное значение по умолчанию, если оно есть. Это расширенное описание ошибки будет отформатировано с помощью атрибута `error_message_format` и отправлено в качестве тела ответа об ошибке. (Вклад Karl Cow – [issue 12921](https://python-all.ru/3.4/whatsnew/3.4.html).)

У модуля [`http.server`](https://python-all.ru/3.4/library/http.server.html#module-http.server) [*интерфейс командной строки*](https://python-all.ru/3.4/library/http.server.html#http-server-cli) теперь содержит опцию `-b/--bind`, которая заставляет сервер прослушивать определённый адрес. (Вклад Malte Swart – [issue 17764](https://python-all.ru/3.4/whatsnew/3.4.html).)

### idlelib и IDLE

Поскольку idlelib реализует оболочку IDLE и редактор и не предназначен для импорта другими программами, он получает улучшения с каждым релизом. См. `Lib/idlelib/NEWS.txt` для полного списка изменений начиная с версии 3.3.0, а также изменений, внесённых в будущих выпусках 3.4.x. Этот файл также доступен из диалогового окна IDLE *Help ‣ About IDLE*.

### importlib

Абстрактный класс [`InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader) определяет новый метод, [`source_to_code()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.source_to_code) который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна `compile(data, path, 'exec', dont_inherit=True)`. (Вклад Eric Snow и Brett Cannon – [issue 15627](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader) также теперь имеет реализацию по умолчанию для метода [`get_code()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_code). Однако обычно желательно переопределять реализацию по умолчанию по соображениям производительности. (Вклад Brett Cannon – [issue 18072](https://python-all.ru/3.4/whatsnew/3.4.html).)

Функция [`reload()`](https://python-all.ru/3.4/library/importlib.html#importlib.reload) была перемещена из [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp) в [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) в рамках устаревания модуля [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp). (Вклад Berker Peksag – [issue 18193](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`importlib.util`](https://python-all.ru/3.4/library/importlib.html#module-importlib.util) теперь имеет атрибут [`MAGIC_NUMBER`](https://python-all.ru/3.4/library/importlib.html#importlib.util.MAGIC_NUMBER), предоставляющий доступ к номеру версии байткода. Он заменяет функцию [`get_magic()`](https://python-all.ru/3.4/library/imp.html#imp.get_magic) в устаревшем модуле [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp). (Вклад Brett Cannon – [issue 18192](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новые функции [`importlib.util`](https://python-all.ru/3.4/library/importlib.html#module-importlib.util) [`cache_from_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.cache_from_source) и [`source_from_cache()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.source_from_cache) заменяют одноимённые функции в устаревшем модуле [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp). (Вклад Brett Cannon – [issue 18194](https://python-all.ru/3.4/whatsnew/3.4.html).)

Загрузчик [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) начальной загрузки `NamespaceLoader` теперь соответствует абстрактному классу [`InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader), что означает, что `runpy` и `python -m` теперь можно использовать с пространствами имён пакетов. (Вклад Brett Cannon – [issue 18058](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`importlib.util`](https://python-all.ru/3.4/library/importlib.html#module-importlib.util) имеет новую функцию [`decode_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.decode_source), которая декодирует исходный код из байт, используя универсальную обработку символов новой строки. Это полезно для реализации методов [`InspectLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_source).

[`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader) теперь имеет метод [`get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader.get_filename). Он был случайно пропущен в первоначальной реализации. (Вклад Eric Snow – [issue 19152](https://python-all.ru/3.4/whatsnew/3.4.html).)

### inspect

Модуль [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) теперь предлагает базовый [*интерфейс командной строки*](https://python-all.ru/3.4/library/inspect.html#inspect-module-cli) для быстрого отображения исходного кода и другой информации о модулях, классах и функциях. (Вклад Claudiu Popa и Nick Coghlan – [issue 18626](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`unwrap()`](https://python-all.ru/3.4/library/inspect.html#inspect.unwrap) упрощает распутывание цепочек функций-обёрток, созданных [`functools.wraps()`](https://python-all.ru/3.4/library/functools.html#functools.wraps) (и любого другого API, который устанавливает атрибут `__wrapped__` для функции-обёртки). (Вклад Daniel Urban, Aaron Iles и Nick Coghlan – [issue 13266](https://python-all.ru/3.4/whatsnew/3.4.html).)

В рамках реализации нового модуля [`enum`](https://python-all.ru/3.4/library/enum.html#module-enum), модуль [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) теперь имеет значительно лучшую поддержку пользовательских методов `__dir__` и динамических атрибутов классов, предоставляемых через метаклассы. (Вклад Ethan Furman – [issue 18929](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 19030](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`getfullargspec()`](https://python-all.ru/3.4/library/inspect.html#inspect.getfullargspec) и [`getargspec()`](https://python-all.ru/3.4/library/inspect.html#inspect.getargspec) теперь используют API [`signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature). Это позволяет им поддерживать гораздо более широкий диапазон вызываемых объектов, включая те, у которых есть атрибуты `__signature__`, те, у которых есть метаданные, предоставленные argument clinic, объекты [`functools.partial()`](https://python-all.ru/3.4/library/functools.html#functools.partial) и другие. Обратите внимание, что, в отличие от [`signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature), эти функции по-прежнему игнорируют атрибуты `__wrapped__` и сообщают уже привязанный первый аргумент для связанных методов, поэтому всё ещё необходимо обновлять код для использования [`signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature) напрямую, если требуется такое поведение. (Вклад Yury Selivanov – [issue 17481](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature) теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с помощью Cython. (Вклад Stefan Behnel и Yury Selivanov – [issue 17159](https://python-all.ru/3.4/whatsnew/3.4.html).)

### ipaddress

[`ipaddress`](https://python-all.ru/3.4/library/ipaddress.html#module-ipaddress) был добавлен в стандартную библиотеку в Python 3.3 как [*временный API*](https://python-all.ru/3.4/glossary.html#term-provisional-api). С выходом Python 3.4 этот статус был снят: [`ipaddress`](https://python-all.ru/3.4/library/ipaddress.html#module-ipaddress) теперь считается стабильным API, подпадающим под обычные требования стандартной библиотеки по сохранению обратной совместимости.

Новое свойство [`is_global`](https://python-all.ru/3.4/library/ipaddress.html#ipaddress.IPv4Address.is_global) имеет значение `True`, если адрес является глобально маршрутизируемым. (Вклад Peter Moody – [issue 17400](https://python-all.ru/3.4/whatsnew/3.4.html).)

### logging

У [`TimedRotatingFileHandler`](https://python-all.ru/3.4/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler) появился новый параметр *atTime*, который можно использовать для указания времени дня, когда должна произойти ротация. (Вклад Ronald Oussoren – [issue 9556](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`SocketHandler`](https://python-all.ru/3.4/library/logging.handlers.html#logging.handlers.SocketHandler) и [`DatagramHandler`](https://python-all.ru/3.4/library/logging.handlers.html#logging.handlers.DatagramHandler) теперь поддерживают доменные сокеты Unix (при установке *port* в `None`). (Вклад Vinay Sajip – коммит ce46195b56a9.)

[`fileConfig()`](https://python-all.ru/3.4/library/logging.config.html#logging.config.fileConfig) теперь принимает экземпляр подкласса [`configparser.RawConfigParser`](https://python-all.ru/3.4/library/configparser.html#configparser.RawConfigParser) для параметра *fname*. Это упрощает использование файла конфигурации, когда настройка логирования является лишь частью общей конфигурации приложения, или когда приложение изменяет конфигурацию перед передачей её в [`fileConfig()`](https://python-all.ru/3.4/library/logging.config.html#logging.config.fileConfig). (Вклад Vinay Sajip – [issue 16110](https://python-all.ru/3.4/whatsnew/3.4.html).)

Данные конфигурации логирования, полученные через сокет с помощью функции [`logging.config.listen()`](https://python-all.ru/3.4/library/logging.config.html#logging.config.listen), теперь могут быть проверены перед обработкой путём передачи проверочной функции в качестве аргумента в новый именованный аргумент *verify*. (Вклад Vinay Sajip – [issue 15452](https://python-all.ru/3.4/whatsnew/3.4.html).)

### marshal

Версия по умолчанию [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) была повышена до 3. Код, реализующий новую версию, восстанавливает поведение Python 2, при котором записывается только одна копия интернированных строк и сохраняется интернирование при десериализации, и расширяет эту возможность «одной копии» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер файлов `.pyc`, так и объём памяти, занимаемой модулем при загрузке из файла `.pyc` (или `.pyo`). (Вклад Kristján Valur Jónsson – [issue 16475](https://python-all.ru/3.4/whatsnew/3.4.html), с дополнительными ускорениями от Antoine Pitrou – [issue 19219](https://python-all.ru/3.4/whatsnew/3.4.html).)

### mmap

Объекты mmap теперь можно использовать в [`слабых ссылках`](https://python-all.ru/3.4/library/weakref.html#module-weakref). (Вклад Valerie Lambert – [issue 4885](https://python-all.ru/3.4/whatsnew/3.4.html).)

### multiprocessing

В Unix два новых [*метода запуска*](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing-start-methods), `spawn` и `forkserver`, были добавлены для запуска процессов с помощью [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing). Это делает смешивание процессов с потоками более надёжным, а метод `spawn` соответствует семантике, которую multiprocessing всегда использовала в Windows. Новая функция [`get_all_start_methods()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.get_all_start_methods) сообщает все доступные на платформе методы запуска, [`get_start_method()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.get_start_method) сообщает текущий метод запуска, а [`set_start_method()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.set_start_method) устанавливает метод запуска. (Вклад Richard Oudkerk – [issue 8713](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) также теперь имеет понятие `контекста`, который определяет, как создаются дочерние процессы. Новая функция [`get_context()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.get_context) возвращает контекст, использующий указанный метод запуска. Она имеет тот же API, что и сам модуль [`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing), поэтому её можно использовать для создания объектов [`Pool`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.pool.Pool) и других объектов, которые будут работать в этом контексте. Это позволяет фреймворку и приложению или разным частям одного приложения использовать multiprocessing без взаимных помех. (Вклад Richard Oudkerk – [issue 18999](https://python-all.ru/3.4/whatsnew/3.4.html).)

За исключением случаев использования старого метода запуска *fork*, дочерние процессы больше не наследуют ненужные дескрипторы/файловые дескрипторы от родительских (часть [issue 8713](https://python-all.ru/3.4/whatsnew/3.4.html)).

[`multiprocessing`](https://python-all.ru/3.4/library/multiprocessing.html#module-multiprocessing) теперь опирается на [`runpy`](https://python-all.ru/3.4/library/runpy.html#module-runpy) (которая реализует флаг `-m`) для корректной инициализации `__main__` в дочерних процессах при использовании методов запуска `spawn` или `forkserver`. Это решает некоторые пограничные случаи, когда сочетание multiprocessing, флага командной строки `-m` и явных относительных импортов могло вызывать трудноуловимые ошибки в дочерних процессах. (Автор: Nick Coghlan, [issue 19946](https://python-all.ru/3.4/whatsnew/3.4.html).)

### operator

Новая функция [`length_hint()`](https://python-all.ru/3.4/library/operator.html#operator.length_hint) предоставляет реализацию спецификации того, как следует использовать специальный метод [`__length_hint__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__length_hint__), в рамках формальной спецификации [**PEP 424**](https://python-all.ru/3.4/whatsnew/3.4.html) этой языковой возможности. (Автор: Armin Ronacher, [issue 16148](https://python-all.ru/3.4/whatsnew/3.4.html).)

Теперь доступна чисто-питоновская версия модуля [`operator`](https://python-all.ru/3.4/library/operator.html#module-operator) для справочных целей и использования альтернативными реализациями Python. (Автор: Zachary Ware, [issue 16694](https://python-all.ru/3.4/whatsnew/3.4.html).)

### os

Появились новые функции для получения и установки [*флага наследования*](https://python-all.ru/3.4/library/os.html#fd-inheritance) файлового дескриптора ([`os.get_inheritable()`](https://python-all.ru/3.4/library/os.html#os.get_inheritable), [`os.set_inheritable()`](https://python-all.ru/3.4/library/os.html#os.set_inheritable)) или дескриптора Windows ([`os.get_handle_inheritable()`](https://python-all.ru/3.4/library/os.html#os.get_handle_inheritable), [`os.set_handle_inheritable()`](https://python-all.ru/3.4/library/os.html#os.set_handle_inheritable)).

Новая функция [`cpu_count()`](https://python-all.ru/3.4/library/os.html#os.cpu_count) сообщает количество процессоров, доступных на платформе, где выполняется Python (или `None`, если количество не удаётся определить). Функция [`multiprocessing.cpu_count()`](https://python-all.ru/3.4/library/multiprocessing.html#multiprocessing.cpu_count) теперь реализована через эту функцию. (Авторы: Trent Nelson, Yogesh Chaudhari, Victor Stinner и Charles-François Natali, [issue 17914](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`os.path.samestat()`](https://python-all.ru/3.4/library/os.path.html#os.path.samestat) теперь доступна на платформе Windows (а реализация [`os.path.samefile()`](https://python-all.ru/3.4/library/os.path.html#os.path.samefile) теперь общая для Unix и Windows). (Автор: Brian Curtin, [issue 11939](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`os.path.ismount()`](https://python-all.ru/3.4/library/os.path.html#os.path.ismount) теперь распознаёт тома, смонтированные ниже корня диска на Windows. (Автор: Tim Golden, [issue 9035](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`os.open()`](https://python-all.ru/3.4/library/os.html#os.open) поддерживает два новых флага на платформах, которые их предоставляют: [`O_PATH`](https://python-all.ru/3.4/library/os.html#os.O_PATH) (неоткрытый файловый дескриптор) и [`O_TMPFILE`](https://python-all.ru/3.4/library/os.html#os.O_TMPFILE) (безымянный временный файл; на момент выпуска 3.4.0 доступен только в Linux с версией ядра 3.11 или новее, имеющих заголовки uapi). (Авторы: Christian Heimes, [issue 18673](https://python-all.ru/3.4/whatsnew/3.4.html), и Benjamin Peterson.)

### pdb

[`pdb`](https://python-all.ru/3.4/library/pdb.html#module-pdb) был улучшен для более полезной обработки генераторов, [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield) и `yield from`. Это особенно полезно при отладке программ, основанных на [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio). (Авторы: Andrew Svetlov и Xavier de Gaye, [issue 16596](https://python-all.ru/3.4/whatsnew/3.4.html).)

Команда `print` была удалена из [`pdb`](https://python-all.ru/3.4/library/pdb.html#module-pdb), восстановив доступ к функции Python [`print()`](https://python-all.ru/3.4/library/functions.html#print) из командной строки pdb. В Python2 `pdb` не было команды `print`; вместо этого ввод `print` выполнял оператор `print`. В Python3 `print` по ошибке стал псевдонимом команды pdb [`p`](https://python-all.ru/3.4/library/pdb.html#pdbcommand-p). Однако `p` выводит `repr` своего аргумента, а не `str`, как делала команда `print` в Python2. Хуже того, команда `pdb print` в Python3 затеняла функцию `print` Python3, делая её недоступной в приглашении `pdb`. (Автор: Connor Osborn, [issue 18764](https://python-all.ru/3.4/whatsnew/3.4.html).)

### pickle

[`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) теперь поддерживает (но не использует по умолчанию) новый протокол pickle, протокол 4. Этот новый протокол решает ряд проблем, присутствовавших в предыдущих протоколах, таких как сериализация вложенных классов, очень больших строк и контейнеров, а также классов, у которых метод [`__new__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__new__) принимает только ключевые аргументы. Он также предоставляет некоторые улучшения производительности.

> **См. также**
>
> **[**PEP 3154**](https://python-all.ru/3.4/whatsnew/3.4.html) – протокол pickle 4**
>
> PEP написан Антуаном Питрой (Antoine Pitrou), реализован Александром Валсалотти (Alexandre Vassalotti).

### plistlib

[`plistlib`](https://python-all.ru/3.4/library/plistlib.html#module-plistlib) теперь имеет API, аналогичный стандартному шаблону протоколов сериализации стандартной библиотеки, с новыми функциями [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load), [`dump()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dump), [`loads()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.loads) и [`dumps()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dumps). (Старое API теперь устарело.) В дополнение к уже поддерживаемому формату XML plist ([`FMT_XML`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_XML)), теперь также поддерживается двоичный формат plist ([`FMT_BINARY`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_BINARY)). (Авторы: Ronald Oussoren и другие, [issue 14455](https://python-all.ru/3.4/whatsnew/3.4.html).)

### poplib

В [`poplib`](https://python-all.ru/3.4/library/poplib.html#module-poplib) добавлены два новых метода: [`capa()`](https://python-all.ru/3.4/library/poplib.html#poplib.POP3.capa), который возвращает список возможностей, объявленных POP-сервером, и [`stls()`](https://python-all.ru/3.4/library/poplib.html#poplib.POP3.stls), который переключает сеанс POP3 в открытом виде на зашифрованный сеанс POP3, если POP-сервер это поддерживает. (Автор: Lorenzo Catucci, [issue 4473](https://python-all.ru/3.4/whatsnew/3.4.html).)

### pprint

Класс [`PrettyPrinter`](https://python-all.ru/3.4/library/pprint.html#pprint.PrettyPrinter) модуля [`pprint`](https://python-all.ru/3.4/library/pprint.html#module-pprint) и его функции [`pformat()`](https://python-all.ru/3.4/library/pprint.html#pprint.pformat) и [`pprint()`](https://python-all.ru/3.4/library/pprint.html#pprint.pprint) получили новую опцию *compact*, которая управляет форматированием вывода. В настоящее время установка *compact* в `True` означает, что последовательности будут печататься с максимальным количеством элементов, помещающихся в *width* на каждой (с отступом) строке. (Автор: Serhiy Storchaka, [issue 19132](https://python-all.ru/3.4/whatsnew/3.4.html).)

Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строк Python. (Автор: Antoine Pitrou, [issue 17150](https://python-all.ru/3.4/whatsnew/3.4.html).)

### pty

[`pty.spawn()`](https://python-all.ru/3.4/library/pty.html#pty.spawn) теперь возвращает значение статуса от [`os.waitpid()`](https://python-all.ru/3.4/library/os.html#os.waitpid) для дочернего процесса, а не `None`. (Автор: Gregory P. Smith.)

### pydoc

Модуль [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc) теперь напрямую основан на API интроспекции [`inspect.signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature), что позволяет ему предоставлять информацию о сигнатуре для более широкого круга вызываемых объектов. Это изменение также означает, что атрибуты `__wrapped__` теперь учитываются при отображении справочной информации. (Автор: Larry Hastings, [issue 19674](https://python-all.ru/3.4/whatsnew/3.4.html).)

Модуль [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc) больше не отображает параметр `self` для уже связанных методов. Вместо этого он стремится всегда показывать точную текущую сигнатуру переданного вызываемого объекта. (Автор: Larry Hastings, [issue 20710](https://python-all.ru/3.4/whatsnew/3.4.html).)

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

Поскольку встроенная функция [`help()`](https://python-all.ru/3.4/library/functions.html#help) основана на [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc), вышеуказанные изменения также влияют на поведение [`help()`](https://python-all.ru/3.4/library/functions.html#help).

### re

Новая функция [`fullmatch()`](https://python-all.ru/3.4/library/re.html#re.fullmatch) и метод [`regex.fullmatch()`](https://python-all.ru/3.4/library/re.html#re.regex.fullmatch) привязывают шаблон к обоим концам строки для сопоставления. Это позволяет явно указать цель сопоставления, что позволяет избежать класса тонких ошибок, при которых символы `$` теряются при изменениях кода или добавлении альтернатив в существующее регулярное выражение. (Автор: Matthew Barnett, [issue 16203](https://python-all.ru/3.4/whatsnew/3.4.html).)

Представление [*объектов regex*](https://python-all.ru/3.4/library/re.html#re-objects) теперь включает шаблон и флаги; представление [*объектов match*](https://python-all.ru/3.4/library/re.html#match-objects) теперь включает начало, конец и часть строки, которая совпала. (Авторы: Hugo Lopes Tavares и Serhiy Storchaka, [issue 13592](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 17087](https://python-all.ru/3.4/whatsnew/3.4.html).)

### resource

Новая функция [`prlimit()`](https://python-all.ru/3.4/library/resource.html#resource.prlimit), доступная на платформах Linux с версией ядра 2.6.36 или новее и glibc 2.13 или новее, предоставляет возможность запрашивать или устанавливать ограничения ресурсов для процессов, отличных от того, который вызывает функцию. (Автор: Christian Heimes в [issue 16595](https://python-all.ru/3.4/whatsnew/3.4.html).)

На Linux с версией ядра 2.6.36 или новее также появились новые константы, специфичные для Linux: [`RLIMIT_MSGQUEUE`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_MSGQUEUE), [`RLIMIT_NICE`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_NICE), [`RLIMIT_RTPRIO`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_RTPRIO), [`RLIMIT_RTTIME`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_RTTIME) и [`RLIMIT_SIGPENDING`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_SIGPENDING). (Автор: Christian Heimes в [issue 19324](https://python-all.ru/3.4/whatsnew/3.4.html).)

На FreeBSD версии 9 и новее появились новые константы, специфичные для FreeBSD: [`RLIMIT_SBSIZE`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_SBSIZE), [`RLIMIT_SWAP`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_SWAP) и [`RLIMIT_NPTS`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_NPTS). (Автор: Claudiu Popa в [issue 19343](https://python-all.ru/3.4/whatsnew/3.4.html).)

### select

Объекты [`epoll`](https://python-all.ru/3.4/library/select.html#select.epoll) теперь поддерживают протокол управления контекстом. При использовании в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) метод [`close()`](https://python-all.ru/3.4/library/select.html#select.epoll.close) будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka в [issue 16488](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты [`devpoll`](https://python-all.ru/3.4/library/select.html#select.devpoll) теперь имеют методы [`fileno()`](https://python-all.ru/3.4/library/select.html#select.devpoll.fileno) и [`close()`](https://python-all.ru/3.4/library/select.html#select.devpoll.close), а также новый атрибут [`closed`](https://python-all.ru/3.4/library/select.html#select.devpoll.closed). (Автор: Victor Stinner в [issue 18794](https://python-all.ru/3.4/whatsnew/3.4.html).)

### shelve

Экземпляры [`Shelf`](https://python-all.ru/3.4/library/shelve.html#shelve.Shelf) теперь можно использовать в операторах [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), и они будут автоматически закрыты в конце блока [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with). (Автор: Filip Gruszczyński в [issue 13896](https://python-all.ru/3.4/whatsnew/3.4.html).)

### shutil

[`copyfile()`](https://python-all.ru/3.4/library/shutil.html#shutil.copyfile) теперь вызывает конкретный подкласс [`Error`](https://python-all.ru/3.4/library/shutil.html#shutil.Error), [`SameFileError`](https://python-all.ru/3.4/library/shutil.html#shutil.SameFileError), когда исходный и целевой файлы совпадают, что позволяет приложению предпринять соответствующие действия для этой конкретной ошибки. (Авторы: Atsuo Ishimoto и Hynek Schlawack в [issue 1492704](https://python-all.ru/3.4/whatsnew/3.4.html).)

### smtpd

Классы [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer) и [`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel) теперь принимают именованный аргумент *map*, который, если указан, передаётся в [`asynchat.async_chat`](https://python-all.ru/3.4/library/asynchat.html#asynchat.async_chat) в качестве его аргумента *map*. Это позволяет приложению избежать влияния на глобальную карту сокетов. (Автор: Vinay Sajip в [issue 11959](https://python-all.ru/3.4/whatsnew/3.4.html).)

### smtplib

[`SMTPException`](https://python-all.ru/3.4/library/smtplib.html#smtplib.SMTPException) теперь является подклассом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), что позволяет перехватывать как ошибки на уровне сокетов, так и ошибки протокола SMTP в одном операторе try/except для кода, которому важно только то, произошла ли ошибка. (Автор: Ned Jackson Lovely в [issue 2118](https://python-all.ru/3.4/whatsnew/3.4.html).)

### socket

Модуль socket теперь поддерживает протокол [`CAN_BCM`](https://python-all.ru/3.4/library/socket.html#socket.CAN_BCM) на платформах, которые его поддерживают. (Автор: Brian Thorne в [issue 15359](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты сокетов имеют новые методы для получения или установки своего [*флага наследуемости*](https://python-all.ru/3.4/library/os.html#fd-inheritance): [`get_inheritable()`](https://python-all.ru/3.4/library/socket.html#socket.socket.get_inheritable) и [`set_inheritable()`](https://python-all.ru/3.4/library/socket.html#socket.socket.set_inheritable).

Константы `socket.AF_*` и `socket.SOCK_*` теперь являются значениями перечисления с использованием нового модуля [`enum`](https://python-all.ru/3.4/library/enum.html#module-enum). Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел».

Константа [`AF_LINK`](https://python-all.ru/3.4/library/socket.html#socket.AF_LINK) теперь доступна на BSD и OSX.

[`inet_pton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_pton) и [`inet_ntop()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntop) теперь поддерживаются на Windows. (Автор: Atsuo Ishimoto в [issue 7171](https://python-all.ru/3.4/whatsnew/3.4.html).)

### sqlite3

Новый булев параметр *uri* функции [`connect()`](https://python-all.ru/3.4/library/sqlite3.html#sqlite3.connect) можно использовать для указания того, что параметр *database* является `uri` (см. [документацию SQLite по URI](https://python-all.ru/3.4/whatsnew/3.4.html)). (Автор: poq в [issue 13773](https://python-all.ru/3.4/whatsnew/3.4.html).)

### ssl

Добавлены [`PROTOCOL_TLSv1_1`](https://python-all.ru/3.4/library/ssl.html#ssl.PROTOCOL_TLSv1_1) и [`PROTOCOL_TLSv1_2`](https://python-all.ru/3.4/library/ssl.html#ssl.PROTOCOL_TLSv1_2) (поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна только если Python собран с OpenSSL 1.0.1 или новее. (Авторы: Michele Orrù и Antoine Pitrou в [issue 16692](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новая функция [`create_default_context()`](https://python-all.ru/3.4/library/ssl.html#ssl.create_default_context) предоставляет стандартный способ получения [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), настройки которого призваны обеспечить разумный баланс между совместимостью и безопасностью. Эти настройки более строгие, чем значения по умолчанию, предоставляемые конструктором [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), и могут быть изменены в будущем без предварительного объявления устаревшими, если лучшие практики безопасности изменятся. Новая рекомендуемая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании [`create_default_context()`](https://python-all.ru/3.4/library/ssl.html#ssl.create_default_context) для получения объекта [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), его модификации при необходимости и последующей передачи в качестве аргумента *context* соответствующего API stdlib. (Автор: Christian Heimes в [issue 19689](https://python-all.ru/3.4/whatsnew/3.4.html).)

Метод [`load_verify_locations()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_verify_locations) класса [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) принимает новый необязательный аргумент *cadata*, который можно использовать для предоставления сертификатов в кодировке PEM или DER непосредственно в виде строк или байтов соответственно. (Автор: Christian Heimes в [issue 18138](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новая функция [`get_default_verify_paths()`](https://python-all.ru/3.4/library/ssl.html#ssl.get_default_verify_paths) возвращает именованный кортеж путей и переменных окружения, которые метод [`set_default_verify_paths()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.set_default_verify_paths) использует для установки значений по умолчанию `cafile` и `capath` в OpenSSL. Это может помочь в отладке проблем с проверкой по умолчанию. (Автор: Christian Heimes в [issue 18143](https://python-all.ru/3.4/whatsnew/3.4.html).)

У [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) появился новый метод, [`cert_store_stats()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.cert_store_stats), который сообщает количество загруженных сертификатов `X.509`, сертификатов `X.509 CA` и списков отзыва сертификатов (`CRL`), а также метод [`get_ca_certs()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.get_ca_certs), который возвращает список загруженных сертификатов `CA`. (Автор: Christian Heimes в [issue 18147](https://python-all.ru/3.4/whatsnew/3.4.html).)

Если доступен OpenSSL 0.9.8 или новее, у [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) появился новый атрибут [`verify_flags`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.verify_flags): его можно установить в некоторую комбинацию новых констант [`VERIFY_DEFAULT`](https://python-all.ru/3.4/library/ssl.html#ssl.VERIFY_DEFAULT), [`VERIFY_CRL_CHECK_LEAF`](https://python-all.ru/3.4/library/ssl.html#ssl.VERIFY_CRL_CHECK_LEAF), [`VERIFY_CRL_CHECK_CHAIN`](https://python-all.ru/3.4/library/ssl.html#ssl.VERIFY_CRL_CHECK_CHAIN) или [`VERIFY_X509_STRICT`](https://python-all.ru/3.4/library/ssl.html#ssl.VERIFY_X509_STRICT) и тем самым управлять проверкой сертификата. По умолчанию OpenSSL не выполняет проверку CRL. (Автор: Christian Heimes в [тикете 8813](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый метод [`load_default_certs()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_default_certs) класса [`SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext) загружает набор сертификатов по умолчанию «центров сертификации» (CA) из стандартных расположений, которые различаются в зависимости от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (`purpose=`[`SERVER_AUTH`](https://python-all.ru/3.4/library/ssl.html#ssl.Purpose.SERVER_AUTH)) для использования клиентом для проверки сервера, так и сертификатов для использования сервером при проверке клиентских сертификатов (`purpose=`[`CLIENT_AUTH`](https://python-all.ru/3.4/library/ssl.html#ssl.Purpose.CLIENT_AUTH)). (Автор: Christian Heimes в [issue 19292](https://python-all.ru/3.4/whatsnew/3.4.html).)

Две новые функции только для Windows, [`enum_certificates()`](https://python-all.ru/3.4/library/ssl.html#ssl.enum_certificates) и [`enum_crls()`](https://python-all.ru/3.4/library/ssl.html#ssl.enum_crls), предоставляют возможность получать сертификаты, информацию о сертификатах и CRL из хранилища сертификатов Windows. (Автор: Christian Heimes в [issue 17134](https://python-all.ru/3.4/whatsnew/3.4.html).)

Поддержка SNI на стороне сервера (Server Name Indication) с использованием нового метода [`ssl.SSLContext.set_servername_callback()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.set_servername_callback). (Автор: Daniel Black в [issue 8109](https://python-all.ru/3.4/whatsnew/3.4.html).)

Словарь, возвращаемый [`SSLSocket.getpeercert()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.getpeercert), содержит дополнительные элементы расширений `X509v3`: `crlDistributionPoints`, `calIssuers` и `OCSP` URI. (Автор: Christian Heimes в [issue 18379](https://python-all.ru/3.4/whatsnew/3.4.html).)

### stat

Модуль [`stat`](https://python-all.ru/3.4/library/stat.html#module-stat) теперь реализован на языке C в `_stat`. Реализация на C требуется, поскольку большинство значений не стандартизированы и зависят от платформы. (Автор: Christian Heimes в [issue 11016](https://python-all.ru/3.4/whatsnew/3.4.html).)

Модуль поддерживает новые флаги [`ST_MODE`](https://python-all.ru/3.4/library/stat.html#stat.ST_MODE), [`S_IFDOOR`](https://python-all.ru/3.4/library/stat.html#stat.S_IFDOOR), [`S_IFPORT`](https://python-all.ru/3.4/library/stat.html#stat.S_IFPORT) и [`S_IFWHT`](https://python-all.ru/3.4/library/stat.html#stat.S_IFWHT). (Автор: Christian Hiemes в [issue 11016](https://python-all.ru/3.4/whatsnew/3.4.html).)

### struct

Новая функция [`iter_unpack`](https://python-all.ru/3.4/library/struct.html#struct.iter_unpack) и новый метод [`struct.Struct.iter_unpack()`](https://python-all.ru/3.4/library/struct.html#struct.Struct.iter_unpack) для скомпилированных форматов обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного формата данных. (Автор: Antoine Pitrou в [issue 17804](https://python-all.ru/3.4/whatsnew/3.4.html).)

### подпроцесс

[`check_output()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.check_output) теперь принимает аргумент *input*, который можно использовать для передачи содержимого `stdin` для выполняемой команды. (Автор: Zack Weinberg в [issue 16624](https://python-all.ru/3.4/whatsnew/3.4.html).)

`getstatus()` и [`getstatusoutput()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.getstatusoutput) теперь работают в Windows. Это изменение было случайно внесено в версии 3.3.4. (Автор: Tim Golden в [issue 10197](https://python-all.ru/3.4/whatsnew/3.4.html).)

### sunau

Метод `getparams()` теперь возвращает именованный кортеж (namedtuple) вместо обычного кортежа. (Автор: Claudiu Popa в [issue 18901](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`sunau.open()`](https://python-all.ru/3.4/library/sunau.html#sunau.open) теперь поддерживает протокол менеджера контекста: при использовании в блоке [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) метод `close` возвращаемого объекта будет вызываться автоматически в конце блока. (Автор: Serhiy Storchaka в [issue 18878](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`AU_write.setsampwidth()`](https://python-all.ru/3.4/library/sunau.html#sunau.AU_write.setsampwidth) теперь поддерживает 24-битные семплы, что добавляет поддержку записи 24-битных семплов с помощью этого модуля. (Автор: Serhiy Storchaka в [issue 19261](https://python-all.ru/3.4/whatsnew/3.4.html).)

Методы [`writeframesraw()`](https://python-all.ru/3.4/library/sunau.html#sunau.AU_write.writeframesraw) и [`writeframes()`](https://python-all.ru/3.4/library/sunau.html#sunau.AU_write.writeframes) теперь принимают любой [*байтоподобный объект*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object). (Автор: Serhiy Storchaka в [issue 8311](https://python-all.ru/3.4/whatsnew/3.4.html).)

### sys

Новая функция [`sys.getallocatedblocks()`](https://python-all.ru/3.4/library/sys.html#sys.getallocatedblocks) возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию `--with-pymalloc` это выделения, сделанные через API `PyObject_Malloc()`.) Это может быть полезно для отслеживания утечек памяти, особенно при автоматизации с помощью набора тестов. (Автор: Antoine Pitrou в [issue 13390](https://python-all.ru/3.4/whatsnew/3.4.html).)

Когда интерпретатор Python запускается в [*интерактивном режиме*](https://python-all.ru/3.4/tutorial/interpreter.html#tut-interactive), он проверяет наличие атрибута [`__interactivehook__`](https://python-all.ru/3.4/library/sys.html#sys.__interactivehook__) в модуле [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys). Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка выполняется после чтения файла [`PYTHONSTARTUP`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONSTARTUP), поэтому он может быть установлен там. Модуль [`site`](https://python-all.ru/3.4/library/site.html#module-site) [*устанавливает его*](https://python-all.ru/3.4/library/site.html#rlcompleter-config) в функцию, которая включает автодополнение по табуляции и сохранение истории (в `~/.python-history`), если платформа поддерживает [`readline`](https://python-all.ru/3.4/library/readline.html#module-readline). Если вы не хотите такого (нового) поведения, вы можете переопределить его в [`PYTHONSTARTUP`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONSTARTUP), `sitecustomize` или `usercustomize`, удалив этот атрибут из [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys) (или установив его в другой вызываемый объект). (Авторы: Éric Araujo и Antoine Pitrou в [issue 5845](https://python-all.ru/3.4/whatsnew/3.4.html).)

### tarfile

Модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) теперь поддерживает простой [*интерфейс командной строки*](https://python-all.ru/3.4/library/tarfile.html#tarfile-commandline) при вызове напрямую как скрипт или через `-m`. Его можно использовать для создания и извлечения tar-архивов. (Автор: Berker Peksag в [issue 13477](https://python-all.ru/3.4/whatsnew/3.4.html).)

### textwrap

Класс [`TextWrapper`](https://python-all.ru/3.4/library/textwrap.html#textwrap.TextWrapper) имеет два новых атрибута/аргумента конструктора: [`max_lines`](https://python-all.ru/3.4/library/textwrap.html#textwrap.TextWrapper.max_lines), ограничивающий количество строк в выводе, и [`placeholder`](https://python-all.ru/3.4/library/textwrap.html#textwrap.TextWrapper.placeholder) – строка, которая будет отображаться в конце вывода, если он был обрезан из-за *max\_lines*. Основываясь на этих возможностях, новая удобная функция [`shorten()`](https://python-all.ru/3.4/library/textwrap.html#textwrap.shorten) заменяет все пробельные символы во входных данных на одиночные пробелы и создает одну строку заданной *width*, которая заканчивается на *placeholder* (по умолчанию `[...]`). (Авторы: Antoine Pitrou и Serhiy Storchaka в [issue 18585](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 18725](https://python-all.ru/3.4/whatsnew/3.4.html).)

### threading

Объект [`Thread`](https://python-all.ru/3.4/library/threading.html#threading.Thread), представляющий главный поток, можно получить с помощью новой функции [`main_thread()`](https://python-all.ru/3.4/library/threading.html#threading.main_thread). В обычных условиях это будет поток, из которого был запущен интерпретатор Python. (Автор: Andrew Svetlov в [issue 18882](https://python-all.ru/3.4/whatsnew/3.4.html).)

### traceback

Новая функция [`traceback.clear_frames()`](https://python-all.ru/3.4/library/traceback.html#traceback.clear_frames) принимает объект traceback и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая объем потребляемой памяти. (Автор: Andrew Kuchling в [issue 1565525](https://python-all.ru/3.4/whatsnew/3.4.html).)

### types

Новый дескриптор [`DynamicClassAttribute()`](https://python-all.ru/3.4/library/types.html#types.DynamicClassAttribute) предоставляет способ определить атрибут, который ведет себя нормально при обращении через экземпляр объекта, но перенаправляется в *class* `__getattr__` при обращении через класс. Это позволяет иметь активные свойства на классе и виртуальные атрибуты с тем же именем (см. пример в `Enum`). (Автор: Ethan Furman в [issue 19030](https://python-all.ru/3.4/whatsnew/3.4.html).)

### urllib

[`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request) теперь поддерживает URL-адреса `data:` через класс [`DataHandler`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.DataHandler). (Автор: Mathias Panzenböck в [issue 16423](https://python-all.ru/3.4/whatsnew/3.4.html).)

HTTP-метод, который будет использоваться классом [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request), теперь можно указать, установив атрибут класса [`method`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request.method) в подклассе. (Автор: Jason R Coombs в [issue 18978](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request) теперь стали многократно используемыми: если изменяются атрибуты [`full_url`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request.full_url) или [`data`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request.data), все соответствующие внутренние свойства обновляются. Это означает, например, что теперь можно использовать один и тот же объект [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request) в нескольких вызовах [`OpenerDirector.open()`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.OpenerDirector.open) с разными аргументами *data*, или изменить `url` объекта [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request), а не пересчитывать его с нуля. Также появился новый метод [`remove_header()`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request.remove_header), который можно использовать для удаления заголовков из [`Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request). (Авторы: Alexey Kachayev в [issue 16464](https://python-all.ru/3.4/whatsnew/3.4.html), Daniel Wozniak в [issue 17485](https://python-all.ru/3.4/whatsnew/3.4.html), Damien Brecht и Senthil Kumaran в [issue 17272](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты [`HTTPError`](https://python-all.ru/3.4/library/urllib.error.html#urllib.error.HTTPError) теперь имеют атрибут [`headers`](https://python-all.ru/3.4/library/urllib.error.html#urllib.error.HTTPError.headers), который предоставляет доступ к заголовкам HTTP-ответа, связанным с ошибкой. (Автор: Berker Peksag в [issue 15701](https://python-all.ru/3.4/whatsnew/3.4.html).)

### unittest

Класс [`TestCase`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase) имеет новый метод, [`subTest()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.subTest), который создает менеджер контекста, чей блок [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) становится «подтестом». Этот менеджер контекста позволяет тестовому методу динамически генерировать подтесты, например, вызывая менеджер контекста `subTest` внутри цикла. Таким образом, один тестовый метод может создать неограниченное количество отдельно идентифицируемых и отдельно подсчитываемых тестов, каждый из которых будет выполнен, даже если один или несколько из них завершатся неудачей. Например:

```python
class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
```

даст шесть подтестов, каждый из которых будет идентифицирован в подробном выводе unittest меткой, состоящей из имени переменной `i` и конкретного значения для этой переменной (`i=0`, `i=1` и т.д.). См. [*Различение итераций тестов с помощью подтестов*](https://python-all.ru/3.4/library/unittest.html#subtests) для полной версии этого примера. (Автор: Antoine Pitrou в [issue 16997](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`unittest.main()`](https://python-all.ru/3.4/library/unittest.html#unittest.main) теперь принимает итерируемый объект с именами тестов для *defaultTest*, тогда как раньше принимал только одно имя теста в виде строки. (Автор – Jyrki Pulliainen, [issue 15132](https://python-all.ru/3.4/whatsnew/3.4.html).)

Если [`SkipTest`](https://python-all.ru/3.4/library/unittest.html#unittest.SkipTest) возбуждается во время поиска тестов (то есть на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как ошибка. (Автор – Zach Ware, [issue 16935](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`discover()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestLoader.discover) теперь сортирует найденные файлы для обеспечения единообразного порядка тестов. (Авторы – Martin Melin и Jeff Ramnani, [issue 16709](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`TestSuite`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite) теперь удаляет ссылки на тесты сразу после успешного выполнения теста. В интерпретаторах Python со сборкой мусора это позволяет тестам быть собранными, если никакие другие объекты не содержат на них ссылок. Это поведение можно изменить, создав подкласс [`TestSuite`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite), в котором определён пользовательский метод `_removeTestAtIndex`. (Авторы – Tom Wardill, Matt McClure и Andrew Svetlov, [issue 11798](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый менеджер контекста для проверки утверждений, [`assertLogs()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase.assertLogs), гарантирует, что заданный блок кода выдаёт сообщение журнала, используя модуль [`logging`](https://python-all.ru/3.4/library/logging.html#module-logging). По умолчанию сообщение может быть от любого регистратора и иметь приоритет `INFO` или выше, но можно указать и имя регистратора, и альтернативный минимальный уровень ведения журнала. Объект, возвращаемый менеджером контекста, позволяет запрашивать объекты [`LogRecord`](https://python-all.ru/3.4/library/logging.html#logging.LogRecord) и/или отформатированные сообщения, которые были зарегистрированы. (Автор – Antoine Pitrou, [issue 18937](https://python-all.ru/3.4/whatsnew/3.4.html).)

Поиск тестов теперь работает с пакетами пространств имён. (Автор – Claudiu Popa, [issue 17457](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты [`unittest.mock`](https://python-all.ru/3.4/library/unittest.mock.html#module-unittest.mock) теперь проверяют сигнатуры своих спецификаций при сопоставлении вызовов, то есть аргумент может быть сопоставлен либо по позиции, либо по имени, а не только по позиции. (Автор – Antoine Pitrou, [issue 17015](https://python-all.ru/3.4/whatsnew/3.4.html).)

Объекты `mock_open()` теперь имеют методы `readline` и `readlines`. (Автор – Toshio Kuratomi, [issue 17467](https://python-all.ru/3.4/whatsnew/3.4.html).)

### venv

[`venv`](https://python-all.ru/3.4/library/venv.html#module-venv) теперь включает скрипты активации для оболочек `csh` и `fish`. (Автор – Andrew Svetlov, [issue 15417](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`EnvBuilder`](https://python-all.ru/3.4/library/venv.html#venv.EnvBuilder) и вспомогательная функция [`create()`](https://python-all.ru/3.4/library/venv.html#venv.create) принимают новый именованный аргумент *with\_pip*, который по умолчанию равен `False` и управляет тем, устанавливает ли [`EnvBuilder`](https://python-all.ru/3.4/library/venv.html#venv.EnvBuilder) `pip` в виртуальной среде. (Автор – Nick Coghlan, [issue 19552](https://python-all.ru/3.4/whatsnew/3.4.html), в рамках реализации [**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html).)

### wave

Метод `getparams()` теперь возвращает namedtuple вместо обычного кортежа. (Автор – Claudiu Popa, [issue 17487](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`wave.open()`](https://python-all.ru/3.4/library/wave.html#wave.open) теперь поддерживает протокол контекстного менеджера. (Автор – Claudiu Popa, [issue 17616](https://python-all.ru/3.4/whatsnew/3.4.html).)

[`wave`](https://python-all.ru/3.4/library/wave.html#module-wave) теперь может [*записывать вывод в файлы без возможности позиционирования*](https://python-all.ru/3.4/library/wave.html#wave-write-objects). (Авторы – David Jones, Guilherme Polo и Serhiy Storchaka, [issue 5202](https://python-all.ru/3.4/whatsnew/3.4.html).)

Методы [`writeframesraw()`](https://python-all.ru/3.4/library/wave.html#wave.Wave_write.writeframesraw) и [`writeframes()`](https://python-all.ru/3.4/library/wave.html#wave.Wave_write.writeframes) теперь принимают любой [*байтоподобный объект*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object). (Автор – Serhiy Storchaka, [issue 8311](https://python-all.ru/3.4/whatsnew/3.4.html).)

### weakref

Новый класс [`WeakMethod`](https://python-all.ru/3.4/library/weakref.html#weakref.WeakMethod) имитирует слабые ссылки на привязанные методы. (Автор – Antoine Pitrou, [issue 14631](https://python-all.ru/3.4/whatsnew/3.4.html).)

Новый класс [`finalize`](https://python-all.ru/3.4/library/weakref.html#weakref.finalize) позволяет зарегистрировать колбэк, который будет вызван при сборке мусора объекта, без необходимости тщательно управлять жизненным циклом самой слабой ссылки. (Автор – Richard Oudkerk, [issue 15528](https://python-all.ru/3.4/whatsnew/3.4.html).)

Колбэк (если есть), связанный с объектом [`ref`](https://python-all.ru/3.4/library/weakref.html#weakref.ref), теперь доступен через атрибут [`__callback__`](https://python-all.ru/3.4/library/weakref.html#weakref.ref.__callback__). (Автор – Mark Dickinson, [issue 17643](https://python-all.ru/3.4/whatsnew/3.4.html).)

### xml.etree

Новый синтаксический анализатор [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) позволяет неблокирующим приложениям разбирать XML-документы. Пример можно посмотреть в разделе [*Pull API для неблокирующего разбора*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-pull-parsing). (Автор – Antoine Pitrou, [issue 17741](https://python-all.ru/3.4/whatsnew/3.4.html).)

Функции [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) [`tostring()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostring) и [`tostringlist()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostringlist), а также метод [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) [`write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write) теперь имеют *short\_empty\_elements* [*параметр, задаваемый только по ключевому слову*](https://python-all.ru/3.4/glossary.html#keyword-only-parameter), который управляет тем, записываются ли пустые элементы в сокращённой (`<tag />`) или развёрнутой (`<tag></tag>`) форме. (Авторы – Ariel Poliak и Serhiy Storchaka, [issue 14377](https://python-all.ru/3.4/whatsnew/3.4.html).)

### zipfile

Метод [`writepy()`](https://python-all.ru/3.4/library/zipfile.html#zipfile.PyZipFile.writepy) класса [`PyZipFile`](https://python-all.ru/3.4/library/zipfile.html#zipfile.PyZipFile) получил новую опцию *filterfunc*, которую можно использовать для управления тем, какие каталоги и файлы добавляются в архив. Например, это может быть использовано для исключения тестовых файлов из архива. (Автор – Christian Tismer, [issue 19274](https://python-all.ru/3.4/whatsnew/3.4.html).)

Параметр *allowZip64* для [`ZipFile`](https://python-all.ru/3.4/library/zipfile.html#zipfile.ZipFile) и `PyZipfile` теперь по умолчанию равен `True`. (Автор – William Mallard, [issue 17201](https://python-all.ru/3.4/whatsnew/3.4.html).)

## Изменения в реализации CPython

### PEP 445: Настройка распределителей памяти CPython

[**PEP 445**](https://python-all.ru/3.4/whatsnew/3.4.html) добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.

> **См. также**
>
> **[**PEP 445**](https://python-all.ru/3.4/whatsnew/3.4.html) – Добавление новых API для настройки распределителей памяти Python**
>
> PEP написан и реализован Victor Stinner.

### PEP 442: Безопасная финализация объектов

[**PEP 442**](https://python-all.ru/3.4/whatsnew/3.4.html) устраняет текущие ограничения и особенности финализации объектов в CPython. Теперь объекты с методами [`__del__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__del__), а также генераторы с блоками [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) могут быть финализированы, даже если они являются частью циклической ссылки.

В рамках этого изменения глобальные переменные модулей больше не принудительно устанавливаются в [`None`](https://python-all.ru/3.4/library/constants.html#None) при завершении интерпретатора в большинстве случаев, вместо этого используется обычная работа циклического сборщика мусора. Это устраняет целый класс ошибок времени завершения интерпретатора, обычно связанных с методами `__del__`, которые преследовали Python с момента появления циклического сборщика мусора.

> **См. также**
>
> **[**PEP 442**](https://python-all.ru/3.4/whatsnew/3.4.html) – Безопасная финализация объектов**
>
> PEP написан и реализован Antoine Pitrou.

### PEP 456: Безопасный и взаимозаменяемый хэш-алгоритм

[**PEP 456**](https://python-all.ru/3.4/whatsnew/3.4.html) продолжает предыдущую работу по исправлению безопасности хеш-алгоритма Python для устранения определённых DOS-атак, которым могут быть подвержены публичные API, использующие словари. (См. [issue 14621](https://python-all.ru/3.4/whatsnew/3.4.html) для начала текущего раунда улучшений.) PEP унифицирует код хеширования CPython, чтобы упростить замену хеш-алгоритма упаковщикам, и меняет реализацию по умолчанию на SipHash на платформах, поддерживающих 64-битный тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV несущественны.

PEP добавляет дополнительные поля в struct sequence [`sys.hash_info`](https://python-all.ru/3.4/library/sys.html#sys.hash_info) для описания хеш-алгоритма, используемого текущим исполняемым файлом. В остальном PEP не изменяет существующие API CPython.

### PEP 436: Argument Clinic

«Argument Clinic» ([**PEP 436**](https://python-all.ru/3.4/whatsnew/3.4.html)) теперь является частью процесса сборки CPython и может использоваться для упрощения определения и поддержания точных сигнатур для встроенных функций и модулей расширения стандартной библиотеки, реализованных на C.

Некоторые модули расширения стандартной библиотеки были переведены на использование Argument Clinic в Python 3.4, и [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc) и [`inspect`](https://python-all.ru/3.4/library/inspect.html#module-inspect) были соответствующим образом обновлены.

Ожидается, что метаданные сигнатур для программного самоанализа будут добавлены к дополнительным вызываемым объектам, реализованным на C, в рамках поддерживающих выпусков Python 3.4.

> **Примечание**
>
> PEP Argument Clinic не полностью соответствует текущему состоянию реализации. В данном случае это было признано приемлемым менеджером выпуска и основной командой разработчиков, поскольку Argument Clinic не будет предоставлен как публичный API для стороннего использования в Python 3.4.

> **См. также**
>
> **[**PEP 436**](https://python-all.ru/3.4/whatsnew/3.4.html) – DSL Argument Clinic**
>
> PEP написан и реализован Larry Hastings.

### Прочие изменения сборки и C API

- Новая функция [`PyType_GetSlot()`](https://python-all.ru/3.4/c-api/type.html#c.PyType_GetSlot) добавлена в стабильный ABI, позволяя извлекать указатели на функции из именованных слотов типа при использовании ограниченного API. (Добавлено Мартином фон Лёвисом в [issue 17162](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новое API предварительной инициализации [`Py_SetStandardStreamEncoding()`](https://python-all.ru/3.4/c-api/init.html#c.Py_SetStandardStreamEncoding) позволяет приложениям, встраивающим интерпретатор CPython, надёжно задавать определённую кодировку и обработчик ошибок для стандартных потоков. (Добавлено Bastien Montagne и Nick Coghlan в [issue 16129](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Большинство C API Python, которые не изменяют строковые аргументы, теперь корректно помечены как принимающие `const char *` вместо `char *`. (Добавлено Serhiy Storchaka в [issue 1772673](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новая шелл-версия `python-config` может использоваться даже при отсутствии интерпретатора python (например, в сценариях кросс-компиляции).
- [`PyUnicode_FromFormat()`](https://python-all.ru/3.4/c-api/unicode.html#c.PyUnicode_FromFormat) теперь поддерживает спецификаторы ширины и точности для `%s`, `%A`, `%U`, `%V`, `%S` и `%R`. (Добавлено Ysj Ray и Victor Stinner в [issue 7330](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новая функция [`PyStructSequence_InitType2()`](https://python-all.ru/3.4/c-api/tuple.html#c.PyStructSequence_InitType2) дополняет существующую функцию [`PyStructSequence_InitType()`](https://python-all.ru/3.4/c-api/tuple.html#c.PyStructSequence_InitType). Отличие в том, что она возвращает `0` при успехе и `-1` при неудаче.
- Исходный код CPython теперь можно компилировать с использованием функций проверки корректности адресов (address sanity checking) последних версий GCC и clang: ложные срабатывания в аллокаторе мелких объектов были подавлены. (Добавлено Dhiru Kholia в [issue 18596](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Сборка для Windows теперь использует [Address Space Layout Randomization](https://python-all.ru/3.4/whatsnew/3.4.html) и [Data Execution Prevention](https://python-all.ru/3.4/whatsnew/3.4.html). (Добавлено Christian Heimes в [issue 16632](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новая функция [`PyObject_LengthHint()`](https://python-all.ru/3.4/c-api/object.html#c.PyObject_LengthHint) является эквивалентом [`operator.length_hint()`](https://python-all.ru/3.4/library/operator.html#operator.length_hint) в C API. (Добавлено Armin Ronacher в [issue 16148](https://python-all.ru/3.4/whatsnew/3.4.html).)

### Другие улучшения

- Команда [*python*](https://python-all.ru/3.4/using/cmdline.html#using-on-cmdline) имеет новую [*опцию*](https://python-all.ru/3.4/using/cmdline.html#using-on-misc-options), `-I`, которая запускает интерпретатор в «изолированном режиме»: это означает, что [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) не содержит ни каталог скрипта, ни пользовательский каталог `site-packages`, а все переменные окружения `PYTHON*` игнорируются (подразумевается как `-s`, так и `-E`). В будущем могут быть добавлены и другие ограничения, направленные на изоляцию выполнения скрипта от окружения пользователя. Это уместно, например, когда Python используется для запуска системного скрипта. В большинстве POSIX-систем это можно и нужно использовать в `#!`-строке системных скриптов. (Добавлено Christian Heimes в [issue 16499](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Автодополнение по табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих [`readline`](https://python-all.ru/3.4/library/readline.html#module-readline). История также включена по умолчанию и записывается (и читается) в файл `~/.python-history`. (Добавлено Antoine Pitrou и Éric Araujo в [issue 5845](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Вызов интерпретатора Python с `--version` теперь выводит версию в стандартный вывод вместо стандартного потока ошибок ([issue 18338](https://python-all.ru/3.4/whatsnew/3.4.html)). Аналогичные изменения были внесены в [`argparse`](https://python-all.ru/3.4/library/argparse.html#module-argparse) ([issue 18920](https://python-all.ru/3.4/whatsnew/3.4.html)) и другие модули, поддерживающие вызов в стиле скриптов ([issue 18922](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Установщик CPython для Windows теперь добавляет `.py` в переменную `PATHEXT` при регистрации расширений, позволяя пользователям запускать скрипт python в командной строке Windows, просто вводя его имя без расширения `.py`. (Добавлено Paul Moore в [issue 18569](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Новая цель `make` [coverage-report](https://python-all.ru/3.4/devguide/coverage.html#measuring-coverage-of-c-code-with-gcov-and-lcov) собирает python, запускает набор тестов и генерирует HTML-отчёт о покрытии для кодовой базы на C с помощью `gcov` и [lcov](https://python-all.ru/3.4/whatsnew/3.4.html).
- Опция `-R` набора регрессионных тестов [*python*](https://python-all.ru/3.4/library/test.html#regrtest) теперь также проверяет утечки выделения памяти, используя [`sys.getallocatedblocks()`](https://python-all.ru/3.4/library/sys.html#sys.getallocatedblocks). (Добавлено Antoine Pitrou в [issue 13390](https://python-all.ru/3.4/whatsnew/3.4.html).)
- `python -m` теперь работает с пакетами пространств имён (namespace packages).
- Модуль [`stat`](https://python-all.ru/3.4/library/stat.html#module-stat) теперь реализован на C, что означает, что он получает значения своих констант из заголовочных файлов C, а не из жёстко заданных значений в модуле python, как было ранее.
- Загрузка нескольких модулей python из одного OS-модуля (`.so`, `.dll`) теперь работает корректно (ранее она молча возвращала первый модуль python в файле). (Добавлено Václav Šmilauer в [issue 16421](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Добавлена новая опкода [`LOAD_CLASSDEREF`](https://python-all.ru/3.4/library/dis.html#opcode-LOAD_CLASSDEREF) для исправления ошибки при загрузке свободных переменных в телах классов, которая могла быть вызвана определёнными использованиями [*\_\_prepare\_\_*](https://python-all.ru/3.4/reference/datamodel.html#prepare). (Добавлено Benjamin Peterson в [issue 17853](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Ряд сбоев, связанных с MemoryError, был выявлен и исправлен Виктором Стиннером с помощью его инструмента `pyfailmalloc`, основанного на [**PEP 445**](https://python-all.ru/3.4/whatsnew/3.4.html) ([issue 18408](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 18520](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Команда [*pyvenv*](https://python-all.ru/3.4/using/scripts.html#scripts-pyvenv) теперь принимает опцию `--copies`, чтобы использовать копии вместо симлинков, даже в системах, где симлинки используются по умолчанию. (Добавлено Vinay Sajip в [issue 18807](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Команда [*pyvenv*](https://python-all.ru/3.4/using/scripts.html#scripts-pyvenv) также принимает опцию `--without-pip` для подавления автоматической загрузки pip в виртуальное окружение. (Добавлено Nick Coghlan в [issue 19552](https://python-all.ru/3.4/whatsnew/3.4.html) в рамках реализации [**PEP 453**](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Имя кодировки теперь является необязательным в значении переменной окружения [`PYTHONIOENCODING`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONIOENCODING). Это позволяет задать только обработчик ошибок, не меняя кодировку по умолчанию. (Добавлено Serhiy Storchaka в [issue 18818](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Функции `open` модулей [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2), [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma) и [`gzip`](https://python-all.ru/3.4/library/gzip.html#module-gzip) теперь поддерживают режим `x` (исключительное создание). (Добавлено Tim Heaney и Vajrasky Kok в [issue 19201](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 19222](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 19223](https://python-all.ru/3.4/whatsnew/3.4.html).)

### Значительные оптимизации

- Декодер UTF-32 теперь работает в 3–4 раза быстрее. (Добавлено Serhiy Storchaka в [issue 14625](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Стоимость коллизий хешей для множеств теперь снижена. Каждый проб в хеш-таблице теперь проверяет серию последовательных смежных пар ключ/хеш перед продолжением случайных проб по таблице. Это использует локальность кэша, чтобы сделать разрешение коллизий менее дорогим. Схема разрешения коллизий может быть описана как гибрид линейного пробирования и открытой адресации. Число дополнительных линейных проб по умолчанию равно девяти. Это можно изменить на этапе компиляции, определив LINEAR\_PROBES в любое значение. Установите LINEAR\_PROBES=0, чтобы полностью отключить линейное пробирование. (Добавлено Raymond Hettinger в [issue 18771](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Интерпретатор запускается примерно на 30% быстрее. Ускорение достигнуто за счёт нескольких мер. При запуске загружается меньше модулей: например, модули [`re`](https://python-all.ru/3.4/library/re.html#module-re), [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) и [`locale`](https://python-all.ru/3.4/library/locale.html#module-locale) и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Добавлено Antoine Pitrou, Christian Heimes и Victor Stinner в [issue 19219](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 19218](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 19209](https://python-all.ru/3.4/whatsnew/3.4.html), [issue 19205](https://python-all.ru/3.4/whatsnew/3.4.html) и [issue 9548](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`bz2.BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) is now as fast or faster than the Python2 version for most cases. [`lzma.LZMAFile`](https://python-all.ru/3.4/library/lzma.html#lzma.LZMAFile) has also been optimized. (Contributed by Serhiy Storchaka and Nadeem Vawda in [issue 16034](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`random.getrandbits()`](https://python-all.ru/3.4/library/random.html#random.getrandbits) работает на 20–40% быстрее для небольших целых чисел (наиболее частый случай использования). (Добавлено Serhiy Storchaka в [issue 16674](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Благодаря новому формату хранения строк, сериализация (pickling) строк теперь выполняется значительно быстрее. (Добавлено Victor Stinner и Antoine Pitrou в [issue 15596](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Проблема производительности в `io.FileIO.readall()` решена. Это особенно затрагивает Windows и значительно ускоряет передачу значительных объёмов данных через [`подпроцесс`](https://python-all.ru/3.4/library/subprocess.html#module-subprocess). (Вклад Richard Oudkerk в [issue 15758](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`html.escape()`](https://python-all.ru/3.4/library/html.html#html.escape) теперь работает в 10 раз быстрее. (Добавлено Matt Bryant в [issue 18020](https://python-all.ru/3.4/whatsnew/3.4.html).)
- На Windows теперь используется нативная функция `VirtualAlloc` вместо CRT `malloc` в `obmalloc`. Искусственные тесты показывают экономию памяти около 3%.
- [`os.urandom()`](https://python-all.ru/3.4/library/os.html#os.urandom) теперь использует лениво открываемый постоянный файловый дескриптор, чтобы не расходовать много файловых дескрипторов при параллельном запуске из нескольких потоков. (Автор: Antoine Pitrou в [issue 18756](https://python-all.ru/3.4/whatsnew/3.4.html).)

## Устарело

В этом разделе рассматриваются различные API и другие возможности, которые были помечены как устаревшие в Python 3.4 и будут удалены в Python 3.5 или позже. В большинстве (но не во всех) случаях использование устаревших API приводит к появлению [`DeprecationWarning`](https://python-all.ru/3.4/library/exceptions.html#DeprecationWarning), когда интерпретатор запущен с включёнными предупреждениями об устаревании (например, с помощью `-Wd`).

### Устаревшее в Python API

- Как уже упоминалось в [*PEP 451: A ModuleSpec Type for the Import System*](https://python-all.ru/3.4/whatsnew/3.4.html#whatsnew-pep-451), ряд методов и функций [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) помечен как устаревший: [`importlib.find_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.find_loader) заменяется на [`importlib.util.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.find_spec); [`importlib.machinery.PathFinder.find_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_module) заменяется на [`importlib.machinery.PathFinder.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_spec); [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_module) заменяется на [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec); [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) и [`find_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_module) заменяются на [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec); все методы `xxxLoader` ABC `load_module` ([`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), [`importlib.abc.InspectLoader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.load_module), [`importlib.abc.FileLoader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader.load_module), [`importlib.abc.SourceLoader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.load_module)) больше не должны реализовываться; вместо этого загрузчики должны реализовывать метод `exec_module` ([`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module), [`importlib.abc.InspectLoader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.exec_module) [`importlib.abc.SourceLoader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.exec_module)) и позволить системе импорта делать всё остальное; а [`importlib.abc.Loader.module_repr()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.module_repr), [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader), [`importlib.util.set_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.set_loader) и [`importlib.util.set_package()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.set_package) больше не нужны, так как их функции теперь автоматически выполняются системой импорта.
- Модуль [`imp`](https://python-all.ru/3.4/library/imp.html#module-imp) ожидает устаревания. Чтобы сохранить совместимость с кодовыми базами Python 2/3, удаление модуля пока не запланировано.
- Модуль [`formatter`](https://python-all.ru/3.4/library/formatter.html#module-formatter) ожидает устаревания и запланирован к удалению в Python 3.6.
- Использование `MD5` в качестве *digestmod* по умолчанию для функции [`hmac.new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new) устарело. Начиная с Python 3.6 потребуется явно указывать имя или конструктор дайджеста в качестве аргумента *digestmod*.
- Внутренний класс `Netrc` в модуле [`ftplib`](https://python-all.ru/3.4/library/ftplib.html#module-ftplib) уже давно задокументирован как устаревший в своей докстринг. Теперь он генерирует [`DeprecationWarning`](https://python-all.ru/3.4/library/exceptions.html#DeprecationWarning) и будет полностью удалён в Python 3.5.
- Незадокументированный аргумент *endtime* у [`subprocess.Popen.wait()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen.wait) не должен был быть открыт и, надеюсь, не используется; он устарел и, скорее всего, будет удалён в Python 3.5.
- Аргумент *strict* у [`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) устарел.
- Функции [`plistlib`](https://python-all.ru/3.4/library/plistlib.html#module-plistlib) [`readPlist()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.readPlist), [`writePlist()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.writePlist), [`readPlistFromBytes()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.readPlistFromBytes) и [`writePlistToBytes()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.writePlistToBytes) устарели в пользу соответствующих новых функций [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load), [`dump()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dump), [`loads()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.loads) и [`dumps()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dumps). [`Data()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.Data) устарел в пользу простого использования конструктора [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes).
- Ключ `SO` в [`sysconfig`](https://python-all.ru/3.4/library/sysconfig.html#module-sysconfig) устарел; он заменён на `EXT_SUFFIX`.
- Режим `U`, принимаемый различными функциями `open`, устарел. В Python 3 он не делает ничего полезного и должен быть заменён соответствующим использованием [`io.TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper) (при необходимости) и его аргументом *newline*.
- Аргумент *parser* у [`xml.etree.ElementTree.iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) устарел, как и аргумент *html* у [`XMLParser()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Чтобы подготовиться к удалению последнего, все аргументы `XMLParser` следует передавать по ключевым словам.

### Устаревшие возможности

- Запуск [*IDLE*](https://python-all.ru/3.4/library/idle.html#idle) с флагом `-n` (без подпроцесса) устарел. Однако эта возможность не будет удалена, пока не будет решена [issue 18823](https://python-all.ru/3.4/whatsnew/3.4.html).
- Добавление модулем site каталога «site-python» в sys.path, если он существует, устарело ([issue 19375](https://python-all.ru/3.4/whatsnew/3.4.html)).

## Удалено

### Операционные системы, поддержка которых прекращена

Поддержка следующих операционных систем удалена из исходного кода и средств сборки:

- OS/2 ([issue 16135](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Windows 2000 (изменение e52df05b496a).
- Системы Windows, где `COMSPEC` указывает на `command.com` ([issue 14470](https://python-all.ru/3.4/whatsnew/3.4.html)).
- VMS ([issue 16136](https://python-all.ru/3.4/whatsnew/3.4.html)).

### Удаление API и функций

Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:

- Не поддерживаемые каталоги `Misc/TextMate` и `Misc/vim` были удалены (см. [devguide](https://python-all.ru/3.4/devguide/index.html) для предложений по замене).
- Макрос `SO` makefile удалён (заменён макросами `SHLIB_SUFFIX` и `EXT_SUFFIX`) ([issue 16754](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Поле `PyThreadState.tick_counter` удалено; его значение не имело смысла начиная с Python 3.2, когда был введён «новый GIL» ([issue 19199](https://python-all.ru/3.4/whatsnew/3.4.html)).
- `PyLoader` и `PyPycLoader` были удалены из [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib). (Автор: Taras Lyapun в [issue 15641](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Аргумент *strict* у [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection) удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.
- Устаревшие методы геттеров и сеттеров [`urllib.request.Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request) `add_data`, `has_data`, `get_data`, `get_type`, `get_host`, `get_selector`, `set_proxy`, `get_origin_req_host` и `is_unverifiable` удалены (вместо них используйте прямой доступ к атрибутам).
- Поддержка загрузки устаревшего `TYPE_INT64` удалена из [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal). (Автор: Dan Riti в [issue 15480](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`inspect.Signature`](https://python-all.ru/3.4/library/inspect.html#inspect.Signature): теперь для позиционно-ключевых параметров требуется указывать допустимое имя.
- [`object.__format__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__format__) больше не принимает непустые строки формата; вместо этого теперь генерируется [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Использование непустой строки было устаревшим начиная с Python 3.2. Это изменение сделано для предотвращения ситуации, когда ранее работающий (но некорректный) код начинал давать сбой, если объект получал метод \_\_format\_\_, что означает, что ваш код теперь может генерировать [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если вы используете код формата `'s'` с объектами, у которых нет метода \_\_format\_\_, обрабатывающего его. См. [issue 7994](https://python-all.ru/3.4/whatsnew/3.4.html) для контекста.
- `difflib.SequenceMatcher.isbjunk()` и `difflib.SequenceMatcher.isbpopular()` были устаревшими начиная с 3.2 и теперь удалены: используйте `x in sm.bjunk` и `x in sm.bpopular`, где *sm* – это объект [`SequenceMatcher`](https://python-all.ru/3.4/library/difflib.html#difflib.SequenceMatcher) ([issue 13248](https://python-all.ru/3.4/whatsnew/3.4.html)).

### Очистка кода

- Неиспользуемый и недокументированный внутренний класс `Scanner` удалён из модуля [`pydoc`](https://python-all.ru/3.4/library/pydoc.html#module-pydoc).
- Частный и по сути неиспользуемый модуль `_gestalt` удалён вместе с частными функциями [`platform`](https://python-all.ru/3.4/library/platform.html#module-platform) `_mac_ver_lookup`, `_mac_ver_gstalt` и `_bcd2str`, которые могли вызываться только на сильно сломанных системах OS X (см. [issue 18393](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Жёстко запрограммированные копии некоторых констант [`stat`](https://python-all.ru/3.4/library/stat.html#module-stat), которые были включены в пространство имён модуля [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile), удалены.

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

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

### Изменения в поведении команды ‘python’

- В оболочке posix установка переменной окружения `PATH` в пустое значение эквивалентна её отсутствию. Однако раньше установка [`PYTHONPATH`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONPATH) в пустое значение была *не* эквивалентна её отсутствию: установка [`PYTHONPATH`](https://python-all.ru/3.4/using/cmdline.html#envvar-PYTHONPATH) в пустое значение была эквивалентна установке `.`, что приводило к путанице при попытке рассуждать по аналогии с тем, как работает `PATH`. Теперь поведение соответствует соглашению posix для `PATH`.
- Вывод \[X ссылок, Y блоков\] отладочной (`--with-pydebug`) сборки интерпретатора CPython теперь по умолчанию отключён. Его можно включить снова с помощью опции `-X showrefcount`. (Автор: Ezio Melotti, [issue 17323](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Команда python и большинство скриптов стандартной библиотеки (а также [`argparse`](https://python-all.ru/3.4/library/argparse.html#module-argparse)) теперь выводят информацию `--version` в `stdout` вместо `stderr` (список задач см. в [*Other Improvements*](https://python-all.ru/3.4/whatsnew/3.4.html#other-improvements-3-4) выше).

### Изменения в Python API

- АБС, определённые в [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc), теперь либо возбуждают соответствующее исключение, либо возвращают значение по умолчанию вместо слепого возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Это затронет только код, вызывающий [`super()`](https://python-all.ru/3.4/library/functions.html#super) и проходящий через всю цепочку до АБС. Для обратной совместимости перехватывайте как [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError), так и соответствующее исключение, если необходимо.
- Тип module теперь инициализирует атрибуты [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) и [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) значением `None` по умолчанию. Чтобы определить, были ли эти атрибуты установлены обратно-совместимым образом, используйте, например, `getattr(module, '__loader__', None) is not None`. ([issue 17115](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader) теперь безусловно устанавливает `__loader__` и `__package__` для корректной поддержки перезагрузки. Если это нежелательно, устанавливайте эти атрибуты вручную. Для управления модулями можно использовать `importlib.util.module_to_load()`.
- При перезагрузке импорт теперь безусловно сбрасывает соответствующие атрибуты (например, `__name__`, `__loader__`, `__package__`, `__file__`, `__cached__`). Обратите внимание: это восстанавливает поведение, существовавшее до версии 3.3, а именно: модуль при перезагрузке находится заново ([issue 19413](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Замороженные пакеты больше не устанавливают `__path__` в список, содержащий имя пакета; теперь они устанавливают его в пустой список. Прежнее поведение могло приводить к неправильной работе системы импорта при импорте вложенных модулей, если существовал каталог с тем же именем, что и замороженный пакет. Правильный способ определить, является ли модуль пакетом, – использовать `hasattr(module, '__path__')` ([issue 18065](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Замороженные модули больше не определяют атрибут `__file__`. Для замороженных модулей семантически некорректно устанавливать этот атрибут, поскольку они не загружаются из какого-либо явного расположения. Если необходимо знать, что модуль получен из замороженного кода, можно проверить, установлен ли `__spec__.location` модуля в `'frozen'`, является ли загрузчик подклассом [`importlib.machinery.FrozenImporter`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FrozenImporter), или, если требуется совместимость с Python 2, можно использовать `imp.is_frozen()`.
- [`py_compile.compile()`](https://python-all.ru/3.4/library/py_compile.html#py_compile.compile) теперь возбуждает [`FileExistsError`](https://python-all.ru/3.4/library/exceptions.html#FileExistsError), если путь к файлу, в который будет произведена запись, является символической ссылкой или нерегулярным файлом. Это служит предупреждением, что импорт перезапишет такие файлы обычным файлом независимо от типа пути, которым они были изначально.
- [`importlib.abc.SourceLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.get_source) больше не возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), когда загружаемый исходный код вызывает [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError) или [`UnicodeDecodeError`](https://python-all.ru/3.4/library/exceptions.html#UnicodeDecodeError). Поскольку [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) должен возбуждаться только тогда, когда исходный код не найден, хотя должен быть, было сочтено, что это чрезмерное расширение/перегрузка этого значения, когда исходный код найден, но имеет некорректную структуру. Если ранее вы перехватывали ImportError и хотите продолжать игнорировать ошибки синтаксиса или декодирования, теперь перехватывайте все три исключения.
- [`functools.update_wrapper()`](https://python-all.ru/3.4/library/functools.html#functools.update_wrapper) и [`functools.wraps()`](https://python-all.ru/3.4/library/functools.html#functools.wraps) теперь корректно устанавливают атрибут `__wrapped__` в оборачиваемую функцию, даже если у этой функции также был установлен атрибут `__wrapped__`. Это означает, что атрибуты `__wrapped__` теперь корректно связывают стек декорированных функций, а не каждый атрибут `__wrapped__` в цепочке ссылается на самую внутреннюю функцию. Библиотеки интроспекции, которые предполагали, что предыдущее поведение было намеренным, могут использовать [`inspect.unwrap()`](https://python-all.ru/3.4/library/inspect.html#inspect.unwrap) для доступа к первой функции в цепочке, у которой нет атрибута `__wrapped__`.
- [`inspect.getfullargspec()`](https://python-all.ru/3.4/library/inspect.html#inspect.getfullargspec) has been reimplemented on top of [`inspect.signature()`](https://python-all.ru/3.4/library/inspect.html#inspect.signature) and hence handles a much wider variety of callable objects than it did in the past. It is expected that additional builtin and extension module callables will gain signature metadata over the course of the Python 3.4 series. Code that assumes that [`inspect.getfullargspec()`](https://python-all.ru/3.4/library/inspect.html#inspect.getfullargspec) will fail on non-Python callables may need to be adjusted accordingly.
- [`importlib.machinery.PathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder) теперь передаёт текущий рабочий каталог объектам в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) для пустой строки. В результате [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache) никогда не содержит `''`, поэтому итерация по [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache) на основе [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) не найдёт все ключи. Атрибут `__file__` модуля при импорте в текущем рабочем каталоге теперь также будет содержать абсолютный путь, в том числе при использовании `-m` с интерпретатором (за исключением `__main__.__file__`, когда скрипт был выполнен напрямую с относительным путём) (Автор: Brett Cannon, [issue 18416](https://python-all.ru/3.4/whatsnew/3.4.html)). ([issue 18416](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Удаление аргумента *strict* у [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection) изменяет значение остальных аргументов, если они указываются позиционно, а не по ключевому слову. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы через ключевые слова.
- Строки между операторами `from __future__ import ...` теперь *всегда* возбуждают [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError). Ранее, если не было ведущей строки документации, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже ей соответствовали. ([issue 17434](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`ssl.SSLSocket.getpeercert()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.getpeercert) и [`ssl.SSLSocket.do_handshake()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.do_handshake) теперь возбуждают [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) с `ENOTCONN`, когда `SSLSocket` не подключён, вместо прежнего поведения – возбуждения [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError). Кроме того, [`getpeercert()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLSocket.getpeercert) возбудит [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), если рукопожатие ещё не выполнено.
- [`base64.b32decode()`](https://python-all.ru/3.4/library/base64.html#base64.b32decode) теперь возбуждает [`binascii.Error`](https://python-all.ru/3.4/library/binascii.html#binascii.Error), когда входная строка содержит символы, не входящие в алфавит base32, вместо [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Этот конкретный [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) был пропущен при преобразовании остальных [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). (Автор: Serhiy Storchaka, [issue 18011](https://python-all.ru/3.4/whatsnew/3.4.html).) Примечание: это изменение также было случайно применено в Python 3.3.3.
- Атрибут `file` теперь автоматически закрывается, когда создавший его экземпляр `cgi.FieldStorage` удаляется сборщиком мусора. Если вы извлекали файловый объект отдельно от экземпляра `cgi.FieldStorage` и не поддерживали существование самого экземпляра, то вам следует либо хранить весь экземпляр `cgi.FieldStorage`, либо читать содержимое файла до того, как экземпляр `cgi.FieldStorage` будет удалён сборщиком мусора.
- Вызов `read` или `write` на закрытом SSL-сокете теперь возбуждает информативное [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) вместо прежнего более загадочного [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError) ([issue 9177](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`slice.indices()`](https://python-all.ru/3.4/reference/datamodel.html#slice.indices) больше не возбуждает [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError) для огромных значений. Как следствие этого исправления, [`slice.indices()`](https://python-all.ru/3.4/reference/datamodel.html#slice.indices) теперь возбуждает [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), если передана отрицательная длина; ранее возвращались бессмысленные значения ([issue 14794](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Конструктор [`complex`](https://python-all.ru/3.4/library/functions.html#complex), в отличие от функций [`cmath`](https://python-all.ru/3.4/library/cmath.html#module-cmath), некорректно принимал значения [`float`](https://python-all.ru/3.4/library/functions.html#float), если специальный метод `__complex__` объекта возвращал такое значение. Теперь это возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). ([issue 16290](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Конструктор [`int`](https://python-all.ru/3.4/library/functions.html#int) в версиях 3.2 и 3.3 ошибочно принимал значения [`float`](https://python-all.ru/3.4/library/functions.html#float) для параметра *base*. Маловероятно, что кто-то так делал, но если да, то теперь это будет возбуждать [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) ([issue 16772](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Значения по умолчанию для аргументов, задаваемых только по ключевому слову, теперь вычисляются *после* значений по умолчанию для обычных ключевых аргументов, а не до. Будем надеяться, что никто не написал код, зависящий от предыдущего ошибочного поведения ([issue 16967](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Устаревшие состояния потоков теперь очищаются после [`fork()`](https://python-all.ru/3.4/library/os.html#os.fork). Это может привести к освобождению некоторых системных ресурсов, которые ранее некорректно сохранялись постоянно живыми (например, соединения с базой данных, хранящиеся в хранилище, локальном для потока). ([issue 17094](https://python-all.ru/3.4/whatsnew/3.4.html).)
- Имена параметров в словарях `__annotations__` теперь корректно искажаются, аналогично `__kwdefaults__`. (Автор: Yury Selivanov, [issue 20625](https://python-all.ru/3.4/whatsnew/3.4.html).)
- [`hashlib.hash.name`](https://python-all.ru/3.4/library/hashlib.html#hashlib.hash.name) теперь всегда возвращает идентификатор в нижнем регистре. Ранее некоторые встроенные хеши имели имена в верхнем регистре, но теперь, когда это формальный публичный интерфейс, именование стало единообразным ([issue 18532](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Because [`unittest.TestSuite`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite) now drops references to tests after they are run, test harnesses that re-use a [`TestSuite`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite) to re-run a set of tests may fail. Test suites should not be re-used in this fashion since it means state is retained between test runs, breaking the test isolation that [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) is designed to provide. However, if the lack of isolation is considered acceptable, the old behavior can be restored by creating a [`TestSuite`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite) subclass that defines a `_removeTestAtIndex` method that does nothing (see [`TestSuite.__iter__()`](https://python-all.ru/3.4/library/unittest.html#unittest.TestSuite.__iter__)) ([issue 11798](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) теперь использует [`argparse`](https://python-all.ru/3.4/library/argparse.html#module-argparse) для разбора командной строки. Некоторые некорректные формы команд, которые раньше работали, больше не разрешены; теоретически это не должно вызывать проблем обратной совместимости, поскольку запрещённые формы команд не имели смысла и вряд ли использовались.
- Функции [`re.split()`](https://python-all.ru/3.4/library/re.html#re.split), [`re.findall()`](https://python-all.ru/3.4/library/re.html#re.findall) и [`re.sub()`](https://python-all.ru/3.4/library/re.html#re.sub), а также методы [`group()`](https://python-all.ru/3.4/library/re.html#re.match.group) и [`groups()`](https://python-all.ru/3.4/library/re.html#re.match.groups) объектов `match` теперь всегда возвращают объект *bytes*, когда строка для сопоставления является [*bytes-like object*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object). Ранее возвращаемый тип соответствовал входному типу, поэтому, если ваш код зависел от того, что возвращаемое значение было, скажем, `bytearray`, вам потребуется изменить код.
- Функции [`audioop`](https://python-all.ru/3.4/library/audioop.html#module-audioop) теперь немедленно возбуждают ошибку, если им передаётся строковый ввод, вместо того чтобы случайным образом ошибаться позже ([issue 16685](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Новый аргумент *convert\_charrefs* у [`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) по умолчанию равен `False` для обратной совместимости, но в конечном итоге будет изменён на `True`. Рекомендуется добавить это ключевое слово с соответствующим значением во все вызовы [`HTMLParser`](https://python-all.ru/3.4/library/html.parser.html#html.parser.HTMLParser) в вашем коде ([issue 13633](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Поскольку у аргумента *digestmod* функции [`hmac.new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new) в будущем не будет значения по умолчанию, все вызовы [`hmac.new()`](https://python-all.ru/3.4/library/hmac.html#hmac.new) следует изменить, чтобы явно указывать *digestmod* ([issue 17276](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Вызов [`sysconfig.get_config_var()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_config_var) с ключом `SO` или поиск `SO` в результатах вызова [`sysconfig.get_config_vars()`](https://python-all.ru/3.4/library/sysconfig.html#sysconfig.get_config_vars) устарел. Этот ключ следует заменить на `EXT_SUFFIX` или `SHLIB_SUFFIX` в зависимости от контекста ([issue 19555](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Любые вызовы функций `open`, в которых указан `U`, следует исправить. `U` не действует в Python3 и при использовании со временем вызовет ошибку. В зависимости от функции эквивалент её старого поведения в Python2 можно получить либо с помощью аргумента *newline*, либо, если необходимо, обернув поток в [`TextIOWrapper`](https://python-all.ru/3.4/library/io.html#io.TextIOWrapper) и воспользовавшись его аргументом *newline* ([issue 15204](https://python-all.ru/3.4/whatsnew/3.4.html)).
- При использовании [*pyvenv*](https://python-all.ru/3.4/using/scripts.html#scripts-pyvenv) в скрипте, если требуется, чтобы pip *не* устанавливался, необходимо добавить `--without-pip` в команду вызова.
- Поведение по умолчанию [`json.dump()`](https://python-all.ru/3.4/library/json.html#json.dump) и [`json.dumps()`](https://python-all.ru/3.4/library/json.html#json.dumps) при указании отступа изменилось: теперь они не добавляют завершающие пробелы после запятых, разделяющих элементы в конце строк. Это будет иметь значение только в том случае, если тесты выполняют сравнение такого вывода с учётом пробельных символов ([issue 16333](https://python-all.ru/3.4/whatsnew/3.4.html)).
- [`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest) теперь ищет доктесты в строках `__doc__` модулей расширения, поэтому, если обнаружение доктестов включает модули расширения, содержащие нечто похожее на доктесты, при запуске тестов могут возникнуть ошибки, которых раньше не было ([issue 3158](https://python-all.ru/3.4/whatsnew/3.4.html)).
- Модуль [`collections.abc`](https://python-all.ru/3.4/library/collections.abc.html#module-collections.abc) был немного реорганизован в рамках улучшения запуска Python. В результате импорт [`collections`](https://python-all.ru/3.4/library/collections.html#module-collections) больше не приводит к автоматическому импорту [`collections.abc`](https://python-all.ru/3.4/library/collections.abc.html#module-collections.abc). Если программа полагалась на этот (недокументированный) неявный импорт, необходимо добавить явный `import collections.abc` ([issue 20784](https://python-all.ru/3.4/whatsnew/3.4.html)).

### Изменения в C API

- [`PyEval_EvalFrameEx()`](https://python-all.ru/3.4/c-api/veryhigh.html#c.PyEval_EvalFrameEx), [`PyObject_Repr()`](https://python-all.ru/3.4/c-api/object.html#c.PyObject_Repr) и [`PyObject_Str()`](https://python-all.ru/3.4/c-api/object.html#c.PyObject_Str), наряду с некоторыми другими внутренними C API, теперь содержат отладочное утверждение, гарантирующее, что они не используются в ситуациях, где могут молча отбросить текущее активное исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже сохранено локально с помощью [`PyErr_Fetch()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PyErr_Fetch) или намеренно заменяется другим исключением), потребуется явный вызов [`PyErr_Clear()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PyErr_Clear), чтобы не вызвать срабатывание утверждения при вызове этих операций (прямо или косвенно) и запуске на версии Python, скомпилированной с включёнными утверждениями.
- [`PyErr_SetImportError()`](https://python-all.ru/3.4/c-api/exceptions.html#c.PyErr_SetImportError) теперь устанавливает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), когда не задан его аргумент **msg**. Ранее возвращался только `NULL` без установленного исключения.
- Результат колбэка [`PyOS_ReadlineFunctionPointer`](https://python-all.ru/3.4/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) теперь должен быть строкой, выделенной с помощью [`PyMem_RawMalloc()`](https://python-all.ru/3.4/c-api/memory.html#c.PyMem_RawMalloc) или [`PyMem_RawRealloc()`](https://python-all.ru/3.4/c-api/memory.html#c.PyMem_RawRealloc), или *NULL* в случае ошибки, вместо строки, выделенной через [`PyMem_Malloc()`](https://python-all.ru/3.4/c-api/memory.html#c.PyMem_Malloc) или [`PyMem_Realloc()`](https://python-all.ru/3.4/c-api/memory.html#c.PyMem_Realloc) ([issue 16742](https://python-all.ru/3.4/whatsnew/3.4.html)).
- `PyThread_set_key_value()` теперь всегда устанавливает значение. В Python 3.3 эта функция ничего не делала, если ключ уже существовал (если текущее значение было не-NULL указателем).
- Поле `f_tstate` (состояние потока) структуры `PyFrameObject` было удалено для исправления ошибки: обоснование см. в [issue 14432](https://python-all.ru/3.4/whatsnew/3.4.html).

## Изменено в версии 3.4.3

### PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотеки

[`http.client`](https://python-all.ru/3.4/library/http.client.html#module-http.client) и модули, использующие его, такие как [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request) и [`xmlrpc.client`](https://python-all.ru/3.4/library/xmlrpc.client.html#module-xmlrpc.client), теперь будут проверять, что сервер предоставляет сертификат, подписанный центром сертификации (CA) из системного хранилища доверенных сертификатов, и что имя хоста в сертификате совпадает с запрашиваемым именем хоста. Это значительно повышает безопасность многих приложений.

Для приложений, которым требуется старое поведение, можно передать альтернативный контекст:

```python
import urllib.request
import ssl

# Это отключает все проверки
context = ssl._create_unverified_context()

# Это позволяет использовать конкретный сертификат для хоста, которому не нужно
# находиться в хранилище доверенных сертификатов
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)
```
